Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
欺骗matlab使其认为gpuArray是标量的_Matlab - Fatal编程技术网

欺骗matlab使其认为gpuArray是标量的

欺骗matlab使其认为gpuArray是标量的,matlab,Matlab,我想将以下功能应用于每个元素: function result = f(a, b, bs) % Simplified code result = a for i=0:bs result = dosomething(result, b(i)) end end % Use arrayfun(@result, gpuArray(A), gpuArray(B), size(B)); 是否有一种方法可以“欺骗”MATLAB,使其认为b是标量,以便传递给函

我想将以下功能应用于每个元素:

function result = f(a, b, bs)
    % Simplified code
    result = a
    for i=0:bs
        result = dosomething(result, b(i))
    end
end

% Use
arrayfun(@result, gpuArray(A), gpuArray(B), size(B));

是否有一种方法可以“欺骗”MATLAB,使其认为
b
是标量,以便传递给函数?

我不完全确定您想做什么,但我怀疑您希望在每次调用
结果时将整个数组b传递给函数。实现这一点的最佳方法是使用类似这样的匿名函数(未经测试的代码):

这应该做的是使用完整的
B
数组创建一个只接受一个参数(
中的
a\u),并调用
result
(实际上是函数头中的
f
),而不管
中的
a\u的值是多少。
因此,在
arrayfun
的每次迭代中,
结果将仅使用
A
的一个片段调用,而
B
的整个片段调用

编写上述代码的更明确的语法方式如下:

my_anon_fun = @(a_in) result(a_in, gpuArray(B), size(B));
arrayfun( my_anon_fun , gpuArray(A) );

免责声明:代码未经测试,我对使用
gpuArray
的代码几乎没有经验,因此这可能不适用。

不幸的是,目前无法做到这一点,原因有两个:首先,gpuArray的ARRAYFUN实现始终坚持输入要么是标量,要么都是相同大小的。其次,gpuArray ARRAYFUN主体当前不支持引用外部作用域变量的索引或匿名函数。

唯一的方法是使用
bsxfun
函数:

C = bsxfun(f, A, B') % A is column vector
多少相当于

C(i,j) = f(A(i,1), B(j,1))
其他有用的功能是
repmat


然后矩阵和向量序列被JITted,因此实际上没有空间惩罚(由nvidia smi检查)。

您能更具体一点吗?对不起,我不太清楚您想要实现什么。@Acorbe:我有几个向量(比如
A1
A2
A3
,…
B1
B2,B3
,…)。我需要创建向量
AR
,其中
AR(I)
是涉及
A1(I)
A2(I)
A3(I)
。。。在
B1
B2
B3
,…因此,你需要一种高阶的类似张量的运算?基本上,抽象地说,你需要一个序张量
n+1
在序张量
n
的运算之外。这是对的吗?作为一个例子,我需要计算AR(I)=和(B1+B2+A1(I)+A2(I))
(关系不是线性的,所以不是那么简单),我会尽可能多地使用
bsxfun
。考虑一下,不起作用-这是我试过的第一件事。抱怨匿名函数无法从工作区访问变量。
C(i,j) = f(A(i,1), B(j,1))