sorting in linaire descending order

1 次查看(过去 30 天)
lets says i have a matrice ( 9x5)
i want just one value from each column .
in a way to have values forming descending line . (the selection the most close to form a line).
its ok if its not a perfect line , just most close .
thank you

回答(2 个)

Mathieu NOE
Mathieu NOE 2021-10-26
hello
I generated some dummy data and tried to fit a linear curve , then searched for the data points closest to the mean curve
those points are with the black diamond marker
hope it helps
clc
clearvars
% lets says i have a matrice ( 9x5)
% i want just one value from each column .
% in a way to have values forming descending line . (the selection the most close to form a line).
% its ok if its not a perfect line , just most close .
for ci = 1:5
data(:,ci) = 6-ci + randn(9,1);
end
x = 1:5;
y = mean(data,1);
% Fit a polynomial p of degree "degree" to the (x,y) data:
degree = 1;
p = polyfit(x,y,degree);
% Evaluate the fitted polynomial p and plot:
f = polyval(p,x);
eqn = poly_equation(flip(p)); % polynomial equation (string)
Rsquared = my_Rsquared_coeff(y,f); % correlation coefficient
% find data nearest to fit curve
for ci = 1:5
err = abs(data(:,ci) - f(ci));
[val(ci),ind(ci)] = min(err);
data_selected(ci) = data(ind(ci),ci);
end
figure(1);plot(x,data,'+',x,f,'-',x,data_selected,'dk', 'MarkerSize', 14)
title(eqn)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function Rsquared = my_Rsquared_coeff(data,data_fit)
% R2 correlation coefficient computation
% The total sum of squares
sum_of_squares = sum((data-mean(data)).^2);
% The sum of squares of residuals, also called the residual sum of squares:
sum_of_squares_of_residuals = sum((data-data_fit).^2);
% definition of the coefficient of correlation is
Rsquared = 1 - sum_of_squares_of_residuals/sum_of_squares;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function eqn = poly_equation(a_hat)
eqn = " y = "+a_hat(1);
for i = 2:(length(a_hat))
if sign(a_hat(i))>0
str = " + ";
else
str = " ";
end
if i == 2
eqn = eqn+str+a_hat(i)+"*x";
else
eqn = eqn+str+a_hat(i)+"*x^"+(i-1)+" ";
end
end
eqn = eqn+" ";
end
  4 个评论
Rik
Rik 2021-10-27
This is not guaranteed to find the best fit. In a contrived example where there exists data that is a perfect fit (just far from the mean), this method will not pick that up.
If something like that is likely to exist you would need to write a fitting function where the cost function depended on the closest point in the row. You would need to vary your parameters over a grid to avoid local minima (use only the min and only the max to find the bounds).
If you need that I can have a look if I can write something for you.

请先登录,再进行评论。


james sinos
james sinos 2021-10-27
thank you mathieu
actionaly my problem is more complicated ,
i set this picture to explain it
i want to exract from my data:
  • each 'x' is relative to only one 'y'
  • i want to slect only one value of x from each column to form a line ( the nearest values of x's that approach to an descending line).
-------> BUT in a condition that the y's values ( each y is related to an x) also form the most possibl descending shape .
  7 个评论

请先登录,再进行评论。

类别

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

产品


版本

R2017b

Community Treasure Hunt

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

Start Hunting!

Translated by