sorting in linaire descending order

1 Ansicht (letzte 30 Tage)
james sinos
james sinos am 26 Okt. 2021
Kommentiert: Mathieu NOE am 5 Nov. 2021
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

Antworten (2)

Mathieu NOE
Mathieu NOE am 26 Okt. 2021
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 Kommentare
Rik
Rik am 27 Okt. 2021
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 am 28 Okt. 2021
yes , go ahead Rik

Melden Sie sich an, um zu kommentieren.


james sinos
james sinos am 27 Okt. 2021
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 Kommentare
Mathieu NOE
Mathieu NOE am 2 Nov. 2021
hello James
yes , of course
Mathieu NOE
Mathieu NOE am 5 Nov. 2021
hello
problem solved ?

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Get Started with Curve Fitting Toolbox finden Sie in Help Center und File Exchange

Produkte


Version

R2017b

Community Treasure Hunt

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

Start Hunting!

Translated by