
sorting in linaire descending order
    조회 수: 5 (최근 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
댓글 수: 0
답변 (2개)
  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
      
      
 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.
참고 항목
카테고리
				Help Center 및 File Exchange에서 Spline Postprocessing에 대해 자세히 알아보기
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!




