Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrayfun中与GPU处理连接的问题。MATLAB_Matlab_Concatenation_Gpu - Fatal编程技术网

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

Arrayfun中与GPU处理连接的问题。MATLAB,matlab,concatenation,gpu,Matlab,Concatenation,Gpu,我在使用GPU处理MATLAB中的arrayfun时遇到问题。 我已将我的情况简化如下 我有4个大矩阵(视频数据为(x,y,t))。我将在这个例子中使用random 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)等等;并执行最小二乘法

我在使用GPU处理MATLAB中的arrayfun时遇到问题。 我已将我的情况简化如下

我有4个大矩阵(视频数据为(x,y,t))。我将在这个例子中使用random

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)等等;并执行最小二乘法计算(值为示例)

对于我的数据来说,作为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对leastsquares有GPU支持?)

我的理解是,这应该分别考虑4个矩阵中的每个元素并执行计算

我得到的错误是: 使用gpuArray/arrayfun时出错 不支持数组串联。第行出错: 四,

第4行是:

X = [10 10 ; 20 20 ; 30 30 ; 40 40]\[A;B;C;D];
很明显,问题在于我将矩阵连接到arrayfun中。我已经考虑过我的选择,似乎看不到解决办法。在调用该函数之前,我考虑了将矩阵连接起来,但是array fun将尝试在每个元素上执行该函数,而这些元素现在不会对齐。我考虑过可能是手动求解最小二乘,而不是使用\,但是如果不先检查是否错过了一个更简单的解决方案,我就不敢尝试

我还意识到输出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

在这种情况下,您可以简单地将整个问题重新表述为对
\
的多个右侧调用,如下所示:

%# 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上工作。

我不太清楚您在这里想要实现什么-您能展示一个可用的CPU版本的代码吗?您原来的行计算
X
即使对于CPU数据也不起作用……您可以尝试创建一个新的矩阵
E
,它由
size(E)=size([a;B;C;D])组成。
?此外,`\`操作符还做很多事情。其中一些是迭代的,不适合GPU计算,所以很可能你不会获得任何优势(即使有可能在GPU中使用“\”,eich我不确定)@Edric谢谢你的回复。你是对的,它不太适合CPU。我做了一些更改,并添加了工作的CPU代码。当我转换到GPU时,我也会遇到同样的问题。“不支持数组连接。”所以我想我的问题可以总结为:在arrayfun GPU处理中有没有连接的方法?还是有办法解决呢?@Ander Biguri谢谢你的建议。你的意思是在函数中创建矩阵吗?我想我做不到。我尝试了N=0(大小(4,1));不支持零(以及其他可能创建的矩阵)。此外,N(1)=1;N(2)=2…等等。但是数组索引也不受支持。如果你想在函数外创建矩阵,那么我的问题是arrayfun将尝试在每个元素上执行操作。因此,使用单个矩阵是行不通的。也许哪种方法可以只在一个维度上执行arrayfun?我想这可能是一种绕过它的方法,并传递4x1000矩阵输入。我将继续播放。非常感谢@Edric。我尝试以这种方式应用\函数,使其按照您所示的方式执行,但一定是在某个地方出错了。使用Arrayfun似乎是一个问题,因为需要在函数中串联。我现在遇到了内存问题,因为我的a、B、C、D矩阵是280x260x15000每一个。但我会做更多的研究,以不改变这个问题的主题。再次感谢。乔丹
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
%# 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));