Индекс минимума, исключая отрицательные значения - PullRequest
0 голосов
/ 31 января 2019

Я хочу найти индекс элемента min в массиве L, но отрицательные числа следует игнорировать.Есть ли более простой способ, чем этот?

L = xB./a_i;
for j = 1:length(L)
    if L(j) < 0
        L(j) = Inf;
    end
end
[~, indOut] = min(L);

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Альтернативное решение, если вы не хотите изменять L, - это сначала найти минимальное значение, а затем найти его индекс на втором шаге:

minL = min(L(L>=0));
index = find(L==minL,1);

Обычно этоПлохо использовать сравнения на равенство с числами с плавающей точкой, но в этом случае minL должно быть точно идентично хотя бы одному элементу в L, поэтому сравнение не может быть неудачным.

0 голосов
/ 31 января 2019

Редактировать:

Вы можете сделать это в довольно простой вкладыш, используя ту же логику

[~, indOut] = min( abs(L)./(L>=0) );

Логика здесь:

abs(L) % Positive (absolute) values of L
./     % Element-wise divide. Note that x/0 = Inf for x>0
L>=0   % Logical array; 0 when L<0 

% So: Elements where L<0 are divided by 0, and become Inf. 
%     Positive value is the one being divided, so never -Inf

%     Elements where L>=0 are divided by 1, remain unchanged
%     These elements are already positive, so abs(L) == L here.

В любом случае, вам не нужен цикл

L( L < 0 ) = Inf;
[~, indOut] = min( L );

Обратите внимание, что если вы не хотите индекс (но только минимальное значение), вы можете сделать это

m = min( L( L >= 0 ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...