Hello everyone, how to divide a piece of data into upper and lower parts along the y-axis with C point and D point as the boundary?

1 view (last 30 days)
  1 Comment
Wesley
Wesley on 19 Jan 2021
Points C and D have been calculated.
load data1.mat
x = data1(:, 1);
y = data1(:, 2);
%Calculate points C and D
[a,I]=min(x);
C=[a,y(I)];
[b,J]=max(x);
D=[b,y(J)];
hold on

Sign in to comment.

Accepted Answer

Star Strider
Star Strider on 19 Jan 2021
Try this:
D = load('data1.mat');
data1 = D.data1;
x = data1(:, 1);
y = data1(:, 2);
[C,ixmin] = min(x);
[D,ixmax] = max(x);
B = [x(ixmin) 1; x(ixmax) 1] \ [y(ixmin); y(ixmax)];
[xsort,sortidx] = sort(x);
fitline = [xsort ones(size(xsort))] * B;
topidx = y(sortidx) >= fitline;
figure
plot(x(sortidx(topidx)), y(sortidx(topidx)), '.r')
hold on
plot(x(sortidx(~topidx)), y(sortidx(~topidx)), '.g')
plot(xsort, fitline, '-b')
plot(C,y(ixmin), 'bo', 'MarkerFaceColor','b')
plot(D,y(ixmax), 'bo', 'MarkerFaceColor','b')
hold off
xlabel('X')
ylabel('Y')
legend('Above Line', 'Below Line', 'Line', 'Location','SE')
text(C,y(ixmin), 'C ', 'HorizontalAlignment','right', 'VerticalAlignment','middle')
text(D,y(ixmax), ' D', 'HorizontalAlignment','left', 'VerticalAlignment','middle')
producing:
.
  9 Comments

Sign in to comment.

More Answers (1)

KSSV
KSSV on 19 Jan 2021
Edited: KSSV on 19 Jan 2021
Option 1: You should get the indices of C, D in the given points of curve. Read about knnsearch, this will give indices of points in curve which are close/ same as C and D. Once you know these indices, you can get the upper and lower curve depending on whether the points are in clockwise direction or anti clockwise direction.
Option 2: This is simple, you know C, D; as they lie on x-axes/ parallel to x-axes, these points should have same y. So:
idx1 = P(:,2)>=C(2) ; % C(2), D(2) both will be same
dataA = P(idx1,:) ;
dataB = P(~idx1,:) ;

Community Treasure Hunt

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

Start Hunting!