finding the distance between two points

6 次查看(过去 30 天)
prompt = "enter the number of elements to make";
x = input(prompt);
Unable to run the 'fevalJSON' function because it calls the 'input' function, which is not supported for this product offering.
M = 2;
N = x/M;
r = 1;
R = 2;
W = linspace(r,R,M);
C = linspace(0,2*pi,N);
[R,T] = meshgrid(W,C);
X = R.*cos(T);
Y = R.*sin(T);
[m,n] = size(X)
figure
set(gcf, 'color', 'w');
axis equal;
axis on;
hold on;
for i = 1:m
plot(X(i,:), Y(i,:), '-o');
end
for j=1:n
G = plot(X(:,j),Y(:,j), 'b', 'linewidth', 1);
end
fprintf('the x coordinates of the nodes are')
X
fprintf('the y coordinates of the nodes are')
Y
%distance b/w two nodes
How do I find the distance between two nodes? I need to find the length of each side of the sements created (4 lengths in total).

回答(3 个)

Sam Chak
Sam Chak 2022-11-12
You can try the function: pdist2().
help pdist2
PDIST2 Pairwise distance between two sets of observations. D = PDIST2(X,Y) returns a matrix D containing the Euclidean distances between each pair of observations in the MX-by-N data matrix X and MY-by-N data matrix Y. Rows of X and Y correspond to observations, and columns correspond to variables. D is an MX-by-MY matrix, with the (I,J) entry equal to distance between observation I in X and observation J in Y. D = PDIST2(X,Y,DISTANCE) computes D using DISTANCE. Choices are: 'euclidean' - Euclidean distance (default) 'squaredeuclidean' - Squared Euclidean distance 'seuclidean' - Standardized Euclidean distance. Each coordinate difference between rows in X and Y is scaled by dividing by the corresponding element of the standard deviation computed from X, S=NANSTD(X). To specify another value for S, use D = PDIST2(X,Y,'seuclidean',S). 'cityblock' - City Block distance 'minkowski' - Minkowski distance. The default exponent is 2. To specify a different exponent, use D = PDIST2(X,Y,'minkowski',P), where the exponent P is a scalar positive value. 'chebychev' - Chebychev distance (maximum coordinate difference) 'mahalanobis' - Mahalanobis distance, using the sample covariance of X as computed by NANCOV. To compute the distance with a different covariance, use D = PDIST2(X,Y,'mahalanobis',C), where the matrix C is symmetric and positive definite. 'cosine' - One minus the cosine of the included angle between observations (treated as vectors) 'correlation' - One minus the sample linear correlation between observations (treated as sequences of values). 'spearman' - One minus the sample Spearman's rank correlation between observations (treated as sequences of values) 'hamming' - Hamming distance, percentage of coordinates that differ 'jaccard' - One minus the Jaccard coefficient, the percentage of nonzero coordinates that differ function - A distance function specified using @, for example @DISTFUN A distance function must be of the form function D2 = DISTFUN(ZI,ZJ), taking as arguments a 1-by-N vector ZI containing a single observation from X or Y, an M2-by-N matrix ZJ containing multiple observations from X or Y, and returning an M2-by-1 vector of distances D2, whose Jth element is the distance between the observations ZI and ZJ(J,:). For built-in distance metrics, the distance between observation I in X and observation J in Y will be NaN if observation I in X or observation J in Y contains NaNs. D = PDIST2(X,Y,DISTANCE,'Smallest',K) returns a K-by-MY matrix D containing the K smallest pairwise distances to observations in X for each observation in Y. PDIST2 sorts the distances in each column of D in ascending order. D = PDIST2(X,Y,DISTANCE, 'Largest',K) returns the K largest pairwise distances sorted in descending order. If K is greater than MX, PDIST2 returns an MX-by-MY distance matrix. For each observation in Y, PDIST2 finds the K smallest or largest distances by computing and comparing the distance values to all the observations in X. [D,I] = PDIST2(X,Y,DISTANCE,'Smallest',K) returns a K-by-MY matrix I containing indices of the observations in X corresponding to the K smallest pairwise distances in D. [D,I] = PDIST2(X,Y,DISTANCE, 'Largest',K) returns indices corresponding to the K largest pairwise distances. Example: % Compute the ordinary Euclidean distance X = randn(100, 5); Y = randn(25, 5); D = pdist2(X,Y,'euclidean'); % euclidean distance % Compute the Euclidean distance with each coordinate difference % scaled by the standard deviation Dstd = pdist2(X,Y,'seuclidean'); % Use a function handle to compute a distance that weights each % coordinate contribution differently. Wgts = [.1 .3 .3 .2 .1]; % coordinate weights weuc = @(XI,XJ,W)(sqrt((XI - XJ).^2 * W')); Dwgt = pdist2(X,Y, @(Xi,Xj) weuc(Xi,Xj,Wgts)); See also PDIST, KNNSEARCH, CREATENS, KDTreeSearcher, ExhaustiveSearcher. Documentation for pdist2 doc pdist2 Other uses of pdist2 gpuArray/pdist2 tall/pdist2

