欺骗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))