2016-06-03 1 views
1

행렬의 논리 1 색인을 위치를 변경하지 않고 다른 변수로 내보내려고합니다.Matlab에서 논리 색인을 사용하여 행렬 내보내기

l = logical([1 0 1 1 ;... 
      1 1 1 0]); 

A = [1 2 3 4;... 
    5 6 7 8]; 

B = zeros(size(A)); 
B = A(l) 

가 생산 : 나는 예를 사용하여 내 의심을 설명하기 위해 노력하고 아래

B = 

    1 
    5 
    6 
    3 
    7 
    4 

그러나 나는 점점 관심 것은을

B = 

1  0  3  4 
5  6  7  0 

누군가가 나를 도울 수 있습니까? 감사합니다

답변

0
l = logical([1 0 1 1 ;... 
      1 1 1 0]); 

A = [1 2 3 4;... 
    5 6 7 8]; 

A .* l % element-wise multiplication 

없는 PROB, 당신은 ;-) 환영 수락, 질문 폐쇄! 의 xD


편집

나는 두려워 유래 모두가 원래 묻는 무슨 관련이없는에도 불구하고, 더 길고 더 자세한 대답을 만들려고 노력에 의해의 다른 답변을 이길하려고 페이지되었다 해요 . 특정 질문에 정확히 적은 시간 안에 빠르고 간단하고 간단한 솔루션을 제공하는 것은 아닙니다. 수에버 (Suever)는 물어 보지 않은 질문에 대답함으로써 즉시 upvote가됩니다. 난 그냥 말하고 싶은

~l*default_value + A.*l 

: 하나는 내 솔루션 및 사용을 채택 할 수있다, 당신은 다른 기본 옵션 다음 0을 원한다면 :

나는 또한 게임 내 대답을 편집 할 수 있습니다 그것은 가능합니다.

EDIT2

tic; 
for i = 1:1000000 
    B = A.*l; 
end; 
toc 
>> Elapsed time is 2.18214 seconds. 

tic; 
for i = 1:1000000 
    B=zeros(size(A)); 
    B(l)=A(l); 
end; 
toc 
>>Elapsed time is 13.9691 seconds. 


자신을 위해 선택합니다.


EDIT3 (기본 값! = 0)

>> tic; for i = 1:1e6; B = A.*l+100*(~l); end; toc 
Elapsed time is 4.17261 seconds. 
>> tic; for i = 1:1e6; B=100*ones(size(A)); B(l)=A(l); end; toc 
Elapsed time is 14.2126 seconds. 
+1

우, 내가 어떻게 그렇게 바보가 될 수 있니? (... 어쨌든 thanks @tim :) – pkj

+1

나는 ans를 받아 들일 것이다. 그러나 나는 보통 사람들이 반응하도록 허용한다. – pkj

+0

@pkj : 잊지 마세요. 더 이상 다른 대답은 없습니다. 그래서 upvote + accept. – tim

1

이 특정 예를 들어 팀의 접근 방식 @ 사용할 수있는 동안은,보다 일반적인 해결책은 인덱스에 논리적 배열을 사용하는 것입니다 모두 당신이 할당하고있는 배열을 에서 가져 오는 것. 이 값은 ATRUE 위치의 값을 I으로 잡고 B의 해당 위치에 배치합니다.

I = logical([1 0 1 1; 1 1 1 0]); 
A = [1 2 3 4; 5 6 7 8]; 

B = zeros(size(A)); 
B(I) = A(I); 

당신은 예를 들어 0 이외로 B에서 "기본"값을 원하는 경우 요소 현명한 곱셈 방법은 작동하지 않습니다. 그냥 A 제로 아웃 값을 원하는 경우

% Initialize B to an array of 100's 
B = 100 * ones(size(A)); 

% Replace the elements specified by the logical array 
B(I) = A(I); 

% 1 100  3  4 
% 5  6  7 100 

는 다른 방법으로는, 당신은 또한이 작업을 수행 할 논리적 인덱싱을 사용할 수 있습니다.이 숫자 1에서 l을 구별하는 것은 매우 어렵 기 때문에

(!) 참고로
A(~I) = 0; 

, 변수 이름을 l을 사용하지 않도록하려고합니다.

+0

여기에 'B = 0 (size (A))'선언이 필요하다는 것에주의해야합니다. 그렇지 않으면 벡터가 생길 것입니다. 감사합니다 @ 수퍼 – pkj