2009-05-07 6 views
3

Скажем, у меня есть следующая Условный оператор:Elementwise ifs in matlab - существуют ли они?

if (A ~= 0) 
    % do something like divide your favorite number by A 
else 
    % do something like return NaN or infinity 
end 

Проблема заключается в том, что А не является простым числом, а вектор. Matlab возвращает true, если ни один элемент в A равен 0. То, что я ищу, является векторизованным? способ перфорирования приведенного выше оператора if для каждого элемента в A.

На самом деле, я просто хочу сделать это как можно быстрее.

+0

Я думаю, что вы имеете в виду если (A ~ = 0) – MatlabDoug

ответ

0

Вы ищете все ненулевые элементы? Вы можете сделать это несколькими способами.

nonzero = find(A); % returns indicies to all non-zero elements of A 
y = x./A(nonzero); % divides x by all non-zero elements of A 
        % y will be the same size as nonzero 

Или для однострочника, вы можете использовать условное вместо indicies

y = x./A(A~=0); % divides x by all non-zero elements of A 
+0

Это утверждение вызывает у быть короче А, если какой-либо элемент из А равен нулю, что может быть или не быть желательным. –

0

Что вам нужно сделать, это определить элементы, которые вы хотите работать на. Я бы использовал FIND. Я сохраняю результаты в VI (Действительные показатели) и использую это для заполнения матрицы.

clear 
clc 

den = [2 0 2; 0 2 0; -2 -2 -2] 
num = ones(size(den)); 
frac = nan(size(den)); 

vi = (den ~=0) 

frac(vi) = num(vi)./den(vi) 

vi = (den == 0) 

frac(vi) = nan %just for good measure... 
+1

fyi: вам не нужно использовать find, вы можете напрямую использовать логические матрицы. Значение find - извлекать определенные значения индекса и/или сохранять пространство памяти, если только несколько значений истинны. –

+0

удален FIND по запросу JASON S – MatlabDoug

6

Векторизация ifs не существует, но есть некоторые варианты. Если вы хотите протестировать все или любые элементы true, используйте все или любую функцию.

Вот один пример условно модифицирующих значений матрицы:

b = A ~= 0;  % b is a boolean matrix pointing to nonzero indices 
       % (b could be derived from some other condition, 
       % like b = sin(A)>0 
A(b) = f(A(b)) % do something with the indices that pass 
A(~b) = g(A(~b)) % do something else with the indices that fail 
+0

Я не знал, что b (булева матрица) существовала до тех пор, пока вы не указали ее. Благодаря! – AnnaR

1

В общем случае, чтобы выполнить одну операции на некоторых элементах матрицы и другую операцию на остальных элементах, в одной строке раствор представляет собой:

Z = B .* X + ~B .* Y; 

где B - логическая матрица. Например,

Z = (A == 0) .* -1 + (A ~= 0) .* A; 

экземпляры A, но присваивает -1 всюду, где A равно нулю.

Однако, поскольку вопрос касается бесконечности или NaNs, это можно сделать еще более лаконично:

Z = FAV ./ A; % produces inf where A == 0 
Z = (A ~= 0) .* FAV ./ A; % produces NaN where A == 0 
+0

+1: Умный лайнер! – gnovice

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

  • Нет связанных вопросов^_^