"Not enough input arguments" 尝试使用 GPU 实现简单的 FOR 循环时

"Not enough input arguments" when trying to implement simple FOR loop using GPU

我正在尝试计算均匀分布在 R^(n^2) 中的点(nxn 矩阵)仅具有负实部特征值的概率,但我不断收到以下错误:

Not enough input arguments.

Error in probability_n (line 4)
for i = 1:num_pts

这是我的代码:

N = 10^2;
num_pts = 10^4;
n = 2;
n = n*ones(N,1,'gpuArray');

k = arrayfun(probability_n,n,num_pts);

调用的函数是

function k = probability_n(n,num_pts)

    k = 0;
    for i = 1:num_pts
        R = reshape(randsphere(1,n^2,1),n,n);
        if all(real(eig(R))<0)
            k = k+1;
        end
    end

end

function P = randsphere(m,n,r)

    P = randn(m,n);
    s2 = sum(P.^2,2);
    P = P.*repmat(r*(gammainc(s2/2,n/2).^(1/n))./sqrt(s2),1,n);

end

为什么会这样?我怀疑这是一个非常简单的语法错误,因为这是我第一次尝试将我的 GPU 用于 MATLAB。 GPU 是 Nvidia GeForce GTX 580。谢谢。

一般来说,如果您遇到问题,最好在 vanilla MATLAB(没有 GPU 或并行处理)中进行测试,看看问题是特定于 GPU 或并行处理,还是其他问题。如果这样做,您会发现您的代码仍然无法正常工作。

这是因为您需要将 probability_nfunction handle 传递给 arrayfun,正如您所写的那样,probability_n 是在没有输入参数的情况下隐式调用的(您不需要 () 来调用函数)。当 MATLAB 尝试从 probability_n 中访问 num_pts 但未提供时,您会收到错误消息。

k = arrayfun(@probability_n, n, num_pts);

请注意,仅当 arrayfun 的第一个输入是 gpuarray 对象时,将标量 num_pts 作为第三个输入传递才有效。否则,您需要创建一个匿名函数,将 num_pts 传递给 probability_n