2013-05-20 3 views
1

Предположим, у меня есть вектор чисел с плавающей запятой. Назовите его x.Matlab условный максимум без изменения вектора

Обычно, если я хочу наибольшее число в этом x, я могу назвать функцию matlab max(x).

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

Самый простой способ сделать это (и то, как я это сделаю на C) - это пропустить вектор и продолжить обновление max, пропуская любой индекс, который находится в моем втором векторе. То есть, выполните линейный поиск максимума и пропустите индексы, которые я не хочу.

Однако, интересно, есть ли в Matlab более традиционный способ решить эту проблему.

ответ

2

нарезка свой вектор/матрицу с логическим индексом, как правило, путь:

http://blogs.mathworks.com/steve/2008/01/28/logical-indexing/

Похоже, у вас уже есть свои показатели, так что вы можете просто повернуть его в логический индекс, как это :

решение
exclude = [ ... ]; 
include = ones(size(x)); 
include(exclude) = 0; 

max_m = max(x(include)); 
+0

Вы должны использовать логики, поэтому вместо них используйте 'true', а вместо« 0 »используйте' false'. «double» zeroes будут вызывать ошибку, а 'double' будут интерпретироваться как индекс первого элемента в массиве. –

1

Paddy «s является Хорошо, если вам нужно только значение max. Однако, если вам нужен индекс от максимального значения, а также вы можете больше не делать

[max_m max_m_i] = max(x(include)); 

Поскольку индекс max_m_i будет относительно уменьшенного массива x(include) и не индекса в исходный массив x.

Чтобы обойти это, вы можете использовать логические Индексация

include = true(size(x)); 
include(exclude) = false; 
[max_m max_m_i] = max(x .* include - inf .* (~include)); 

Таким образом, мы устанавливаем исключенные местоположения в -inf так они там (так индексы не повреждены), но они не будут выбраны в качестве max.

Смежные вопросы