2016-12-07 7 views
-2

私はMATLABでGPUを使うのが初めてです.4D配列を持っています。それをAと呼びましょう。ここではsize(A) = [100, 200, 3, 3]です。 Aはすでにどのように私は、forループを使用せずにこれを実装することができgpuArray、ある場合4d GPUアレイの行列式を見つけるには

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

:私のような何かをしたいですか?私は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は、forループで同じものを解くよりも速くなるように動作し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)); 

を使用して得ることができます。少し面倒ですが、具体的には3x3行列式が必要なこのケースでは機能します。

関連する問題