insert singelton dimension for broadcasting
15 次查看(过去 30 天)
显示 更早的评论
Let A be of size (M x N x P) and B be of size (M x N x K). What's the most conveniant way to broadcast C = A.*B such that C is of size (M x N x P x K) ?
In python it's
C = A[:,:,np.newaxis,:]*B[:,:,:,np.newaxis]
I can get it working by using reshape so that A is of (M x N x 1 X P), but it's a bit annoying because
0 个评论
回答(3 个)
Catalytic
2023-3-23
You could also create your own specialized function that does it -
[M,N,P,K]=deal(2,3,4,5);
A=rand(M,N,P);
B=rand(M,N,K);
C=tensortimes(A,B);
size(C)
function C=tensortimes(A,B)
[m,n,p]=size(A);
[mm,nn,k]=size(B);
assert(mm==m && nn==n, 'First 2 dimensions don''t match');
C=A.*reshape(B,m,n,1,k);
end
0 个评论
Catalytic
2023-3-23
编辑:Catalytic
2023-3-23
Inserting dimensions seems like as much a pain as reshape, but if you must do it that way, here's an approach closer to the Python style -
[M,N,P,K]=deal(2,3,4,5);
A=rand(M,N,P);
B=rand(M,N,K);
C=A.*newdim(B,3); size(C)
function A=newdim(A,n)
%insert a singleton dimension at one or more locations in size(A),
%designated by vector n.
n0=ndims(A);
n=unique(n);
N=max(n0+numel(n),max(n));
dims=nan(1,N);
dims(n)=1;
nanlocs=find(isnan(dims));
dims(nanlocs(1:n0))=size(A);
dims(isnan(dims))=1;
A=reshape(A,dims);
end
4 个评论
Catalytic
2023-3-27
If MATLAB by default had the newdim.m functionality you proposed, that'd be I think very intuitive
This seems to imply that the newdim function does what you want. If so, I wonder if you'd consider clicking Accept. From the standpoint of your convenience, it shouldn't matter whether the function is provided by MathWorks or by me.
Catalytic
2023-3-23
编辑:Catalytic
2023-3-23
You didn't complete your description of why reshape() is "a bit annoying". If you're going to be doing the same operation repeatedly, this can cut down on the syntax somewhat (by reusing I) -
[M,N,P,K]=deal(2,3,4,5);
A=rand(M,N,P);
B=rand(M,N,K);
I=reshape(1:M*N*K, M,N,1,K);
C=A.*B(I);
size(C)
5 个评论
DGM
2023-3-29
编辑:DGM
2023-3-29
You are correct. What's frustrating to automation is that despite MATLAB arrays implicitly having infinite trailing singleton dimensions, you can't borrow arbitrarily from them in a call to permute(). The permutation vector must contain no gaps or repetition, so you can effectively only borrow from the dims(X)+1 dimension.
Still, it's important to the novice to get familiar with both reshape() and permute(), especially if they're starting to learn how to use one without realizing the power of using both.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrix Indexing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!