簡體   English   中英

兩個數組的對應2d切片的相乘和數組切片的求逆

[英]Multiplication of corresponding 2d slices of two arrays and inversion of array slices

我有兩個數組AB ,它們的尺寸相同,為1000 x 3 x 20 x 20 我想生成尺寸為3 x 3 x 20 x 20的第三個數組C ,這將是AB對應切片的矩陣乘法的結果,即C(:,:,i,j) = A(:,:,i,j)'*B(:,:,i,j) 然后,我需要通過反轉對應的3 x 3矩陣將數組C轉換為新數組D ,即D(:,:,i,j) = inv(C(:,:,i,j)) 同樣,很清楚如何使用循環執行此操作。 有沒有辦法讓awoid循環播放400項目?

編輯:比較不同解決方案性能的基准代碼將是-

%// Inputs
n1 = 50;
n2 = 200;
A = rand(n1,3,n2,n2);
B = rand(n1,3,n2,n2);

%// A. CPU loopy code
tic
C = zeros(3,3,n2,n2);
for ii = 1:n2
    for jj = 1:n2
        C(:,:,ii,jj) = A(:,:,ii,jj)'*B(:,:,ii,jj); %//'
    end
end
toc

%// B. Vectorized code (using squeeze)
tic
C1 = squeeze(sum(bsxfun(@times,permute(A,[2 1 5 3 4]),permute(B,[5 1 2 3 4])),2));
toc

%// C. Vectorized code (avoiding squeeze)
tic
C2 = sum(bsxfun(@times,permute(A,[2 5 3 4 1]),permute(B,[5 2 3 4 1])),5);
toc

%// D. GPU vectorized code
tic
A = gpuArray(A);
B = gpuArray(B);
C3 = sum(bsxfun(@times,permute(A,[2 5 3 4 1]),permute(B,[5 2 3 4 1])),5);
C3 = gather(C3);
toc

運行時結果-

Elapsed time is 0.287511 seconds.
Elapsed time is 0.250663 seconds.
Elapsed time is 0.337628 seconds.
Elapsed time is 1.259207 seconds.

%// Part - 1
C = sum(bsxfun(@times,permute(A,[2 5 3 4 1]),permute(B,[5 2 3 4 1])),5);

%// Part - 2: Use MATLAB file-exchange tool multinv
D = multinv(C);

multinv的功能代碼在multinv可用並且聲稱效率很高。

對於第一部分,您還可以嘗試以下操作-

C = squeeze(sum(bsxfun(@times,permute(A,[2 1 5 3 4]),permute(B,[5 1 2 3 4])),2));

這似乎是在重新排列元素,沒有上面代碼中提到的那樣“破壞性”,但是缺點是需要squeeze ,這可能會使它放慢一點。 我會留給您,也鼓勵您進行基准測試並選擇更好的產品。


為什么選擇bsxfun + GPU

我增加了循環限制,因為這可能是對循環代碼和矢量化代碼之間的真實測試。 因此,這是第1部分的修改代碼-

%// Inputs
n1 = 50;
n2 = 200;
A = rand(n1,3,n2,n2);
B = rand(n1,3,n2,n2);

%// A. CPU loopy code
tic
C = zeros(3,3,n2,n2);
for ii = 1:n2
    for jj = 1:n2
        C(:,:,ii,jj) = A(:,:,ii,jj)'*B(:,:,ii,jj); %//'
    end
end
toc

%// B. GPU vectorized code
tic
A = gpuArray(A);
B = gpuArray(B);
C1 = sum(bsxfun(@times,permute(A,[2 5 3 4 1]),permute(B,[5 2 3 4 1])),5);
C1 = gather(C1);
toc

我的系統的運行時結果是-

Elapsed time is 0.310056 seconds.
Elapsed time is 0.172499 seconds.

所以你看!

暫無
暫無

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

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