lsqcurvefit question - ydata has two dimension (Function value and YDATA sizes are not equal)
1 view (last 30 days)
Show older comments
Hi,
I am new to matlab and I want to do a curve fitting using lsqcurvefit (following a paper's action). But I got a error called: Function value and YDATA sizes are not equal. Where did i do mistake...? Thanks for help.
xdata is the timepoint while ydata is 2-D position changing with time. The two dimensions of y are not independent of each other, so I don't think they should be fitted separately. This model have three params.
xdata = 1:60;
ydata = [590.25,511.34;590.23,510.52;590.22,509.51;590.18,508.61;
590.13,507.77;590.16,506.05;590.20,504.68;590.15,503.54;
589.98,501.91;589.66,500.71;589.47,499.64;589.27,498.69;
589.00,497.27;588.65,495.75;588.24,494.53;588.00,493.50;
587.57,492.52;587.45,491.43;587.21,490.27;586.96,489.24;
586.63,488.08;586.44,487.03;586.23,485.81;585.94,484.29;
585.57,482.81;585.21,481.34;584.93,480.24;584.59,479.26;
584.30,478.44;583.86,476.75;583.33,475.30;582.87,474.14;
582.52,473.06;582.21,472.03;582.04,471.08;581.62,469.92;
581.29,468.39;580.85,466.46;580.66,464.52;580.43,463.14;
580.11,462.08;579.58,460.73;579.51,458.95;579.41,457.45;
579.49,455.14;579.26,452.99;578.85,451.19;578.71,450.34;
578.53,449.45;578.54,448.45;578.48,447.62;578.30,446.64;
578.20,445.49;577.43,442.85;577.27,440.24;576.85,438.83;
576.67,437.85;576.54,437.19;576.52,435.73;576.35,434.59];
Filter = [0,0.0191620208109086,0.0683763509212163,0.100379351034585,0.0974133620604203,0.0679132261017191,0.0279145555757322,...
-0.00924174097003220,-0.0361988204543976,-0.0510709858726009,-0.0554801938514580,-0.0525520022466199,-0.0454971586440819,...
-0.0368765372303619,-0.0283884375848139,-0.0209563283968831,-0.0149359405672504,-0.0103302318649573,-0.00696094418434395,...
-0.00458437240976897,-0.00295845614268432,-0.00187479263439797,-0.00116876316001411,-0.000717879195806221,...
-0.000435011977115633,-0.000260359690910572,-0.000154065078565133,-9.02143808828862e-05,-5.23151853625161e-05,...
-3.00650758394752e-05,-1.71336401217675e-05,-9.68796610836146e-06,-5.43788818548629e-06,-3.03138411065368e-06,...
-1.67897757316864e-06,-9.24285783937950e-07,-5.05912271159936e-07,-2.75416083714947e-07,-1.49167755170539e-07,...
-8.03986272699545e-08,-4.31338127221703e-08];
% Define cumulative Gaussian function
F = @(mtnd, stnd, t) normpdf(t, mtnd, stnd);
% Define curve-fitting function
fun = @(params, xdata) conv(Filter, F(params(1), params(2), xdata));
% Estimate parameters using least-square fit
params = lsqcurvefit(fun, [0, 1], xdata, ydata);
0 Comments
Answers (1)
Torsten
on 12 Feb 2023
Your function "fun" must return a matrix of size (60x2) like the ydata you provide. This is not the case - thus the error message.
4 Comments
Walter Roberson
on 12 Feb 2023
They only return a matrix of one dimension (60x1)
No. You conv() a vector of length 41 (Filters) and xdata (length 60). The result is 41+60-1 = 100 .
If you wanted something the size of xdata to be returned you would need code similar to
fun = @(params, xdata) conv(F(params(1), params(2), xdata), Filter, 'same');
But of course this would still be a vector of length 60, not something that you could use with 60 x 2 Ydata.
for col = 1 : size(ydata,2)
params(:,col) = lsqcurvefit(fun, [0, 1], xdata, ydata(:,col).');
end
See Also
Categories
Find more on Get Started with Curve Fitting Toolbox in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!