Нахождение пересечения на Matlab - PullRequest
0 голосов
/ 07 июня 2018

У меня есть два набора кривых данных, x1, y1 и x1, y2.Я хочу найти пересечение между этими двумя кривыми.Однако у меня нет уравнения для x1, y1.Более того, используя традиционную функцию вычисления пересечений, я получаю мало или ничего не получаю, поскольку кривые не «точно» пересекаются в определенной точке: они почти пересекаются!

Я хотел бы найти, для наименьшего x1возможно, в какой точке x1 эти кривые очень близки друг к другу (почти пересекаются).Тем не менее, я не уверен, что делать дальше ... Я точно знаю, что мне нужно будет определить запас, но как я могу проверить, близки ли значения y1 и y2 друг к другу, и определить для каждого x1?Есть ли у вас какие-либо идеи ?Любая функция, о которой вы можете подумать?

Спасибо,

Вот мои две кривые: кривые почти пересекаются

enter image description here

1 Ответ

0 голосов
/ 07 июня 2018

Если я понял, что вы хотите найти минимальное расстояние между двумя точками.

Есть различия между ними, если x1, y1, x2 и y2 - матрицы / векторы, тогда я предлагаю следующее.

dist=sqrt((x2-x1).^2+(y2-y1).^2); %compute distance
[M,I] = min(dist); %find value of minimum distance and index
xf=x1(I); yf=y1(I); %this is the point on the first curve for the "intersection"
xs=x2(I); ys=y2(I); %this is the point on the second curve for the "intersection"

Это должно делать то, что вы хотите, так как вычисляет расстояние, а затем ищет минимальное значение.Теперь, как сказано в комментариях, давайте также предположим, что разные элементы х (разное расстояние) и / или разное количество элементов.(x1 и y1 должны иметь одинаковые элементы, в противном случае вы даже не сможете отобразить их, и вам нужно будет «повторно объединить» точки сетки / данных).

if length(x1)<length(x2)
    l=length(x1);
    c=length(x2);
    xo=x1; xe=x2; yo=y1; ye=y2;
else 
    l=length(x2);
    c=length(x1);
    xo=x2; xe=x1; yo=y2; ye=y1;
end
dist=zeros(l,c);
for kk=1:l
    xm=xo(kk)*ones(1,c); %you might have to change this depending on if your arrays are vertical/horizontal
    ym=yo(kk)*ones(1,c); %same as xm but for y
    dist(kk,:)=sqrt((xe-xm).^2+(ye-ym).^2); %compute distance
end
[M,I] = min(dist(:)); %find value of minimum distance and index
[row,col]=ind2sub(size(dist),I)

Так что же это делает,запускает цикл for минимальное количество раз, на каждой итерации он проверяет 1 значение любого из всех других значений другой строки.Это означает, что он вычисляет все расстояния между всеми точками.Затем вы снова находите минимальное расстояние и преобразуете позицию в номер строки и столбца, в строке указывается индекс для самого короткого массива, а в столбце указывается индекс для самого длинного (вы можете добавить некоторые элементы, чтобы автоматически найтикоторый внутри функции if или путем добавления нескольких строк в конце).

Как уже упоминалось другим пользователем, это будет медленно для больших наборов данных 10000+ или 100000+ точек (зависит от вашего компьютера).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...