我想要使用类似@(x) = x + x^2
之类的matlab匿名函数并将其拆分为单元格数组,以便
f{1} = @(x) x
f{2} = @(x) x^2
我希望能够使用一些任意函数句柄来完成此操作。到目前为止,我提出的最好的方法是将@(x) = x + x^2
作为一个字符串,然后通过添加符号将其拆分并将@(x)
附加到此开头。但是,我希望能够直接使用函数句柄作为函数参数。这也很好,因为使用其他变量可能会导致字符串方法出现一些困难。
我也在考虑将函数句柄的单元格数组作为参数,这对于用户来说会更难,但在我的代码中更容易。
对于某些背景知识,我想为我正在为一个类编写的一些最小二乘数据拟合代码执行此操作。这段代码用于将模型函数作为参数,我需要分别为最小二乘过程评估每个术语。我不是将这些模型限制为多项式,即使多项式是模型,我也希望选项在多项式中省略某些幂。如果某人有更好的建议来获取模型功能,那也会很棒。
更新:有人想知道我的意思
我不是将这些模型限制为多项式,即使是多项式 是模型,我想要选择省略某些权力 多项式。
为了澄清一下,我说我不想将模型限制为
c0 + c1*x + ... + cn*x^n
在这种情况下,我可以将n
作为参数并创建与polyfit
中发生的类似的术语。例如,如果我知道我的输入数据适合偶数或奇数函数,我可能需要以下模型之一
c0 + c1*x^2 + c2*x^4 + ... + ck*x^(2k)
c1*x + c2*x^3 + ... + cm*x^(2m-1)
k
为偶数且m
为奇数。或者可能是一个严格来说不是多项式的模型,但保持系数线性,例如
c0 + exp(x) * ( c1 + c2*x + ... cn*x^(n-1) )
答案 0 :(得分:2)
这是一个有趣的问题。不应将字符串拆分为括号组内的+
符号。例如,使用
f = @(x) x + (x+1)*sqrt(x) + x^2 + exp(x+2);
字符串应该在第一个字符处拆分,而不是在第二个+
符号处拆分。
这可以如下完成。要仅检测括号外的+
符号,请为每个左括号添加1,并为每个右括号减1。然后所需的+
符号是那些计数为0的符号。
我假设输出应该是函数句柄的单元格数组。如果它应该是字符串的单元格数组,则只删除最后一行。
F = functions(f);
str = F.function; %// get string from function handle
[pref, body] = regexp(str, '@\(.+?\)', 'match', 'split'); %// pref is the '@(...)' part
body = body{2}; %// body is the main part
ind = cumsum((body=='(')-(body==')'))==0 & body=='+'; %// indices for splitting
body(ind) = '?'; %// '?' will be used as split marker
ff = strcat(pref, strsplit(body, '?')); %// split, and then add prefix
ff = cellfun(@str2func, ff, 'uniformoutput', 0); %// convert strings to functions
此示例中的结果:
ff{1} =
@(x)x
ff{2} =
@(x)(x+1)*sqrt(x)
ff{3} =
@(x)x^2
ff{4} =
@(x)exp(x+2)