2015-01-27 2 views
0

첫 번째 코드 줄은 "불연속 레이블"이있는 벡터를 만들고 두 번째 코드 줄은 레이블이 나타내는 인덱스에 1이있는 희소 행렬을 만듭니다. "눈"은 항등 매트릭스를 만들지 만 벡터 "a"가 훨씬 길더라도 스파 스 매트릭스를 만드는 효과는 여전히 유효합니다!이 Matlab/Octave 코드는 벡터로부터 부울 행렬을 어떻게 생성합니까?

무슨 일이 일어나는지 이해해 주시겠습니까?

octave:4> a = [1 3 5 7 9 2 4 6 8 10] 
a = 

    1 3 5 7 9 2 4 6 8 10 

octave:5> eye(10)(a,:) 
ans = 

Permutation Matrix 

    1 0 0 0 0 0 0 0 0 0 
    0 0 1 0 0 0 0 0 0 0 
    0 0 0 0 1 0 0 0 0 0 
    0 0 0 0 0 0 1 0 0 0 
    0 0 0 0 0 0 0 0 1 0 
    0 1 0 0 0 0 0 0 0 0 
    0 0 0 1 0 0 0 0 0 0 
    0 0 0 0 0 1 0 0 0 0 
    0 0 0 0 0 0 0 1 0 0 
    0 0 0 0 0 0 0 0 0 1 

답변

6

옥타브 eye(10)(a,:) 수단 표기 : - 크기 10 행렬 (eye(10))를 구축하고 a 의해 지정된 순서의 행을 선택 (a 행에 대응하는 최초의 인덱스로서 사용되어 있습니다 , 두 번째 색인으로는 :이며 "모든 열 가져 오기"를 의미합니다. 예를 들어 4 번째 항목이 인 결과 행의 4 행은 4 번째 항목에 a이 포함되어 있기 때문에 7입니다. 이 a만큼 당신이 원하는대로 될 수 있음을 분명이 설명에서

은 모든 값이 범위 1 ... 10 (이러한 eye(10)에서 사용할 수있는 행이다)의 정수 한한다.

Matlab에서는 "연쇄"색인 생성이 허용되지 않습니다. 먼저 변수에 eye(10)를 할당해야하고, 할 그 변수에 지수 :

m = eye(10); 
m(a,:) 

마지막으로, 약간의 "기술"참고 : 얻어진 행렬 형태가 아닌 logical (matlab에의 Boolean 데이터 유형)이며,도 그것은 sparse입니다. 대신 double 유형의 full 행렬입니다.

+0

이것이 옥타브를 좋아하는 이유 중 하나입니다. 임시 변수는 마음에 들지 않습니다. 어느 쪽이든, +1 : – rayryeng

+0

@rayryeng 나는 옥타브를 사용한 적이 없지만 매우 강력한 표기법 인 것 같습니다. 또한, 나는 자동적 인 방송을 모은다 :'bsxfun'을위한 필요, 맞지?! –

+1

정확히 :) ... 싱글 톤 차원 중 하나라도 1이면 옥타브는 암시 적으로 브로드 캐스팅을 처리 할 수 ​​있습니다. 그러나 이것이 사실이 아니라면,'bsxfun'은 Octave에서 지원됩니다 : https://www.gnu.org/software/octave/doc/interpreter/Broadcasting.html – rayryeng

관련 문제