문제

다음과 같은 기본 if 문이 있다고 가정해 보겠습니다.

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

문제는 A가 단순한 숫자가 아니라 벡터라는 점이다.Matlab은 A에 0이 아닌 요소가 없으면 true를 반환합니다.내가 찾고 있는 것은 벡터화된 것입니까?A의 각 요소에 대해 위의 if 문을 수행하는 방법입니다.

사실 저는 이 일을 가능한 한 빨리 하고 싶습니다.

도움이 되었습니까?

해결책

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

다른 팁

벡터화된 if가 존재하지 않지만 몇 가지 옵션이 있습니다.모든 요소 또는 모든 요소가 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

일반적으로 매트릭스의 일부 요소에서 하나의 작업과 나머지 요소에서 다른 작업을 수행하기 위해서는 한 줄 솔루션이 다음과 같습니다.

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

여기서 B는 논리 행렬입니다. 예로서,

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

A를 복사하지만 A가 0이라는 모든 곳에 -1을 할당합니다.

그러나 질문은 무한대 또는 NAN을 다루기 때문에 더 간결하게 수행 할 수 있습니다.

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

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

또는 단일 라이너의 경우 표시 대신 조건문을 사용할 수 있습니다.

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

당신이해야 할 일은 작동하려는 요소를 식별하는 것입니다. 나는 찾을 것이다. 결과를 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...
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top