티스토리 뷰

있습니다. 긴 글 꼼꼼히 읽기 귀찮으신 분은 링크1링크2를 눌러보세요.


====


행렬을 좌우 또는 상하로 뒤집고 싶을 때가 있죠. 어차피 방법은 동일하니 여기서는 상하로 뒤집는 경우만 생각하겠습니다.



행렬을 뒤집는 덴 많은 방법이 가능합니다. 가장 쉽게(?) 생각나는 방법은 행렬의 index를 뒤집어서 행렬의 요소를 하나하나 다시 저장하는 것이겠습니다.


index_reversed = (size(a,1):-1:1);

a_reversed = zeros(size(a));

for i=1:size(a,1)

    i_new = index_reversed(i);

    for j=1:size(a,2)

        a_reversed(i,j) = a(i_new,j);

    end

end


쓸데없이 변수도 많이 만들어야 하고 코드가 지저분해 보입니다. 약간 더 발전한 형태로 다음처럼 만들 수도 있겠습니다.


a_reversed = zeros(size(a));

for i=1:size(a,1)

    for j=1:size(a,2)

        a_reversed(i,j) = a(end+1-i,j);

    end

end


콜론을 이용할 줄 알면 다음처럼 쓸 수도 있을 것이며,


a_reversed = zeros(size(a));

for i=1:size(a,1)

    a_reversed(i,:) = a(end+1-i,:);

end


index 다루기에 능숙해졌다면 다음도 가능합니다.


a_reversed = a(size(a,1):-1:1,:);


물론 제가 저런 시도들을 모두 해봤다는 건 절대 아닙........


====


행렬을 뒤집는 수준의 간단한 스킬은 구글링으로 충분히 알아낼 수 있습니다. 검색어를 다음과 같이 해서 구글링을 해보았습니다.


matlab how to reverse matrix


문법에 맞게 쓰려면 how to reverse a matrix in matlab 이겠지만, 영어공부하려는 건 아니니까 넘어갑시다. 검색하니 아래처럼 검색결과 맨 앞에 나옵니다. 



맨 앞에 나오는 flipud와 fliplr이 행렬을 뒤집는 매트랩 함수입니다. flip은 뒤집는다는 뜻이고 (동전 뒤집기를 coin flipping이라고 하죠.) ud는 up/down, lr은 left/right을 뜻합니다. 이제 행렬을 위아래로 뒤집으려면 아래처럼 한줄만 쓰면 됩니다.


a_reversed = flipud(a);


이걸 응용하면 행렬을 180도 회전할 수도 있습니다. 아래처럼 쓰면 되겠지요.


a_rot180 = flipud(fliplr(a));


행렬의 180도 회전은 행렬을 90도 회전시키는 rot90을 두 번 써도 가능합니다. 똑똑한 매트랩은 위처럼 쓰니 "180도 돌릴려고? 이거보단 rot90(x,2)를 쓰는게 가독성 면에서 더 좋을거야~"라고 아래처럼 추천도 해주네요. 



행렬의 180도 회전은 이미지를 회전시키는 imrotate와도 연관성이 있습니다. 이건 다음에 기회가 되면 다시 설명하겠습니다. 이제 행렬을 뒤집을 땐 flipud와 fliplr로 한줄에 끝냅시다.


끗.



- 게으른 둔재

댓글