Положение элемента Matlab - PullRequest
0 голосов
/ 04 мая 2018

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

У меня есть система координат U / V, которую я построил в Matlab, используя meshgrid между значениями (-0,1,0.1). Ради простоты я преобразовал эту систему в систему координат тета-фи . Это преобразование дает мне две новые матрицы, которые я назвал A, B, которые имеют такой вид.

A=. . . . .   B= . . . . .
  . . . . .      . . . . .
  . . 0 . .      . . 0 0 0
  . . . . .      . . . . .
  . . . . .      . . . . .

Точки представляют значения в радианах, но важным моментом является то, что A имеет ноль в середине, а B имеет половину центрального ряда, равную 0, а другая половина - другое значение в радианах. В моем случае эти матрицы имеют размер 201x201. Это означает, что графически у меня должна быть такая сетка: enter image description here

и каждая точка принимает определенное значение в третьей матрице. Что мне нужно сделать, это собрать элемент этой третьей матрицы в определенной точке. Например, мне нужна точка (в УФ-системе) 0,005,0,005, например: enter image description here

То, что я думал сделать, это использовать эту функцию

function [out_matrix] = find_value(in_matrix,ref_matrix_H,ref_matrix_V,ref)

ref_matrix= sqrt(ref_matrix_H.^2+ref_matrix_V.^2);
[value,ii] = min(abs(ref_matrix(:)-ref));
[row,col] = ind2sub(size(ref_matrix),ii);

out_matrix=in_matrix(row,col);

end

, где ref_matrix_H и ref_matrix_V - две матрицы A, B; Реф это один из двух пунктов, которые мне нужны. Я вычисляю это ref_matrix как пересечение двух матриц и сравниваю каждый элемент этой новой матрицы с моим значением и, следовательно, беру координаты соответствующего элемента, но эта функция не извлекает правильные значения, которые я ожидаю.

Я думаю, что проблема в том, когда я вычисляю ref_matrix, потому что в результате я получаю что-то вроде этого:

ref_matrix= 0.700 0.700 0.700 0.700 0.700
            0.650 0.650 0.650 0.650 0.650
            0.500 0.005 0.005 0.005 0.500
            0.450 0.002 0.002 0.002 0.450
            0.350 0.001 0.001 0.001 0.350
            0.450 0.002 0.002 0.002 0.450
            0.500 0.005 0.005 0.005 0.500
            0.650 0.650 0.650 0.650 0.650
            0.700 0.700 0.700 0.700 0.700

, где центральные элементы очень малы (что правильно), а другие увеличиваются по мере удаления от центра. Для правильной работы матрица все равно должна иметь другую форму

ref_matrix= -0.700 -0.700 0.700 0.700 0.700
            -0.650 -0.650 0.650 0.650 0.650
            -0.500 -0.005 0.005 0.005 0.500
            -0.450 -0.002 0.002 0.002 0.450
            -0.350 -0.001 0.001 0.001 0.350
            -0.450 -0.002 0.002 0.002 0.450
            -0.500 -0.005 0.005 0.005 0.500
            -0.650 -0.650 0.650 0.650 0.650
            -0.700 -0.700 0.700 0.700 0.700

1 Ответ

0 голосов
/ 04 мая 2018

Предполагая, что ref является двухэлементным вектором, содержащим значения тэта и фи, соответствующие ref_matrix_H и ref_matrix_V, я бы сделал что-то подобное, чтобы найти целочисленный индекс, ближайший к этим координатам:

function out_value = find_value(in_matrix,ref_matrix_H,ref_matrix_V,ref)
   dist_matrix = sqrt((ref_matrix_H-ref(1)).^2 + (ref_matrix_V-ref(2)).^2);
   [~,index] = min(dist_matrix(:));
   out_value = in_matrix(index);
end

Что я сделал здесь, так это изменил ваш код так, чтобы dist_matrix - это расстояние в H-V пробеле до ref (обратите внимание, что это всегда положительное значение). Исходный код преобразовал пространство H-V в расстояние до начала координат и нашел значение расстояния, которое было ближе всего к одному из значений в ref.

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


EDIT

Мне нужна точка (в УФ-системе) 0,005,0,005

Если вы имеете дело с UV-координатами, просто используйте их. Вы сгенерировали матрицу U и V, используя meshgrid, это означает, что это хорошая система координат для работы (монотонное увеличение координат в обоих направлениях). interp2 упростит вашу работу:

% Your data (mock-up):
[U,V] = meshgrid(linspace(-0.1,0.1,201),linspace(-0.1,0.1,201));
in_matrix = randn(201,201);

% Query a point (u,v):
u = 0.005;
v = 0.005;
out = interp2(U,V,in_matrix,u,v);

interp2 по умолчанию использует линейную интерполяцию. Если вам действительно нужно получить один элемент из in_matrix, ближайший к координатам, используйте интерполяцию ближайшего соседа:

out = interp2(U,V,in_matrix,u,v,'nearest');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...