5

我需要将一个矩阵A与 n 个矩阵相乘,然后取回n矩阵。例如,将 2x2 矩阵与堆叠为 2x2x3 Matlab 数组的 3 个 2x2 矩阵相乘。bsxfun是我通常用于这种情况的方法,但它仅适用于元素操作。我可以做类似的事情:

blkdiag(a, a, a) * blkdiag(b(:,:,1), b(:,:,2), b(:,:,3))

但我需要一个任意的解决方案n- ?

4

3 回答 3

7

您可以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
于 2014-01-13T12:30:08.843 回答
3

您的解决方案可以使用从元胞数组获得的逗号分隔列表调整为任意大小:

[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
于 2014-01-13T11:46:42.620 回答
1

对于要在其上执行矩阵乘法的大量矩阵和/或向量,速度可能开始成为问题。为避免重新发明轮子,您可以简单地编译并使用以下快速 MEX 代码: MTIMESX - Mathworks。根据经验,MATLAB 在执行大量看起来应该是可向量化的操作的 for 循环时通常效率很低。我想不出一种简单的方法来概括 Shai 对此案的回答。

于 2020-05-11T01:55:02.260 回答