티스토리 뷰

matlab

전치행렬이 켤레복소수로 나올 땐?

게으른 the lazy 2018. 10. 24. 02:47

[ 빠르게 답만 원하시는 분들을 위해 ]


'는 전치행렬 transpose matrix를 만들 때 복소수를 켤레복소수 complex conjugate로 만듭니다. 그냥 대칭이동만 하려면 ' 대신 .'을 쓰면 됩니다.


a'   % a의 complex conjugate transpose

a.'  % a의 non-conjugate transpose


====


[ 딱히 몰라도 되지만 알아두면 아는 척 하기 좋은 쓸데없는 추가설명 ]


1) complex conjugate transpose를 만드는 방법은 두 가지가 있습니다. 둘 모두 결과는 동일하지만 가독성의 차이는 있습니다. 본인 스타일에 맞게 쓰시면 됩니다.


a'            % 짧지만 사람에 따라 가독성이 떨어질 수 있음

ctranspose(a) % 사람에 따라 가독성이 올라갈 수는 있으나 타이핑하기 귀찮음



2) non-conjugate transpose를 만드는 것도 마찬가지로 두 가지 방법이 있습니다.


a.'          % 짧지만 사람에 따라 가독성이 떨어질 수 있음

transpose(a) % 사람에 따라 가독성이 올라갈 수는 있으나 타이핑하기 귀찮음



3) 행렬의 원소가 실수라면 당연히 '든 .'든 결과는 동일합니다.



4) 매트랩은 scalar 하나도 1x1 행렬로 취급합니다. 따라서 복소수 하나의 complex conjugate를 만드는 방법도 다음처럼 세 가지가 있습니다. 역시 본인에게 편한 방법을 골라 쓰면 됩니다.


b = 1+2i;               % 2i, 2*i 모두 가능하지만 2i를 추천합니다. 이유는 아래에 있습니다.

conj_b = b';            

conj_b = conj(b);

conj_b = ctranspose(b); % b가 scalar일지 array일지 모른다면 이렇게 쓸 수 있습니다.



5) 매트랩에서 단위복소수(또는 허수단위) imaginary unit은 i나 j로 쓸 수 있습니다. 보통 i를 많이 쓰지만 전기/전자 계열에서는 전류 기호와의 혼동을 피하기 위해 j를 많이 씁니다. 위에 설명하였듯이 매트랩에서는 2i와 2*i를 동일하게 인식합니다. 하지만 2i라고 쓰는 것이 좋습니다. 2*i라고 쓰려면 i가 앞에서 이미 선언된 적이 없어야 합니다. 그 이유는 아래처럼 의도하지 않은 계산이 되거나, 문법상으로는 가능하더라도 가독성을 크게 떨어트리고 코드분석을 어렵게 하는 원인이 되기 때문입니다


b = 1+2i;     % 여기서 i는 sqrt(-1)입니다.

 

for i=1:10

    b = 1+i*2i;   % 앞의 i는 for loop의 index이고, 뒤의 i는 sqrt(-1)입니다. 

    c = 1+2*i;    % 여기서 i는 for loop의 index입니다.

end


for loop의 index로 가장 많이 쓰이는 문자가 i와 j임을 생각하면 위험성이 눈에 딱 보이시죠? 그래서 아래처럼 매트랩이 가이드도 해줍니다. i도 아예 1i로 쓰라고 알려주네요.



문자 i나 j를 아예 쓰지 않고 복소수를 만들고 싶으면 아래처럼 complex 함수를 이용할 수 있습니다. 


b = 1+2i;

c = complex(1,2);  % 두 결과는 동일



6) 복소수의 실수부 real part와 허수부 imaginary part는 각각 real과 imag 함수로 뽑아낼 수 있습니다.


b = 1+2i;

 

b_real = real(b);

b_imag = imag(b);



7) 구글 검색은 아래처럼 해봤습니다. 처음에 딱 나오네요.




8) 정말 사족입니다만, for loop의 index로 i,j,k를 많이 쓰는 건 이 양반 이름에서 유래됐다고 합니다.



- 게으른 맽랩



====



[refs. and links]

transpose

ctranspose

conj

real

imag

i

complex


댓글