How do I do a linear fit on half of the data points in a set?

8 次查看(过去 30 天)
I have a code that should plot a set of data points and then a linear fit to the data points. Only the second half of the data follows a linear trend so I have set the fit over the second half of the data only. I have the code
fig3 = figure;
for ij = 1:N
subplot(1,2,1);
plot(Pdissarray(ij,:)',peakposarray(ij,2:end)','.','color', CM(ij,:))
xlabel('Dissipated Power (mW)');
ylabel('Peak Wavelength (nm)');
ylim([842 855]);
hold on
fitA = polyfit(Pdissarray(ij,15:end),peakposarray(ij,15:end),1);
lambdafit = polyval(fitA,Pdiss(ij,:));
subplot(1,2,1);
plot(Pdissarray(ij,:),lambdafit,'--','color',CM(ij,:));
hold on
end
where pdissarray and peakposarray are data sets such that each row is the thing I want to plot for each iteration of the loop and there are N rows (i.e. the arrays are each Nx50 and each N represents a single data set). The plot of these data sets is great, I get a set of N lines where each is a plot of the first row of each array. The problem is the fit. I'm trying to do a polynomial fit of degree one on each one of these lines. I do polyfit followed by polyval and then plot this output but the plot of this fit is empty. What am I doing wrong? Is it an indexing problem?
  2 个评论
JJH
JJH 2018-11-22
I'm attaching the files. Each row represents one data set such that the first row of Pdiss should be plotted with the first row of peakpos. I realised there is a typo in the code above:
fitA = polyfit(Pdissarray(ij,15:end),peakposarray(ij,15:end),1);
should be
fitA = polyfit(Pdissarray(ij,15:end),peakposarray(ij,16:end),1);
but this is not the problem with the data fitting.

请先登录,再进行评论。

采纳的回答

Star Strider
Star Strider 2018-11-22
There are several problems with the code you posted.
This works for me:
fig3 = figure;
for ij = 1:N
subplot(1,N,ij);
plot(Pdissarray(ij,:)',peakposarray(ij,2:end)','.','color', CM(ij,:))
xlabel('Dissipated Power (mW)');
ylabel('Peak Wavelength (nm)');
ylim([842 855]);
hold on
fitA = polyfit(Pdissarray(ij,15:end),peakposarray(ij,16:end),1);
lambdafit = polyval(fitA,Pdissarray(ij,:));
plot(Pdissarray(ij,:),lambdafit,'--','color',CM(ij,:));
hold off
end
  2 个评论
JJH
JJH 2018-11-22
Hi, thanks for your help, this is close to what I want, but I'd like all the plots to be on the same figure. Is that in how you defined subplot?
Star Strider
Star Strider 2018-11-22
My pleasure.
You included a subplot call, so I assumed you wanted them all as subplots. To plot them all in one axes object, this works:
fig3 = figure;
hold all
for ij = 1:N
plot(Pdissarray(ij,:)',peakposarray(ij,2:end)','.','color', CM(ij,:))
fitA = polyfit(Pdissarray(ij,15:end),peakposarray(ij,16:end),1);
lambdafit = polyval(fitA,Pdissarray(ij,:));
plot(Pdissarray(ij,:),lambdafit,'--','color',CM(ij,:));
end
hold off
xlabel('Dissipated Power (mW)');
ylabel('Peak Wavelength (nm)');
ylim([845 853]);
Keeping only the operations affected by the for looop inside it makes it more efficient. I also tweaked the ylim argument to make the plot a bit more readable.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Get Started with Curve Fitting Toolbox 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by