【问题标题】: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】:

    几个示例方法来做到这一点

    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
      
    2. 使 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
      
    3. 如果你希望能够输入多个函数,你可以这样做

      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 值的向量可能是一个好主意性能。

      【讨论】:

        猜你喜欢
        • 2020-02-21
        • 1970-01-01
        • 2020-12-30
        • 1970-01-01
        • 2015-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多