MATLAB Answers

lsqcurvefit help - Field assignment to a non-structure array object

3 ビュー (過去 30 日間)
Mar
Mar 2019 年 1 月 14 日
コメント済み: Torsten 2019 年 1 月 16 日
Hi,
I am getting the error "Field assignment to a non-structure array object" in the line I call the lsqcurvefit function and I don't understand why.
I try to fit 2 different models. When I fit model_1 everything is fine. When I fit model_2 I got the error.
a, b - both vectors of size [1,41].
I have the following code:
opts = optimset('Display' ,'off');
for i=1:size(Image,1)
x(i,:) = lsqcurvefit (@model_1, init, a(1:end-1), Image(i, 1:end-1), zeros(size(init)), init*10, opts)
end
for i=1:size(Image,1)
x(i,:) = lsqcurvefit (@model_2, init, a(1:end-1), b(1:end-1), Image(i, 1:end-1), zeros(size(init)), init*10, opts)
end
Why do I get the error when I have one more entry in model_2? i.e. the vector b?
function y = model_2(p, a, b)
A = p(1);
B = p(2);
C = p(3);
D = p(4);
E = p(5);
y = A*exp(-a*C-b/D)+(1-A)*exp(-a*B).*(E*exp(-b/100)+(1-E)*exp(-b/40));
end
function y = model_1(p,a)
A = p(1);
B = p(2);
C = p(3);
y = A*exp(-B*a) + (1-A)*exp(-C*a);
end

  0 件のコメント

サインインしてコメントする。

回答 (1 件)

Walter Roberson
Walter Roberson 2019 年 1 月 14 日
編集済み: Walter Roberson 2019 年 1 月 15 日
lsqcurvefit must have parameter order
  1. objective. @model_1 or @model_2
  2. x0. init in both cases
  3. xdata. a(1:end-1) in both cases
  4. ydata. Image(1:end-1) in the first case and b(1:end-1) in the second case
  5. lb. zeroes in the first case and Image(1:end-1) in the second case
  6. ub. init*10 in the first case and zeroes in the second case
  7. options. opt (a struct) in the first case and zeroes in the second case
  8. no documented parameter . absent in the first case and opt (a struct) in the second case.
Internally the code attempts to add additional fields to the struct expected in the 7th position and fails when the parameter is numeric zeroes .

  16 件のコメント

表示 13 件の古いコメント
Torsten
Torsten 2019 年 1 月 16 日
Before calling "lsqcurvefit", I'd evaluate "model_2" with init, a and b as input and see if it returns senseful values.
Mar
Mar 2019 年 1 月 16 日
I evaluated it and It does return sensful values.
Torsten
Torsten 2019 年 1 月 16 日
Then you should do as "lsqcurvefit" suggests: Set a larger value for the maximum number of iterations:
options.MaxIterations and/or options.MaxFunctionEvaluations

サインインしてコメントする。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by