如何找到4d GPU阵列的决定因素

时间:2016-12-07 10:46:31

标签: matlab

我是在MATLAB中使用GPU的新手,我有4d阵列,让我们称之为A,其中size(A) = [100, 200, 3, 3]。我想做点什么:

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,但它们似乎都不起作用。

谢谢!

1 个答案:

答案 0 :(得分:1)

通过明确定义行列式函数来解决它。那是

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

然后使用B

取代for-loop,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行列式的情况。