我需要用n个矩阵乘一个矩阵A,然后得到n矩阵。例如,将2x2矩阵与叠加为2x2x3 Matlab数组的3个2x2矩阵相乘。bsxfun是我在这种情况下通常使用的,但它只适用于按元素划分的操作。我可以做这样的事情:
blkdiag(a, a, a) * blkdiag(b(:,:,1), b(:,:,2), b(:,:,3))但是我需要一个任意的n的解决方案-?
发布于 2014-01-13 12:30:08
你可以reshape的堆叠矩阵。假设您有一个kby-k矩阵a和一个m k-by-k矩阵sb,并且您想要ii = 1..m的产品a*sb(:,:,ii)。你所需要的就是
sza = size(a);
b = reshape( b, sza(2), [] ); % concatenate all matrices aloong the second dim
res = a * b;
res = reshape( res, sza(1), [], size(sb,3) ); % stack back to 3d发布于 2014-01-13 11:46:42
您的解决方案可以使用从单元格数组获得的逗号分隔列表来适应任意大小:
[k m n] = size(B);
Acell = mat2cell(repmat(A,[1 1 n]),k,m,ones(1,n));
Bcell = mat2cell(B,k,m,ones(1,n));
blkdiag(Acell{:}) * blkdiag(Bcell{:});然后,您可以使用这个答案将这些块堆叠在3D数组上,并且只保留相关的块。
但在这种情况下,一个好的旧循环可能更快:
C = NaN(size(B));
for nn = 1:n
C(:,:,nn) = A * B(:,:,nn);
end发布于 2020-05-11 01:55:02
对于要执行矩阵乘法的大量矩阵和/或向量,速度可能开始成为一个问题。为了避免重新发明轮子,您可以简单地编译并使用以下快速MEX代码:MTIMESX - Mathworks。根据经验,MATLAB在对大量操作执行循环时效率很低,而这些操作看起来应该是可向量化的;我想不出一种简单的方法来概括Shai对这种情况的回答。
https://stackoverflow.com/questions/21088832
复制相似问题