如何获取匿名函数输入参数的数量

How to get the number of anonymous function input arguments

提问人:Dante 提问时间:12/11/2014 最后编辑:Dante 更新时间:12/11/2014 访问量:441

问:

我怎样才能得到 的长度 ?y

>> s=10; r=28; b=8/3;
>> f = @(t,y) [-s*y(1)+s*y(2); -y(1)*y(3)+r*y(1)-y(2); y(1)*y(2)-b*y(3)];

在上面的示例中,长度为 。此外,由于 是唯一的自变量,因此可以通过函数的长度找到 的长度,即这里。3tyf4

编辑

我想写一个微分方程组求解器般的函数。下面是一个示例ode45()

[t y] = ode45(f,[0 1],[1 0 0]);
MATLAB 匿名函数

评论

0赞 Marcin 12/11/2014
不要轻视。“匿名函数输入参数的数量”。F 有两个输入参数,T 和 Y。你是怎么得到 3 或 4 的?
0赞 Dante 12/11/2014
本身是一个由 3 个参数和 组成的数组。yy(1)y(2)y(3)
0赞 Marcin 12/11/2014
使用 numel(y) 或 size(y)。
1赞 TroyHaskin 12/11/2014
最终目标是什么?如果 的定义取决于 的长度,则应创建一个单独的函数文件,因为创建这样的内联函数通常不会让您处理这些复杂性。fy
1赞 horchler 12/11/2014
在命令窗口中键入 和 。 为此,您可以根据初始条件向量的大小做出假设,并在确定初始步长的同时实际评估积分函数。如果发生错误,它们要么被捕获,要么是用户的问题。请注意,虽然有时我们将数组视为具有“参数”的函数,但说它们具有“元素”会更清楚。我不确定为什么您需要从集成功能中了解此信息。edit ode45edit private/odeargumentsode45

答:

1赞 Marcin 12/11/2014 #1

我仍然不完全理解。但是从我所估计的一点点来看,你想看看函数 f 的内部,并寻找 y(1)、y(2) 或 y(3) 来查看 y 有多少个元素?如果是这种情况,您可以执行以下操作:

f = @(t,y) [-s*y(1)+s*y(2); -y(1)*y(3)+r*y(1)-y(2); y(1)*y(2)-b*y(3)];           
matchStr = regexp(func2str(f),'y\(\d\)','match');
numel(unique(matchStr))

这样可以得到:3

基本上它所做的是将 f 变成字符串,然后在这个字符串中搜索。y(\d)

以防万一您想要拥有匿名函数输入参数的数量,您可以使用:

nargin(f)

这得到:2(因为你有 t 和 y 作为 f 的输入)

评论

0赞 Dante 12/11/2014
谢谢。您的答案是正确的,但是如果用户使用而不是 .我不认为 Matlab 在其微分方程函数中使用它,例如 .应该有更好的方法。xyode45()
2赞 Marcin 12/11/2014
那么为什么不检查一下 ode45 是如何做到这一点的呢?只需编辑 ODE45,您就会看到源代码。也许这会提供一些答案。
0赞 Hoki 12/11/2014
@user96402只检查 如果您不确定是否会被调用,则无需检查,或者您可以在构建正则表达式之前先检查输入参数的名称。(\d)yy