2016-12-07 51 views
-2

我剛剛在MATLAB中使用GPU,我有4d陣列,我們稱之爲A,其中size(A) = [100, 200, 3, 3]。我想要做的事,如:如何找到4d GPU陣列的行列式

for i = 1:size(A, 1) 
    for j = 1:size(A, 2) 
     B(i, j) = det(squeeze(A(i,j,:,:))); 
    end 
end 

如果A已經是一個gpuArray,我怎麼能實現這個無需使用for循環?我已經嘗試了pagefun和arrayfun,但他們都似乎沒有工作。

謝謝!

+0

您沒有選擇,只能循環。 'det'只適用於正方形的2D矩陣。 – rayryeng

回答

0

通過明確定義行列式函數來解決它。也就是說

function DET = my3x3det(a11, a12, a13, a21, a22, a23, a31, a32, a33) 
    DET = a11.*(a22.*a33 - a23.*a32) - ... 
      a12.*(a21.*a33 - a23.*a31) + ... 
      a13.*(a21.*a32 - a22.*a31); 
end 

然後代替for循環,可以得到B使用arrayfun

B = arrayfun(@my3x3det, A(:,:,1,1), A(:,:,1,2), A(:,:,1,3), ... 
         A(:,:,2,1), A(:,:,2,2), A(:,:,2,3), ... 
         A(:,:,3,1), A(:,:,3,2), A(:,:,3,3)); 

能夠統計出比在一個for循環解決同一件事更快。這有點麻煩,但它適用於這種情況,特別是需要3x3行列式。