2014-06-13 4 views
5

누군가 예를 들어 왜 결과가 1x6 벡터인지 설명해 주실 수 있습니까? 예 B에서 결과가 1x4 벡터 인 반면에 말이죠.벡터로 인덱싱

예제 B에서 newvec의 크기를 1x6 벡터로 미리 정의하면 결과가 올바른 1x6 벡터가됩니다. 무슨 일이 일어나고 있는지 이해하지 못한다.

예 A

vec = [0 2 3 0 5 0]  %1x6 
newvec(vec == 0) = 1 %produces a 1 x 6 vector 

예 B

vec = [0 2 3 0 5 3]  %1 x 6 
newvec(vec == 0) = 1 %produces a 1 x 4 vector 
+0

예가 의미가 없습니다. 가지고있는 문제에 대한 올바른 코드를 추가하십시오. 추가 한 코드는 항상 1x6 벡터를 부여합니다. – ASantosRibeiro

+1

@ASantosRibeiro : 각 예제 앞에'clear newvec'를 입력하지 않은 경우 : –

+1

+1 흥미로운 질문. 대답은 무슨 일이 일어나고 있는지를 알려주지 만 무언가를 추가하는 것입니다. 작업 공간에 벡터가없고 예를 들어'A (5) = 1'과 같이 할당하면 (예 :'A'가 존재하지 않았던 경우), matlab은'1 '를 만들고 나머지는 0으로 채 웁니다. 시도 해봐. 또한 매트릭스를 이렇게 확장 할 수 있습니다. 예를 들어'x = 1 : 5; x (10) = 1', 시도해보십시오 & 요소 6 - 9를 0으로 채워야합니다. 나는 당신이 비슷한 방식으로 문제를 생각할 수있을 것 같아요. matlab에 1과 4의 위치에 할당하여 4시에 멈추도록했습니다. – Dan

답변

3

편집 : 오류를 지적 댄에 감사합니다.

vec == 0은 논리 행렬을 생성합니다. 이제 newvec의 크기가 정의되지 않은 경우 다음 newvec(vec==0) =1은 항상 행 벡터 newvec를 새로 만듭니다. 당신이 다음 newvec(v==0) = 1newvec의 크기를 변경할 수 없습니다 newvec의 크기를 미리 정의 할 때

다음 단계는이 newvec

temp1 = logical_matrix(:); 
trailing_zeros = number of zeros after the occurrence of last `true` value in temp1 
size(newvec) = [1, numel(logical_matrix) - trailing_zeros] ; 

의 크기를 결정하는 것, 그것은 단지 해당 인덱스에 1를 할당하는 vec==0에 대한 true입니다.

+3

"은 논리적 행렬에서 참 (1) 값의 수와 동일한 크기의 벡터 newvec를 생성합니다. 'newvec'는 논리 행렬에서 마지막 'true'값의 위치 크기가됩니다 'true '값의 수는 아닙니다. – Dan

+2

* "... 그 크기는 논리 매트릭스의 실제 (1) 값의 수와 같습니다.이 경우 4"*입니다. 지금은 그렇지 않습니다. Example A의 'newvec'크기는 1 x 6이고 원래 'vec'에는 3 개의 'trues'만 있기 때문입니다. 'newvec'의 크기는 last *'true'의 위치에 달려 있습니다. 이것은 다소 이상합니다. –

+0

@Nishant : 나는 당신이 때때로 당신의 답과 코멘트에서 MATLAB 문법에 실수를 범했음을 알았다. 다음 번에 답을 작성하기 전에 실제로 MATLAB을 사용하고 출력을 화면에 표시 할 것을 제안하십시오. 그렇게하면 OP를 비롯한 다른 사람들을 오도하지 않습니다. – rayryeng

4

인지는 알 수 없습니다. MathWorks와 IMHO의 디자인 선택입니다. 실제로는 principle of least surprise을 위반합니다.

premature optimization (RAM 사용량 측면에서) 약간의 냄새가 난다거나 MATLAB 내부가 find 전화를 걸거나 이와 비슷한 것을 냄새가납니다. 그러나 그것은 정말로 누구나 추측입니다. , MATLAB 만이 큰는 인덱스를 유지하기 위해 필요로하게 두 번째 라인을 호출 할 때

newvec = (vec == 0); 
4

newvec 경우 존재하지 않습니다

당신이 원하는 것을 할 수있는 일반적인 방법

이있다 당신은 1으로 설정하고 있습니다.

당신이 실제로하고있는 것은 :

newvec([1 4 6]) = 1; 또는

마찬가지로 vec 실제로 2D/3D 등 행렬, newvec가 N 인 1 x N으로 나올 것 인 경우

newvec([1 4]) = 1;

가장 높은 색인 번호는 무엇이든 상관없이 원본 행렬의 모양을 유지하지 않습니다.

그래서 이러한 경우에 당신이 필요로 다음 중 하나

1)을 미리 할당 newvec 먼저 vec의 크기합니다.

2) 대신 newvec = (vec==0)을 입력하십시오.