"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_n
的 function handle 传递给 arrayfun
,正如您所写的那样,probability_n
是在没有输入参数的情况下隐式调用的(您不需要 ()
来调用函数)。当 MATLAB 尝试从 probability_n
中访问 num_pts
但未提供时,您会收到错误消息。
k = arrayfun(@probability_n, n, num_pts);
请注意,仅当 arrayfun
的第一个输入是 gpuarray
对象时,将标量 num_pts
作为第三个输入传递才有效。否则,您需要创建一个匿名函数,将 num_pts
传递给 probability_n
我正在尝试计算均匀分布在 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_n
的 function handle 传递给 arrayfun
,正如您所写的那样,probability_n
是在没有输入参数的情况下隐式调用的(您不需要 ()
来调用函数)。当 MATLAB 尝试从 probability_n
中访问 num_pts
但未提供时,您会收到错误消息。
k = arrayfun(@probability_n, n, num_pts);
请注意,仅当 arrayfun
的第一个输入是 gpuarray
对象时,将标量 num_pts
作为第三个输入传递才有效。否则,您需要创建一个匿名函数,将 num_pts
传递给 probability_n