类似BSXfun的矩阵产品



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

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

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

您可以reshape堆叠矩阵。假设您有 kk 矩阵a和一堆 m k x 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 在对大量操作执行循环时通常效率很低,这些操作看起来应该是可矢量化的;我想不出一种直截了当的方法来概括Shai对这个案件的回答。

相关内容

  • 没有找到相关文章

最新更新