Elemento a elemento IFS em Matlab - que eles existem?
-
08-07-2019 - |
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.
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...