我需要将一个矩阵A
与 n 个矩阵相乘,然后取回n
矩阵。例如,将 2x2 矩阵与堆叠为 2x2x3 Matlab 数组的 3 个 2x2 矩阵相乘。bsxfun
是我通常用于这种情况的方法,但它仅适用于元素操作。我可以做类似的事情:
blkdiag(a, a, a) * blkdiag(b(:,:,1), b(:,:,2), b(:,:,3))
但我需要一个任意的解决方案n
- ?
我需要将一个矩阵A
与 n 个矩阵相乘,然后取回n
矩阵。例如,将 2x2 矩阵与堆叠为 2x2x3 Matlab 数组的 3 个 2x2 矩阵相乘。bsxfun
是我通常用于这种情况的方法,但它仅适用于元素操作。我可以做类似的事情:
blkdiag(a, a, a) * blkdiag(b(:,:,1), b(:,:,2), b(:,:,3))
但我需要一个任意的解决方案n
- ?
您可以reshape
堆叠矩阵。假设您有k
逐个k
矩阵a
和一堆m
k
逐个k
矩阵,sb
并且您想要 的乘积a*sb(:,:,ii)
。ii = 1..m
那么你所需要的就是
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
您的解决方案可以使用从元胞数组获得的逗号分隔列表调整为任意大小:
[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
对于要在其上执行矩阵乘法的大量矩阵和/或向量,速度可能开始成为问题。为避免重新发明轮子,您可以简单地编译并使用以下快速 MEX 代码: MTIMESX - Mathworks。根据经验,MATLAB 在执行大量看起来应该是可向量化的操作的 for 循环时通常效率很低。我想不出一种简单的方法来概括 Shai 对此案的回答。