2016-12-07 2 views
-2

Я новичок в использовании GPU в MATLAB, у меня есть 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, как я могу осуществить это без использования для контуров? Я пробовал как 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 

Тогда вместо для цикла, могут быть получены с использованием Barrayfun

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.

Смежные вопросы