Нахождение пересечения на Matlab
У меня есть два набора кривых данных, x1,y1 и x1,y2. Я хочу найти пересечение между этими двумя кривыми. Однако у меня нет уравнения для x1,y1. Более того, когда я использую традиционную функцию вычисления пересечений, я получаю мало или совсем нет результатов, так как кривые "точно" не пересекаются в определенной точке: они почти пересекаются!
Я хотел бы найти для наименьшего возможного значения x1, в котором точка x1 находится очень близко друг к другу (почти пересекается). Тем не менее, я не уверен, что делать дальше... Я точно знаю, что мне нужно будет определить запас, но как я могу проверить, близки ли значения y1 и y2 друг к другу, и определить для каждого x1? Есть ли у вас какие-либо идеи? Любая функция, которую вы можете придумать?
Спасибо,
Вот мои две кривые: кривые почти пересекаются
1 ответ
Если я понял, вы хотите найти минимальное расстояние между двумя точками.
Существуют различия между, если 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+ точек (зависит от вашего компьютера).