欺骗matlab进入思考gpuArray是标量

时间:2012-10-28 22:54:15

标签: 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标量为传递函数的目的?

3 个答案:

答案 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的代码几乎没有经验,因此可能不适用。