簡體   English   中英

在matlab中矢量化成對kronecker產品

[英]Vectorize the pairwise kronecker product in matlab

假設有兩個相同大小的矩陣,我想計算其列式kronecker積的總和。 由於有時柱尺寸非常大,因此速度可能非常慢。 因此,無論如何有向量化這個函數或任何函數可能有助於降低matlab的復雜性? 提前致謝。

下面提供了帶有for循環的相應matlab代碼, d的答案是感興趣的輸出:

A = rand(3,7);
B = rand(3,7);
d = zeros(size(A,1)*size(B,1),1);
for i=1:size(A,2)
    d = d + kron(A(:,i),B(:,i));
end

使用Daniels給出的Kronecker產品的重寫答案

e=zeros(size(B,1),size(A,1));
for i=1:size(A,2)
    e = e + B(:,i)*A(:,i).';
end
e=reshape(e,[],1);

我們這么說

C = A'

因此

for i=1:m
    e = e + B(:,i)*C(i,:);
end

這是矩陣產品的定義

B*C.

總之,該問題因此可以通過簡單的矩陣產品來解決

d = reshape(B*A',[],1);

兩個向量的kronecker乘積只是兩個向量的矩陣乘法的重新形成結果:

e=zeros(size(B,1),size(A,1));
for i=1:size(A,2)
    e = e + B(:,i)*A(:,i).';
end
e=reshape(e,[],1);

現在知道它只是一個產品的總和,它可以使用bsxfun

f=reshape(sum(bsxfun(@times,permute(B,[1,3,2]),permute(A,[3,1,2])),3),[],1);

根據輸入的不同,bsxfun-sulution比矩陣乘法稍快,但是內存消耗很高。 bsxfun-solution使用O(size(A,1)*size(B,1)*size(B,2))而for循環僅使用O(size(A,1)*size(B,1))除了輸入參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM