[英]Multiplication of corresponding 2d slices of two arrays and inversion of array slices
我有兩個數組A
和B
,它們的尺寸相同,為1000 x 3 x 20 x 20
。 我想生成尺寸為3 x 3 x 20 x 20
的第三個數組C
,這將是A
和B
對應切片的矩陣乘法的結果,即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.