MATLAB — корреляция с векторами

У меня есть два вектора XYZ с разными размерами. Мы можем назвать это Data1 и Data2, где:

Data1 = [1000 3:55 2000; ...
          950 2200 4.5; ...
         1050 2350 5.5; ...
         1025 2500 6; ...
         1075 2600 7; ...
         1000 2700 8];

Data2 = [1000 2650 7.95; ...
         1000 2750 8.16; ...
         1000 2700 9; ...
         1025 3000 10];

Минимально допустимая разница между точками составляет 100 метров по положению (X, Y) и 0,2 по глубине (Z).

В этом случае точки между векторами будут P_Data1 = [1000 2700 8] и P_Data2 = [1000 2650 7,95], потому что расстояние допустимо, а глубина ближайшая.

Кто-нибудь знает функцию, которая может сделать эту корреляцию, чтобы помочь мне? Я думаю в Маталабе есть какая-то функция задачи и высокая производительность, ибо я буду делать этот расчет на тысячи точек.

В настоящее время я использую вложенный цикл, но производительность очень плохая, потому что я вычисляю все расстояния, затем все различия между глубинами для каждой точки и фильтрую матрицу.

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

Я благодарю вас за всю помощь!


person Vinicius Nogueira    schedule 29.05.2015    source источник
comment
Итак, вы ищете ближайшее измерение глубины, которое также соответствует требованиям по x и y?   -  person nkjt    schedule 29.05.2015
comment
В Data1 есть ошибка. Я думаю, что это должно быть 1000 3.55 2000;, а не 3:55.   -  person kkuilla    schedule 29.05.2015
comment
эммм, глупый вопрос, но я не думаю, что вам нужна корреляция для этого. Основываясь на том, что вы сказали, вы можете просто вычесть данные 1 из данных 2, которые возвращают матрицу, взять ее абсолютное значение (что соответствует абсолютному значению каждого элемента), а затем отфильтровать по условию, что столбцы 1 и 2 (называемый XY) должно быть меньше 200, а столбец 3 должен быть меньше 0,2, я делаю что-то не так?   -  person GameOfThrows    schedule 29.05.2015


Ответы (1)


Data1 = [950 2200 4.5; ...
         1050 2350 5.5; ...
         1025 2500 6; ...
         1075 2600 7; ...
         1000 2700 8];

Data2 = [1000 2650 7.95; ...
         1000 2750 8.16; ...
         1000 2700 9; ...
         1025 3000 10];

vec1 = Data1(:,3);
vec2 = Data2(:,3);
[p,q] = meshgrid(vec1, vec2);
output1 = 0; %initial set

while output1 == 0
sub = [abs(p(:)-q(:))];
[M,I] = min(sub);
IndData1 = floor(I/4);
IndData2 = mod(I,IndData1);

%this basically computes the smallest possible Z 
%Check if it works for condition 2:
checkcolumn1 = abs(Data1(IndData1,1) - Data2(IndData2,1));
checkcolumn2 = abs(Data1(IndData1,2) - Data2(IndData2,2));
if checkcolumn1 < 200 && checkcolumn2 <200
   output1 = Data1(IndData1,:);
   output2 = Data2(IndData2,:);
else
min(sub) = 1000000 %huge high number to basically remove the min
end
end

Таким образом, эта программа должна делать то, что вы просите, в основном, она сначала вычисляет минимум столбца Z, вы можете добавить условие, что оно должно быть меньше 0,2, кстати, я просто предположил, что должно быть какое-то значение меньше, чем 0,2. Затем он пытается увидеть, может ли быть выполнено первое условие. Хотя он использует цикл для поиска, на самом деле он очень эффективен, так как он выходит из цикла, как только находит правильные значения.

person GameOfThrows    schedule 29.05.2015