【问题标题】:How to define function from input如何从输入定义函数
【发布时间】:2014-09-24 23:05:55
【问题描述】:
假设我们有如下函数:
function Output=DoSomething(f)
...
...
end
其中 'f' 是用户输入的函数,例如 'sin(t)' 、 'x^2' 或函数向量。
函数 DoSomething 获取 f 并对其执行一些操作。例如,在 t=pi/2,pi,2*pi,... 处计算 'f' 并将结果放入输出向量中。如何在 MATLAB 中做到这一点? f 应该是一个字符串变量吗?如果是,是否需要转换为另一种数据类型?我在执行此操作时遇到错误。
【问题讨论】:
标签:
string
matlab
function
【解决方案1】:
几个示例方法来做到这一点
-
使输入 f 成为函数句柄
function [output] = dosomething(f, varargin)
output = f(varargin{:});
end
>>f = @(x, y) sqrt(x.^2 + y.^2);
>>dosomething(f, [3 5 8], [4 12 15])
>>ans =
>>5 13 17
-
使 f 成为一个字符串,并使用 'eval' (我认为,第一个是更好的做法,如果 nargin 小于 2,第二个会失败,但如果 nargin >=3 则不会,即使函数不使用它们。 )
function [output] = dosomething(f, varargin)
output = eval(f);
end
>>f = 'sqrt(varargin{1}.^2 + varargin{2}.^2)';
>>dosomething(f, [3 5 8], [4 12 15])
>>ans =
>>5 13 17
-
如果你希望能够输入多个函数,你可以这样做
function [output] = dosomething(f, varargin)
output = cellfun(@(x) x(varargin{:}), f, 'UniformOutput', false);
end
>> f{1} = @(x, y) sqrt(x.^2 + y.^2);
>> f{2} = @(x, y) atan2(x, y);
>> A = dosomething(f, [3 5 8], [4 12 15]);
>> A{1}
ans =
5 13 17
>> A{2}
ans =
0.6435 0.3948 0.4900
【解决方案2】:
不知道是评论还是回答...
这真的很难做到,因为有各种不同的方法可以将函数输入到 Matlab 中。我认为最简单的做法是将f 设为匿名函数,例如
f=@(x,y) x.^2+y.^2;
然后在DoSomething 函数中,您可以执行f(1,2) 或f(1:10,11:20)。
请注意,如果函数不是使用逐元素操作(.* 等)定义的,那么您可以对其进行转换,以便它可以通过以下方式获取向量参数
syms q w
f=matlabFunction(f(q,w),'vars',[q w]);
这可能很有用。
即使您没有将 f 设为匿名函数以将输入转换为 DoSomething,将您得到的任何内容转换为匿名函数或 f 值的向量可能是一个好主意性能。