Нахождение индекса условия соответствия элемента матрицы

Дана матрица Z(i,j) такая, что она отображается в два массива X(i) и Y(j). Я пытаюсь найти элементы Z (и, следовательно, соответствующие X и Y) в определенном диапазоне.

Сейчас я делаю следующее, используя логическое индексирование. Учитывая этот пример

 X = 1:5;
 Y = 1:5;
 Z =    [17    24     1     8    15
         23     5     6    14    16
          4     6    13    20    22
         10    12    19    21     3
         11    18    25     2     9]
 Z((X>1 & X<4),Y==3)

Это отлично работает, но теперь я хочу найти минимум возвращаемых значений из этого конкретного диапазона,

Что я делаю с

min(Z((X>1 & X<4),Y==3))

Но теперь, как я могу вернуть соответствующие значения минимума X и Y? Поскольку моя логическая индексация возвращает массив, все методы, которые я пробовал до сих пор, возвращают индекс минимума в массиве ответов, а не исходную матрицу Z.

я не могу использовать

[row col] = find(Z==min(Z((X>1 & X<4),Y==3)))

Из-за повторов. Каковы мои альтернативы?


person Ash    schedule 11.03.2015    source источник


Ответы (2)


Чтобы получить исходные индексы, вы должны сохранить в памяти индексы ваших двух условий на x и y (которые я поместил в массивы cX и cY), а затем использовать функцию ind2sub.

NB: ваш код немного сбивает с толку, поскольку x обозначает строки, а y - столбцы, но я сохранил то же соглашение в своем ответе.

На практике это дает:

% --- Definition
X = 1:5;
Y = 1:5;
Z =    [17    24     1     8    15
        23     5     6    14    16
         4     6    13    20    22
        10    12    19    21     3
        11    18    25     2     9];

% --- Get the values of interest
cX = find(X>1 & X<4);
cY = find(Y==3);
v = Z(cX,cY);

% --- Get position of the minimum in the initial array
[~, I] = min(v(:));
[Ix, Iy] = ind2sub([numel(cX) numel(cY)], I);

i = cX(Ix);      % i = 2
j = cY(Iy);      % j = 3

Лучший,

person Ratbert    schedule 11.03.2015
comment
@Divakar: Я ценю комплимент, особенно от bsxfun мастера! - person Ratbert; 12.03.2015
comment
ха-ха, ну bsxfun весело! Я просто надеюсь, что большее количество людей начнет лайкать это!! - person Divakar; 12.03.2015
comment
Если бы я только прочитал все ответы, прежде чем тратить время на то, чтобы набирать свой... :-) - person Luis Mendo; 12.03.2015

Один подход -

%// Calculate all indices of the grid created with those two X-Y conditions
idx = bsxfun(@plus,(find(Y==3)-1)*size(Z,1),find((X>1 & X<4)).') %//'

%// Get the index corresponding to minimum from that grided Z
[~,min_idx] = min(Z(idx(:)))

%// Get corresponding X-Y indices by using indices calculated earlier
[indX,indY] = ind2sub([numel(X) numel(Y)],idx(min_idx))
person Divakar    schedule 11.03.2015