Clear Filters
Clear Filters

Find matrix (meshgrid) indices near plotted vector (points)

24 views (last 30 days)
Hi,
I am attempting to grab several datapoints that are near a vector of points (represented by a line in the plot). I am unsure how to accomplish this with k = dsearchn(P,PQ) or Idx = knnsearch(X,Y,Name,Value). Ideally, the indices of the datapoints very close to the line's datapoints will be pulled and I can reference them later for some calculations.
clc;clear;close all
% Plot data to be used in aspiration calculation
n = 35;
X = linspace(-5,5,n);
Y = linspace(-5,5,n);
[X,Y] = meshgrid(X,Y);
% Create points for line
x1=-1.522; x2=1.847;
y1=-0.761; y2=0.4344;
coefficients = polyfit([x1, x2], [y1, y2], 1);
a = coefficients (1);
b = coefficients (2);
xvals = linspace(-5,5,5*n); % x values that will be used to calculate y values. Can be
yvals = a*xvals+b;
% Plot
figure
scatter(X(:),Y(:),'red')
% scatter(X(k),Y(k),'blue')
title('Grid of data and intersecting line')
xlabel('mm')
ylabel('mm')
line(xvals,yvals)
grid on
axis equal
  2 Comments
Addison Collins
Addison Collins on 2 Jul 2021
I managed to get something close. It isn't as symetric as I'd like thought.
clc;clear;close all
% Plot data to be used in aspiration calculation
n = 35;
X = linspace(-5,5,n)';
Y = linspace(-5,5,n)';
[X,Y] = meshgrid(X,Y);
P = [X(:) Y(:)];
% Create points for line
x1=-1.522; x2=1.847;
y1=-0.761; y2=0.4344;
coefficients = polyfit([x1, x2], [y1, y2], 1);
a = coefficients (1);
b = coefficients (2);
xvals = linspace(-5,5,5*n); % x values that will be used to calculate y values. Can be
yvals = a*xvals+b;
PQ = [xvals(:) yvals(:)];
k = dsearchn(P,PQ)
% Plot
figure
scatter(X(:),Y(:),'red'); hold on;
scatter(X(k),Y(k),'green')
% scatter(X(k),Y(k),'blue')
title('Grid of data and intersecting line')
xlabel('mm')
ylabel('mm')
line(xvals,yvals)
grid on
axis equal
Yazan
Yazan on 3 Jul 2021
What if you sort the Y-axis data points at each X-axis point based on the difference with respect to yvals?

Sign in to comment.

Accepted Answer

Scott MacKenzie
Scott MacKenzie on 3 Jul 2021
Edited: Scott MacKenzie on 3 Jul 2021
If by symmetry you mean fewer points but closer to the line, then reduce the number of query points, or points in the line:
xvals = linspace(-5,5,1*n); % instead of 5*n
Then, use dsearchn like this:
P = [X(:) Y(:)];
PQ = [xvals' yvals'];
k = dsearchn(P, PQ);
The points you are looking for are in k, as shown below:
% plot grid points closest to query points
hold on
plot(P(k,1), P(k,2),'or', 'markerfacecolor', 'r');
Here's the result with only n/2 points in the line:
You could also try using a finer granularity in the grid, but I haven't explored that.
  1 Comment
Addison Collins
Addison Collins on 3 Jul 2021
Thanks Scott, I didn't realize of changing the number of points going into PQ would have this effect. The grid of data I am going to use this detection method for is somewhat set already. This was a "bench test" script, if you will.

Sign in to comment.

More Answers (0)

Categories

Find more on 2-D and 3-D Plots in Help Center and File Exchange

Products


Release

R2020a

Community Treasure Hunt

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

Start Hunting!