0

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

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是标量以传递给函数?

4

3 回答 3

1

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

于 2012-10-29T11:29:38.820 回答
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)。

于 2012-10-31T14:17:28.073 回答
0

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

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

这应该做的是创建一个只接受一个参数 ( ) 的匿名函数a_in,并使用完整的数组调用result(实际上是f在你的函数头中),B而不管a_in. 因此,在 的每次迭代中arrayfunresult将只使用 的一个切片A,但使用 的整个切片来调用B

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

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

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

于 2012-10-28T23:24:07.067 回答