Попытка найти индекс минимального значения в матрице не удалась в Octave

Итак, у меня есть эта матрица:

E1 = [54 5 2 4;4 5 19 29;31 4 2 9; 1 3 99 34]

скажем, я хочу найти расположение значения, наиболее близкого к 18,9. пусть А = 18,9

я бы сделал

[r,c] = find(E1==min(min(abs(E1-A))))

Это не работает. Он возвращает r = "[](0x1)" and c = "[](0x1)"

Однако,

если я сначала сделаю:

F = abs(E1-A), а затем выполните

[r,c] = find(F==min(min(F))) 

это дает r = 2 и c = 3, что правильно. 19 является ближайшим значением, а 19 находится в строке 2 столбца 3.

Почему это не работает тогда? F — это просто abs(E1-A), так почему я не могу поставить abs(E1-A) вместо F в формуле поиска?


person Otispunkmeyer86    schedule 31.07.2014    source источник


Ответы (1)


min(min(abs(E1-A)))
ans =  0.10000

Это дает вам мин над абсолютной разницей. Затем вы сравниваете его с E1, который имеет абсолютные значения. Это полностью отличается от вашего второго формуляра

[r,c] = find(F==min(min(F)))

где вы сравниваете минимальную разницу с матрицей, содержащей абсолютную разницу между E1 и A. Если вы замените во второй формуле F на abs (E1-A), вы получите

[r,c] = find(abs(E1-A)==min(min(abs(E1-A))))

Что тоже сработает. Тем не менее я бы предложил другой подход:

E1 = [54 5 2 4;4 5 19 29;31 4 2 9; 1 3 99 34];
A = 18.9;
# get the index ( Column-major order) of the minimum
idx = nthargout (2, @min, abs (E1-A)(:));
# this returns 10
# convert it ro row, column
[r, c] = ind2sub (size (E1), idx)
r =  2
c =  3
person Andy    schedule 31.07.2014
comment
Спасибо! Я дам ему попробовать. Должен признаться, что мой пример здесь проще, чем то, с чем я работаю. Я использую две матрицы 61x61, созданные с помощью команд linspace и meshgrid. Таким образом, одна матрица имеет 61 повторяющуюся строку (т.е. для данного столбца все строки имеют одинаковое значение), а другая имеет 61 повторяющийся столбец. Таким образом, вышеприведенное на самом деле возвращает целую кучу местоположений строк и столбцов, если я не добавлю 1) в конце, чтобы сообщить ему, чтобы дать мне первое найденное значение. На самом деле меня интересует номер строки из 1 матрицы и номер столбца из другой. Я попробую ваш код! Выглядит хорошо! - person Otispunkmeyer86; 31.07.2014
comment
в nthargout для чего 2? Я не совсем понял, какую помощь должен был сказать nthargout по этому вопросу - person Otispunkmeyer86; 31.07.2014
comment
@ user3894764 nathargout (2, @min, ...) вернет второй вывод out min, как если бы он был вызван с двумя выходными аргументами. В данном случае это то же самое, что и [~, idx] = min (abs (E1-A)(:)). В этом случае вы можете подумать, что это nthargout, но на самом деле это очень полезный инструмент для других ситуаций. - person carandraug; 31.07.2014
comment
carandraug: Сначала я написал однострочник [r, c] = ind2sub (size (E1), nthargout (2, @min, abs (E1-A)(:))); а потом решил разделить. Вы абсолютно правы, что в этом случае [~,idx] = min(...) будет лучше читаться. - person Andy; 31.07.2014
comment
Спасибо, ребята! Это было чрезвычайно полезно! - person Otispunkmeyer86; 01.08.2014