簡體   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