繁体   English   中英

在MatLab中将矩阵的列与3d矩阵的2d矩阵切片相乘

[英]Multiply columns of a matrix with 2d matrix slices of a 3d matrix in MatLab

基本上,我想执行以下计算:

    G is m x n x k
    S is n x k

    Answer=zeros(m,d)
    for Index=1:k
        Answer(:,Index)=G(:,:,Index)*S(:,Index)
    end

因此,答案是一个矩阵,其列是将3d矩阵的每一层与另一个矩阵的列相乘的结果。

这似乎是一种简单的操作类型,我希望找出在Matlab中是否存在本机或矢量化(或至少>>更快)的方式来执行此类计算。 谢谢。

尝试使用Matlab文件交换中的mtimesx 这是迄今为止我发现的最好的(快速/高效)工具来进行这种n维数组乘法,因为它使用了mex 你也可以使用bsxfun ,但我的Matlab-fu还不够用于此类事情。

你有mxnxkmxk ,想要生成一个nxk

mtimesx将输入乘以ixjxkjxrxk来生成ixrxk

要将问题置于mtimesx形式,让Gmxnxk ,并将S展开为nx 1 xk 然后mtimesx(G,S)将是mx 1 xk ,然后可以将其展平为mxk

m=3; 
n=4; 
k=2;
G=rand(m,n,k);
S=rand(n,k);

% reshape S
S2=reshape(S,n,1,k);

% do multiplication and flatten mx1xk to mxk
Ans_mtimesx = reshape(mtimesx(G,S2),m,k)

% try loop method to compare
Answer=zeros(m,k);
for Index=1:k
    Answer(:,Index)=G(:,:,Index)*S(:,Index);
end

% compare
norm(Ans_mtimesx-Answer)
% returns 0.

所以,如果你想要一个单行,你可以这样做:

Ans = reshape(mtimesx(G,reshape(S,n,1,k)),m,k)

顺便说一下,如果你在Matlab新闻阅读器论坛上发布你的问题,那么就会有很多大师为你提供比我更优雅或更高效的答案!

这是bsxfun()版本。 如果A是m-by-n矩阵而x是n-by-1矢量,那么A * x可以被计算为

sum(bsxfun(@times, A, x'), 2)

操作置换(S,[3 1 2])将采用S的列并将它们沿第3维分布为行。 [3 1 2]是S的维度的排列。

因此sum(bsxfun(@ times,G,permute(S,[3 1 2])),2)实现了答案,但将结果留在第3维。 为了获得表单,您需要另一个permute。

permute(sum(bsxfun(@times, G, permute(S, [3 1 2])), 2), [1 3 2])

您可以做的一件事是将您的3d矩阵表示为2d块对角矩阵,每个层都是对角线块。 在这种情况下,2d矩阵应表示为包含堆叠列的向量。 如果矩阵很大,则将其声明为稀疏矩阵。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM