아래 행렬의 두번째 열은 [2 1 6 3]' 이다.
1 2 3
2 1 5
4 6 4
2 3 2
이 두번째 열의 수 기준으로 크기 역순 나열한 행렬을 구하고 싶다. (내림차순)
4 6 4
2 3 2
1 2 3
2 1 5
어떻게 해야 하는가?
먼저, 주어진 행렬을 v라고 하자.
1.
먼저 필요한 것은, 원래 행렬 v의 2열 정보이다.
모든 행의 2열 정보가 필요하다.
즉, v(:, 2)가 필요하다.
2.
2열은 [2 1 6 3]'인 상태다. 이 행렬을 크기순으로 나열해서 y라는 변수에 넣자.
y = sort(v(:, 2))
y는 즉 [1 2 3 6]'이 된다!
3.
하지만 2열을 크기순으로 나열하기만 하는 것은 의미가 없다. 크기순으로 나열한 각 수에 대한 본래 행번호가 어떻게 되는지도 함께 알아야 한다. 결국 목적은 행을 재배치하는 것이기 때문이다.
이를 위해 함께 필요한 것은, sort() 이전의 2열 인덱스이다. 즉, v(:, 2)라는 행렬의 인덱스가 필요하다.
행 순서대로 2열의 수를 뽑아냈기 때문에, 2열의 인덱스 순서는 행 순서가 된다.
4.
이제 여기서 in이라는 변수를 추가하여 여기에 각 수의 인덱스 정보를 담을 것이다.
[y, in] = sort(v(:, 2))라고 입력하면, 아래와 같은 결과가 나온다. sort된 [1 2 3 6]'에 대응하여, in에는 [2 1 4 3]'이라는 인덱스정보(행)가 담긴다.
사실 이 단계는 나도 이해가 아직 잘 안간다. sort를 해도 v(:, 2)행렬의 인덱스 정보를 기억하고 있는 것인가? 어떤 매커니즘으로 in변수에 [2 1 4 3]'이 담기는지 잘 모르겠다. sort()를 했으면 뭔가 sort()된 결과의 행렬에 대한 인덱스가 새로 부여될 것만 같은데, 어째서 sort()이전의 v(:, 2)행렬에 대한 인덱스와 호응이 되는지 모르겠다.
아시는 분 댓글로 말해주시면 안될까요?
ㅠㅠ 무플인 내 블로그에서 사실 기대하는 것은 없다.. 교수님께 여쭤봐야겠다.
5.
이제 초기에 주어진 행렬 v를 재배치해야한다. 단계 4에서 우리는 sort()된 [1 2 3 6]'이라는 행렬을 얻었으며 in이라는 index변수에 이 수들과 대응하는 행인 [2 1 4 3]'행렬을 담았다. 이 인덱스 행렬을 이용해서 v행렬의 행을 재배치할 것이다. 다음과 같다.
in변수에 담긴 인덱스행렬은 sort()된 행렬 [1 2 3 6]'에 대응하기 때문에, in행렬의 성분은 '뒤에서부터' 뽑아내야 우리가 원하던 내림차순의 2열로 정리할 수 있다.
그래서 v(행,열) 구조의 '행' 부분은 'in(end:-1:1)'로 작성한다. 그리고 모든 열을 나열할 것이기 때문에 '열'부분은 ':'로 작성한다.
그래서 완성했다!
2열의 수의 크기 역순으로 행을 재배치하기.
2열 수의 내림차순으로 행을 재배치하기.
'수학' 카테고리의 다른 글
[Matlab] 행렬을 그래프로 그리기 | Plotting Arrays | plot, stem, bar (0) | 2021.03.18 |
---|---|
[Matlab] 벡터를 그래프로 그리기 | Plotting Arrays | plot, stem, bar (0) | 2021.03.18 |
[Matlab] 10의 거듭제곱 수열 만들기 (0) | 2021.03.18 |
[Matlab] 시그마 연산 예제 (0) | 2021.03.18 |
[Matlab] Matrix 계산 | 행렬 계산 (0) | 2021.03.16 |