我是在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,但它们似乎都不起作用。
谢谢!
答案 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
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行列式的情况。