bsxfun-like用于矩阵产品

时间:2014-01-13 10:20:48

标签: matlab matrix-multiplication bsxfun

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

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

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

3 个答案:

答案 0 :(得分:7)

您可以reshape堆叠的矩阵。假设您有k - by - k矩阵a和一堆m k - by - 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

答案 1 :(得分:3)

使用从单元格数组中获取的comma-saparated lists,您的解决方案可以适应任意大小:

[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{:});

然后,您可以使用this answer将块堆叠在3D阵列上,并仅保留相关的块。

但在这种情况下,一个好的旧循环可能更快:

C = NaN(size(B));
for nn = 1:n
    C(:,:,nn) = A * B(:,:,nn);
end

答案 2 :(得分:1)

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