Pergunta

Say Eu tenho o seguinte básica instrução if:

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

O problema é que A não é um número simples, mas um vetor. Matlab retorna true se nenhum elemento em A é 0. O que estou procurando é uma vetorizado? forma de perforimg a declaração se-acima para cada elemento em A.

Na verdade, eu simplesmente quero fazer isso o mais rápido possível.

Foi útil?

Solução

B = zeros(size(A));
B(A~=0) = FAV./A(A~=0);  
B(A==0) = NaN;

Outras dicas

ifs Vectorized não existem, mas há algumas opções. Se você quiser teste para todos ou quaisquer elementos de verdade, usar a toda ou qualquer função.

Aqui está um exemplo de valores condicionalmente modificando de uma matriz:

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

De uma maneira geral, para realizar uma operação em alguns elementos de uma matriz e uma outra operação sobre os elementos restantes, uma solução de uma linha é:

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

, onde B é uma matriz lógica. Como exemplo,

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

exemplares A mas cessionários -1 em todos os lugares que A é zero.

No entanto, porque a pergunta lida com infinito ou NaNs, isso pode ser feito ainda mais sucinta:

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

Você está procurando todos os elementos diferentes de zero? Você pode fazer isso de duas maneiras.

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

Ou para um one-liner, você pode usar uma condicional no lugar de indicies

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

O que você precisa fazer é identificar os elementos que você deseja operar. Gostaria de usar FIND. Eu armazenar os resultados em VI (indicies válidos) e usar isso para preencher a matriz.

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...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top