MATLAB - 递归创建匿名函数

时间:2017-10-12 14:34:03

标签: matlab

要在最小二乘拟合例程lsqcurvefit中使用,我需要一个函数,如:

F = @(D, t) F0 - D(1)*(1-exp(-t))...
               - D(2)*(1-exp(-t))...
               - D(3)*(1-exp(-t))...
                ...
               - D(n)*(1-exp(-t));

但是,系列中的术语数量由用户决定;所以匿名函数F需要在循环中创建,比如

F = @(D, t) F0;
for i=1:n
    F = F - D(i)*(1-exp(-t));
end

不幸的是,上述方法在MATLAB中不起作用;是否有可能让它发挥作用?

2 个答案:

答案 0 :(得分:1)

除非我误解了某些内容,否则你的功能实际上并不是递归的。你可以这样做:

g.loc['total']=g.sum()
print (g)
        b sum       b %         wa     b mean   c sum     c mean   d sum
a                                                                       
5      2067.0  0.344672   5.969521   5.991304  2062.0   5.976812  2104.0
6      1875.0  0.312656   5.954667   6.009615  1857.0   5.951923  1859.0
7      2055.0  0.342671   6.085645   5.991254  2084.0   6.075802  2058.0
total  5997.0  1.000000  18.009832  17.992173  6003.0  18.004536  6021.0

或者,如果您想明确指定F = @(D,t) F0 - sum(D*(1-exp(-t));

n

或者,如果F = @(D,n,t) F0 - sum(D(1:n)*(1-exp(-t)); 是与t相同大小的向量:

D

答案 1 :(得分:0)

执行此操作的最佳方法是使用匿名和普通函数。

recursionDepth = 5
CoefficientList = ones(numel(recursionDepth) + 1);

functionResults = @(t) myFunction(t, CoefficientList, recursionDepth);

function F = myFunction(t, CoefficientList, Depth)
   F = CoefficientList(1);
   for idx = 1:Depth
      F = CoefficientList(idx) * (1 - exp(-1));
   end
end

我在这里所做的是定义包含模型及其所有参数的完整函数,然后将其包装到匿名函数中,该函数在匿名函数中设置用户可选择的,不变的参数,并离开单个可调参数作为输入。您必须针对您的特定型号进行调整,但这是您的基本模板。