我在使用GPU处理的MATLAB中使用arrayfun时遇到问题。 我简化了下面的情况。
我有4个大矩阵(视频数据为(x,y,t))。我会使用随机的例子。
A = gpuArray(rand(10,10,100));
B = gpuArray(rand(10,10,100));
C = gpuArray(rand(10,10,100));
D = gpuArray(rand(10,10,100));
我希望得到每个矩阵的每个像素;(1,1,1)然后(2,1,1)等;并执行最小二乘计算(值是示例)
X = [10 10 ; 20 20 ; 30 30 ; 40 40]\[A;B;C;D];
将此作为for循环执行对我的数据来说需要太长时间。由于我想单独对每个元素执行一个函数,我认为使用GPU将是最佳选择。
为此,我创建了函数
function [x] = GPUTestFun (A,B,C,D)
X = [10 10 ; 20 20 ; 30 30 ; 40 40]\[A;B;C;D];
end
然后我用arrayfun调用(我不认为matlab有GPU支持最小方块?)
[x] = arrayfun(@GPUTestFun,[A;B;C;D]);
我的理解是,这应该分别取4个基质的每个元素并进行计算。
我得到的错误: 使用gpuArray / arrayfun时出错 不支持数组连接。行错误: 4。
第4行:
X = [10 10 ; 20 20 ; 30 30 ; 40 40]\[A;B;C;D];
很明显,问题是我在arrayfun中连接矩阵。我已经考虑过我的选择是什么,似乎无法看到解决方案。我在调用函数之前考虑连接矩阵,但是数组乐趣将尝试在每个元素上执行函数,现在它们不会排列。我认为可能手动解决最小二乘而不是使用\,但是如果不先检查我是否错过了一个更简单的解决方案,我就会犹豫不决。
我也意识到输出X可能需要调整,因为单个计算产生2个输出,所以可能需要将它们分开,所以我的输出与我的输入大小相同。但这不是当前的问题。
非常感谢任何帮助。
由于 约旦
编辑:工作CPU代码:
A = (rand(10,10,100));
B = (rand(10,10,100));
C = (rand(10,10,100));
D = (rand(10,10,100));
[X1,X2] = arrayfun(@GPUTestFun,A,B,C,D);
功能:
function [X1,X2] = GPUTestFun (A,B,C,D)
[X] = [10 11 ; 20 8 ; 30 30 ; 40 30]\[A;B;C;D];
X1 = X(1);
X2 = X(2);
end
答案 0 :(得分:3)
在这种情况下,您可以简单地将整个问题重新整理为\
的多右手边调用,如下所示:
%# with A,B,C,D defined as per question
AA = [10 11 ; 20 8 ; 30 30 ; 40 30];
x = [A(:)'; B(:)'; C(:)'; D(:)'];
x1x2 = AA \ x;
X1 = reshape(x1x2(1,:), size(A));
X2 = reshape(x1x2(2,:), size(A));
这适用于GPU。