使用任意组件创建向量值函数

时间:2015-12-05 19:09:04

标签: matlab function vector

大家晚上好,

我想创建一个函数

f(x) = [f1(x), f2(x), ... , fn(x)]
在MatLab中的

,具有任意形式和数字的fi。在我目前的情况下,它们是有限维函数空间的基本元素,因此例如是多个多变量多项式。我希望能够在某种“函数创建”函数中通过参数设置表单(例如hermite / lagrange多项式,...)和数字,所以我想为任意函数fi解决这个问题。
现在假设fi fi:R ^ d - > R ,因此矢量输入到标量输出。这意味着f的结果应该是包含所有n个函数输出的n-dim向量。函数n的数量可能相当大,因为涉及排列。我还需要经常评估结果函数,所以我希望尽可能高效地完成它。

目前我看到两种方法:

  1. 使用循环创建一个包含每个fi的单元格 funcell{i}=matlabFunction(createpoly(degree, x),'vars',{x})
    和符号工具箱中的一个函数和一个符号x(向量)。然后可以用cellfun创建所需的功能,例如
    f=@(x) cellfun(@(v) v(x), funcell)
    这相对较短,容易,并且在进行搜索时可以找到。它甚至允许使用'UniformOutput',falsecell2mat扩展到矢量输出。在缺点方面,它是非常低效的,首先是在创建期间因为matlabFunction而在评估过程中因为cellfun。

  2. 我的另一个想法是创建一个字符串并使用eval。一种方法是做到这一点 stringcell{i}=[char(createpoly(degree, x)),';']
    然后使用strjoin。理论上,这应该产生有效的功能。但是有两个问题。第一个是使用eval(主要是原则上),第二个是插入正确的参数。符号工具箱不允许使用 x(i)形式的符号,因此生成的字符串也不会包含它们。我到目前为止唯一的补救措施是允许在 xi 上进行某种字符串替换,但这也远非优雅。

  3. 所以我现在有办法做我现在需要的东西,但我希望有更好的解决方案。

1 个答案:

答案 0 :(得分:0)

根据我对问题的理解,你可以直截了当地做到:

初始化步骤:

my_fns = cell(n, 1);  %where n is number of functions
my_fns{1} = @f1;   % Assuming f1 is defined in f1.m etc...
my_fns{2} = @f2;

x的评估:

z = zeros(n, 1);
for i=1:n,
   z(i) = my_fns{i}(x)
end

例如,如果您将其放入my_evaluate.m

function z = my_evaluate(my_fns, x)
  z = zeros(n, 1);
  for i=1:n,
    z(i) = my_fns{i}(x)
  end      

这怎么可能加快?

取决于你是否有可以被利用的特殊结构。

  • f1fn的某个子集是否有共同的计算,每个函数调用都不需要重复?例如。如果常见的计算步骤成本很高,您可以执行y = f_helper(x)z(i) = fi(x, y)
  • 函数f1...fn可以是矢量/矩阵友好的,允许在每次函数调用时评估多个点吗?

大问题是您的函数调用f1fn的速度有多快,而不是您如何从向量中的这些调用中收集结果。