"没有足够的输入参数"当试图使用GPU实现简单的FOR循环时

时间:2017-01-08 02:36:44

标签: matlab 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.谢谢。

1 个答案:

答案 0 :(得分:2)

一般情况下,如果您遇到问题以查看问题是否特定于GPU或并行处理或是否有问题,最好在vanilla MATLAB(无GPU或并行处理)中进行测试其他。如果你这样做,你会发现你的代码仍然无效。

这是因为您需要将probability_n arrayfun传递给probability_n,正如您所写的那样,()被隐式调用而没有输入参数(您不需要#39; t需要num_pts来调用一个函数。当您在probability_n内尝试访问k = arrayfun(@probability_n, n, num_pts); 并且尚未提供时,您会收到错误。

num_pts

请注意,将标量arrayfun作为第三个输入传递仅在gpuarray的第一个输入为num_pts对象时有效。否则,您将要创建一个将probability_n传递给DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(OpenBoard.class); DynamicQuery categoryQuery = DynamicQueryFactoryUtil.forClass(CategoryTypes.class); User user=UserLocalServiceUtil.getUser(PortalUtil.getUserId(request)); List<CategoryTypes> category_list= null; categoryQuery.add(RestrictionsFactoryUtil.eq("categoryTarget",String.valueOf("O"))); category_list=CategoryTypesLocalServiceUtil.dynamicQuery(categoryQuery); the last line generates the warning 的匿名函数