循环中的函数句柄错误 (Matlab)
Error with function handles in a loop (Matlab)
我正在尝试 运行 一个包含函数句柄的循环。如果我对 n 使用任何特定值,代码运行良好。但是,当我尝试 运行 循环中的代码时,它给出了错误:
Nonscalar arrays of function handles are not allowed; use cell
arrays instead.
我是 MATLAB 的新手,所以在尝试了几个小时后,我 运行 没有想法...任何帮助将不胜感激。
代码如下
for m=1:N
for n=1:N
int(n) = @(w,s0,v,r,t) chfun_norm(s0,v,r,t,w(n)-(alpha+1)*1i)/(alpha^2 + alpha - w(n)^2 + 1i*(2*alpha+1)*w(n));
int(n) = @(w)int(w,s0,v,r,t);
g(n) = exp(1i*(b-log(s0))*w(n)-alpha*k(m)-r*t)*int(n)*pond(n);
g(n) = exp(-1i*2*pi/N*(n-1)*(m-1))*g(n);
end
y(m) = real(sum(g))*stepw;
end
编辑
我已经使用元胞数组重新构造了循环,但现在出现以下错误
Undefined function 'mtimes' for input arguments of type 'function_handle'
下面是更新后的代码:
y = zeros(N,1);
intCell = {zeros(N,1)};
gCell = {zeros(N,1)};
for m=1:N
for n=1:N
intCell{n} = @(w,s0,v,r,t) chfun_norm(s0,v,r,t,w(n)-(alpha+1)*1i)/(alpha^2 + alpha - w(n)^2 + 1i*(2*alpha+1)*w(n));
intCell{n} = @(w)intCell{n}(w,s0,v,r,t);
gCell{n} = exp(1i*(b-log(s0))*w(n)-alpha*k(m)-r*t)*intCell{n}*pond(n);
gCell{n} = exp(-1i*2*pi/N*(n-1)*(m-1))*g(n);
end
y(m) = real(sum(g))*stepw;
end
错误消息告诉您确切的操作。如果不查看您的代码实际执行的操作,非标量数组(您的 int)无法保存函数句柄。您必须将多个函数句柄放在一个元胞数组中。它们能够保存不同类型和混合类型的数据。因此 int 需要是一个元胞数组。
只需阅读有关如何在 Matlab 中使用元胞数组的信息。
顺便提一下,在强类型语言中,int 可能是一种类型,为防止混淆,更改该变量的名称可能是合理的。
编辑
第二个错误可能是由第 8 行中的最后一个乘法引起的。您正在尝试乘以一个函数句柄。我想您想乘以上述函数的 return 值?如果是这样,intCell中存储的句柄引用的函数仍然需要参数才能执行,如第6行和第7行。
我正在尝试 运行 一个包含函数句柄的循环。如果我对 n 使用任何特定值,代码运行良好。但是,当我尝试 运行 循环中的代码时,它给出了错误:
Nonscalar arrays of function handles are not allowed; use cell
arrays instead.
我是 MATLAB 的新手,所以在尝试了几个小时后,我 运行 没有想法...任何帮助将不胜感激。
代码如下
for m=1:N
for n=1:N
int(n) = @(w,s0,v,r,t) chfun_norm(s0,v,r,t,w(n)-(alpha+1)*1i)/(alpha^2 + alpha - w(n)^2 + 1i*(2*alpha+1)*w(n));
int(n) = @(w)int(w,s0,v,r,t);
g(n) = exp(1i*(b-log(s0))*w(n)-alpha*k(m)-r*t)*int(n)*pond(n);
g(n) = exp(-1i*2*pi/N*(n-1)*(m-1))*g(n);
end
y(m) = real(sum(g))*stepw;
end
编辑
我已经使用元胞数组重新构造了循环,但现在出现以下错误
Undefined function 'mtimes' for input arguments of type 'function_handle'
下面是更新后的代码:
y = zeros(N,1);
intCell = {zeros(N,1)};
gCell = {zeros(N,1)};
for m=1:N
for n=1:N
intCell{n} = @(w,s0,v,r,t) chfun_norm(s0,v,r,t,w(n)-(alpha+1)*1i)/(alpha^2 + alpha - w(n)^2 + 1i*(2*alpha+1)*w(n));
intCell{n} = @(w)intCell{n}(w,s0,v,r,t);
gCell{n} = exp(1i*(b-log(s0))*w(n)-alpha*k(m)-r*t)*intCell{n}*pond(n);
gCell{n} = exp(-1i*2*pi/N*(n-1)*(m-1))*g(n);
end
y(m) = real(sum(g))*stepw;
end
错误消息告诉您确切的操作。如果不查看您的代码实际执行的操作,非标量数组(您的 int)无法保存函数句柄。您必须将多个函数句柄放在一个元胞数组中。它们能够保存不同类型和混合类型的数据。因此 int 需要是一个元胞数组。
只需阅读有关如何在 Matlab 中使用元胞数组的信息。
顺便提一下,在强类型语言中,int 可能是一种类型,为防止混淆,更改该变量的名称可能是合理的。
编辑
第二个错误可能是由第 8 行中的最后一个乘法引起的。您正在尝试乘以一个函数句柄。我想您想乘以上述函数的 return 值?如果是这样,intCell中存储的句柄引用的函数仍然需要参数才能执行,如第6行和第7行。