【问题标题】:Matlab anonymous function list argumentsMatlab 匿名函数列表参数
【发布时间】:2016-04-17 22:38:14
【问题描述】:

我对匿名函数比较陌生,通过谷歌搜索找不到任何东西,所以我想我会来这里寻求帮助。对于符号函数,我可以使用symvar 来确定函数依赖关系。有匿名函数的等价物吗?

示例: 这个功能告诉你如何变水为金

afun = @(temp,pressure,volume,time,mass) ...

除了disp(afun),有没有办法使用symvar 之类的函数来捕获因变量,其中输入变量列表可以存储在另一个变量中?例如 test = symvars(afun) 其中 symvar 被与匿名函数相关的东西替换。换句话说,我希望“测试”是一个等于“温度、压力、体积、时间、质量”的数组?

【问题讨论】:

  • ...或喜欢coeffnames(f) from cfit objects....

标签: matlab anonymous-function


【解决方案1】:

匿名函数中的“匿名”不是指内容未知。它指的是这个函数没有像 m 文件中的函数那样的静态名称

例如,如果您创建以下函数,它只能以其名称myfunction 使用。

function out = myfunction(a,b)

但是,对于函数句柄,它被分配给一个变量,并且该变量的名称用于调用该函数。

myfunc = @(a,b)disp('I am a walrus');
myfunc2 = myfunc;

现在可以使用 either myfunc()myfunc2() 调用 same 函数。

现在我们已经解决了命名问题,如果给你一个函数句柄,你实际上可以只显示函数句柄(使用disp)并查看函数定义(完整的输入参数)。

f = @(a,b)disp('I am a sneaky function');
disp(f)

    f = @(a,b)disp('I am a sneaky function');

由此很容易推断f 接受两个输入参数(ab)。

至于这些输入参数应该是什么以及该函数对这些参数做了什么,您必须查看函数句柄的函数组件或询问创建它的人。如果您无法分辨,这不会使其“匿名”,只会使其文档记录不佳。

如果您想以编程方式获取有关输入参数的信息,大多数可用于常规函数的函数自省函数可用于匿名函数。

%// Get the number of input arguments
nargin(f)

更新

如果您使用matlabFunction 从符号表达式生成匿名函数,则可以在调用matlabFunction using the Vars input 时指定输入参数。

from the documentation为例。

syms x y z t
r = (x + y/2 + z/3)*exp(-t);

%// The first input argument will be t and the second will be an array of [x,y,z]
matlabFunction(r, 'Vars', {t,[x y z]});
%// @(t,in2)exp(-t).*(in2(1)+in2(2).*(1.0./2.0)+in2(3).*(1.0./3.0));

或者作为另一个示例,我使用 array 而不是包含值的单元格数组。然后,它们将按名称显示为匿名函数的单独输入。

syms x y z
r = x + y/2 + z/3;
matlabFunction(r, 'Vars', [x,y,z]);
%// @(x,y,z)x+y.*(1.0./2.0)+z.*(1.0./3.0);

如果您不指定它们,MATLAB 会自动选择文档中指定的顺序:

默认情况下,转换符号表达式时,顺序是字母顺序。转换符号函数时,它们的输入参数出现在其他变量的前面,并且所有其他变量都按字母顺序排序。

更新 2

如果您真的想要某种方法来检查匿名函数的输入变量,这里有一个小匿名函数可以帮您完成。

anoninputs = @(f)strsplit(regexp(func2str(f), '(?<=^@\()[^\)]*', 'match', 'once'), ',');

现在我们可以像这样测试它:

f = @(a,b)disp('Just another function. Do not mind me');

anoninputs(f)

    'a'   'b'

【讨论】:

  • 是的,这只是给出了in2,它是一个参数数组。同样,如果我对函数一无所知,我怎么知道这些参数是什么。我想这就是“匿名”函数的本质,因为它们确实是匿名的。要使用它们,您必须了解输入的功能或含义。
  • @ThatsRightJack “要与他们合作,您必须了解输入的功能或含义。”任何函数都是如此。
  • 该函数仍然是匿名的,因为它没有名称。 :)
  • @ThatsRightJack 我刚刚给你写了一个函数,它将为你完成这个任务。它位于“更新 2”部分
  • @ThatsRightJack 现在了解您想要什么,我将补充一点,对此不存在简单的机制,因为这并不是一种真正强大或有效的典型编程方式。当参数顺序是固定的(或动态已知的)和符号独立时,参数顺序是最好的,函数本身适应不同的参数。那不是判断;只是一个解释。
猜你喜欢
  • 1970-01-01
  • 2015-11-21
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多