我有以下功能,我想对每个元素应用:
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
标量为传递函数的目的?
答案 0 :(得分:1)
不幸的是,由于两个原因,目前无法做到这一点:首先,gpuArrays的ARRAYFUN实现始终坚持输入标量或全部相同的大小。其次,gpuArray ARRAYFUN主体目前不支持引用外部作用域变量的索引或匿名函数。
答案 1 :(得分:1)
唯一的方法是使用bsxfun
函数:
C = bsxfun(f, A, B') % A is column vector
或多或少等同于
C(i,j) = f(A(i,1), B(j,1))
其他有用的功能是repmat
。
然后一系列矩阵和向量被JIT,因此实际上没有O(MN)
空间惩罚(由nvidia-smi
检查)。
答案 2 :(得分:0)
我不完全确定你想做什么,但我怀疑你希望在每次调用result
时将整个数组B传递给函数。实现这一目标的最佳方法是使用匿名函数(未经测试的代码):
arrayfun( @(a_in) result(a_in, gpuArray(B), size(B)), gpuArray(A) );
这应该做的是制作anonymous function只需要一个参数(a_in
),然后调用result
(函数标题中实际为f
),完整的B
数组,无论a_in
的值如何。
因此,在arrayfun
的每次迭代中,只使用result
的一个切片调用A
,但整个B
。
编写上述代码的语法更明确的方法如下:
my_anon_fun = @(a_in) result(a_in, gpuArray(B), size(B));
arrayfun( my_anon_fun , gpuArray(A) );
免责声明:代码未经测试,我对使用gpuArray
的代码几乎没有经验,因此可能不适用。