Star Strider
Star Strider 2022-11-12
I am not exactly certain what you want.
Calculating the perimeters of each segment appears to be straightforward —
% prompt = "enter the number of elements to make";
% x = input(prompt);
x = 16;
M = 2;
N = x/M;
r = 1;
R = 2;
W = linspace(r,R,M);
C = linspace(0,2*pi,N);
[R,T] = meshgrid(W,C);
X = R.*cos(T);
Y = R.*sin(T);
[m,n] = size(X)
m = 8
n = 2
figure
set(gcf, 'color', 'w');
axis equal;
axis on;
hold on;
for i = 1:m
plot(X(i,:), Y(i,:), '-o');
end
for j=1:n
G = plot(X(:,j),Y(:,j), 'b', 'linewidth', 1);
end
fprintf('the x coordinates of the nodes are')
the x coordinates of the nodes are
X
X = 8×2
1.0000 2.0000 0.6235 1.2470 -0.2225 -0.4450 -0.9010 -1.8019 -0.9010 -1.8019 -0.2225 -0.4450 0.6235 1.2470 1.0000 2.0000
fprintf('the y coordinates of the nodes are')
the y coordinates of the nodes are
Y
Y = 8×2
0 0 0.7818 1.5637 0.9749 1.9499 0.4339 0.8678 -0.4339 -0.8678 -0.9749 -1.9499 -0.7818 -1.5637 -0.0000 -0.0000
%distance b/w two nodes
dX = hypot(diff(X,[],2), diff(Y,[],2)); % Radial Distances
dY = hypot(diff(X), diff(Y)); % Circumferential Distances
dY = [dY(1,:); dY]; % Duplicate First Row
Perimeters = sum([2*dX dY],2) % Perimeters Of Each Segment
Perimeters = 8×1
4.6033 4.6033 4.6033 4.6033 4.6033 4.6033 4.6033 4.6033
.

Karim
Karim 2022-11-12
编辑:Karim 2022-11-12
To identify the distances between the nodes of a segment you first need to identify the nodes that make up that segment. Once you have those coordinates the distance can be determined. See below for an example. I adjusted the figure a bit to highlight the segment and the node numbers.
x = 16; % user input
M = 2; % number or radii divisions
N = x/M; % number of angluar divisions
r = 1; % bound inner radius
R = 2; % bound outer radius
W = linspace(r,R,M); % radii for the plot
C = linspace(0,2*pi,N); % angluar segments for the plot
[R,T] = meshgrid(W,C); % combined radii (R) and angle segment (T)
X = R.*cos(T); % x coordinates for the points
Y = R.*sin(T); % y coordinates for the points
[m,n] = size(X);
% reshape the points to ease the plotting
% note that we add 'nan' to disconnect the different lines
X_circ = reshape([X;NaN(1,n)],[],1);
Y_circ = reshape([Y;NaN(1,n)],[],1);
X_seg = reshape([X,NaN(m,1)]',[],1);
Y_seg = reshape([Y,NaN(m,1)]',[],1);
% create the grid for the segment highlight
SegGrid = [X(1,1) Y(1,1);
X(1,2) Y(1,2);
X(2,2) Y(2,2);
X(2,1) Y(2,1)];
% evaluate the distance
Edge_12 = sqrt( (SegGrid(1,1)-SegGrid(2,1))^2 + (SegGrid(1,2)-SegGrid(2,2))^2);
Edge_23 = sqrt( (SegGrid(2,1)-SegGrid(3,1))^2 + (SegGrid(2,2)-SegGrid(3,2))^2);
Edge_34 = sqrt( (SegGrid(3,1)-SegGrid(4,1))^2 + (SegGrid(3,2)-SegGrid(4,2))^2);
Edge_41 = sqrt( (SegGrid(4,1)-SegGrid(1,1))^2 + (SegGrid(4,2)-SegGrid(1,2))^2);
figure
hold on
% plot the circles
plot(X_circ,Y_circ,'b','linewidth',1);
% plot the inner edges
plot(X_seg ,Y_seg ,'r','Marker','o');
% highlight the first segment in yellow
patch('Faces',[1 2 3 4],'Vertices',SegGrid,'FaceColor','y','FaceAlpha',0.5,'EdgeColor','none')
% print text to indicate the node number
text(SegGrid(:,1),SegGrid(:,2)," "+num2str((1:4)'))
hold off
axis equal
grid on
fprintf('Edge between nodes %i and %i has length %.3f \n',1,2,Edge_12)
Edge between nodes 1 and 2 has length 1.000
fprintf('Edge between nodes %i and %i has length %.3f \n',2,3,Edge_23)
Edge between nodes 2 and 3 has length 1.736
fprintf('Edge between nodes %i and %i has length %.3f \n',3,4,Edge_34)
Edge between nodes 3 and 4 has length 1.000
fprintf('Edge between nodes %i and %i has length %.3f \n',4,1,Edge_41)
Edge between nodes 4 and 1 has length 0.868
% EDIT: added the perimeter
SegPer = Edge_12+Edge_23+Edge_34+Edge_41;
fprintf('Perimeter of the segment is %.3f \n',SegPer)
Perimeter of the segment is 4.603

类别

Help CenterFile Exchange 中查找有关 Dimensionality Reduction and Feature Extraction 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by