大家晚上好,
我想创建一个函数
f(x) = [f1(x), f2(x), ... , fn(x)]
在MatLab中的,具有任意形式和数字的fi。在我目前的情况下,它们是有限维函数空间的基本元素,因此例如是多个多变量多项式。我希望能够在某种“函数创建”函数中通过参数设置表单(例如hermite / lagrange多项式,...)和数字,所以我想为任意函数fi解决这个问题。
现在假设fi
是 fi:R ^ d - > R ,因此矢量输入到标量输出。这意味着f
的结果应该是包含所有n个函数输出的n-dim向量。函数n的数量可能相当大,因为涉及排列。我还需要经常评估结果函数,所以我希望尽可能高效地完成它。
目前我看到两种方法:
使用循环创建一个包含每个fi的单元格
funcell{i}=matlabFunction(createpoly(degree, x),'vars',{x})
和符号工具箱中的一个函数和一个符号x(向量)。然后可以用cellfun创建所需的功能,例如
f=@(x) cellfun(@(v) v(x), funcell)
这相对较短,容易,并且在进行搜索时可以找到。它甚至允许使用'UniformOutput',false
和cell2mat
扩展到矢量输出。在缺点方面,它是非常低效的,首先是在创建期间因为matlabFunction而在评估过程中因为cellfun。
我的另一个想法是创建一个字符串并使用eval
。一种方法是做到这一点
stringcell{i}=[char(createpoly(degree, x)),';']
然后使用strjoin
。理论上,这应该产生有效的功能。但是有两个问题。第一个是使用eval
(主要是原则上),第二个是插入正确的参数。符号工具箱不允许使用 x(i)形式的符号,因此生成的字符串也不会包含它们。我到目前为止唯一的补救措施是允许在 xi 上进行某种字符串替换,但这也远非优雅。
所以我现在有办法做我现在需要的东西,但我希望有更好的解决方案。
答案 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
取决于你是否有可以被利用的特殊结构。
f1
到fn
的某个子集是否有共同的计算,每个函数调用都不需要重复?例如。如果常见的计算步骤成本很高,您可以执行y = f_helper(x)
和z(i) = fi(x, y)
。f1...fn
可以是矢量/矩阵友好的,允许在每次函数调用时评估多个点吗? 大问题是您的函数调用f1
到fn
的速度有多快,而不是您如何从向量中的这些调用中收集结果。