Arrayfun与GPU处理连接的问题。 MATLAB

时间:2015-05-20 02:09:58

标签: matlab concatenation gpu

我在使用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

1 个答案:

答案 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。