Intersection of two matrices- intersect function not working as intended
1 visualización (últimos 30 días)
Mostrar comentarios más antiguos
Isaac John
el 13 de Feb. de 2021
Comentada: Isaac John
el 13 de Feb. de 2021
I have two matrices, L1S (blue) and L2S (red), whose first 3 columns describe the x,y,z coordinates that I am interseted in.
As I require the intsersection of these two matrices, (only the first three columns) I have used XY11 = intesect(L1S(:,1:3),L2S(:,1:3),'rows'). But the plot of the intersection, XY11 is found to have skipped obvious points of intersection. (See fig below)
I cannot possibly think of a reason as to why this is happening. I have never faced this issue before. Please note that the points coordinates in both the matrices are exactly matching at all points.
Any leads to the solution is deepy appreciated.
0 comentarios
Respuesta aceptada
Jan
el 13 de Feb. de 2021
Editada: Jan
el 13 de Feb. de 2021
With some guesses:
L1S_T = readtable('L1S.xlsx','ReadVariableNames', 0);
L1S = L1S_T.Variables;
L1S = L1S(:, 1:3);
L2S_T = readtable('L2S.xlsx', 'ReadVariableNames', 0);
L2S = L2S_T.Variables;
L2S = L2S(:, 1:3);
figure; axes('NextPlot', 'add');
plot(L1S(:, 1), L1S(:, 2), 'b.');
plot(L2S(:, 1), L2S(:, 2), 'r.');
L12 = intersect(L1S, L2S, 'rows');
plot(L12(:, 1), L12(:, 2), 'co');
This reproduces your result. This means, that the cyan values overlap, the others are different.
Now focus the point on the bottom left side of the assumed overlap:
P = [0.8163, 0.8082]
[~, index1] = min(vecnorm(L1S(:, 1:2) - c, 2, 2)) % 26
[~, index2] = min(vecnorm(L2S(:, 1:2) - c, 2, 2)) % 433
format long g
L1S(index1, :) % 0.816326530612245 0.808163265306123 0.06
L2S(index2, :) % 0.816326530612245 0.808163265306122 0.06
% ^
Do you see it? The difference is in the last significant digit. You find the difference in the Excel tables also: Select the 26th and 433th row in 2nd column. While the display in the table is limited to 10 digits, the display on the top shows the difference.
Solution:
Rounding to a specific number of decimals is not a perfect idea, because it will not recognize 0.4999999999 and 0.5 . Better use ismembertol with 'DataScale'.
L12i = ismembertol(L1S, L2S, 1e-8, 'ByRows', 1, 'DataScale', 1);
figure; axes('NextPlot', 'add');
plot(L1S(:, 1), L1S(:, 2), 'b.');
plot(L2S(:, 1), L2S(:, 2), 'r.');
plot(L1S(L12i, 1), L1S(L12i, 2), 'co');
5 comentarios
Jan
el 13 de Feb. de 2021
A hint: While 10^4 is an expensive power operation, 1e4 is a cheap constant. round(x, 4) rounds to 4 decimal places. Rounding is dangerous:
x1 = 0.1234499999999999
x2 = 0.1234500000000000
round(x1, 4) == round(x2, 4) % FALSE !!!
Better:
abs(x1 - x2) < 1e4 % TRUE
Más respuestas (0)
Ver también
Categorías
Más información sobre Matrix Indexing en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!