Elementwise ifs в matlab - существуют ли они? - PullRequest
3 голосов
/ 07 мая 2009

Скажем, у меня есть следующее основное выражение if:

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

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

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

Ответы [ 5 ]

6 голосов
/ 07 мая 2009

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

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

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
4 голосов
/ 08 мая 2009
B = zeros(size(A));
B(A~=0) = FAV./A(A~=0);  
B(A==0) = NaN;
1 голос
/ 08 мая 2009

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

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

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

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

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

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

Z = FAV ./ A; % produces inf where A == 0
Z = (A ~= 0) .* FAV ./ A; % produces NaN where A == 0
0 голосов
/ 07 мая 2009

Что вам нужно сделать, это определить элементы, с которыми вы хотите работать. Я бы использовал 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...
0 голосов
/ 07 мая 2009

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

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

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

y = x./A(A~=0); % divides x by all non-zero elements of A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...