[英]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還不夠用於此類事情。
你有mxnxk
和mxk
,想要生成一個nxk
。
mtimesx
將輸入乘以ixjxk
和jxrxk
來生成ixrxk
。
要將問題置於mtimesx
形式,讓G
為mxnxk
,並將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.