MATLAB 을 사용하다 보면 struct 타입을 종종 사용하곤 합니다. 그리고 struct 타입을 모아서 배열로도 사용하곤 하는데 MATLAB 기본 함수중에 struct 타입 배열을 정렬하는 기능의 함수는 없는것 같더군요.

그냥 만들어 사용해도 되겠지만 검색을 조금 해보니 비슷한 코드를 발견했고 해당 코드를 정리해서 아래와 같은 함수로 만들었습니다.




이제 함수를 만들었으니 한번 사용해 보죠.

a = struct('id',1, 'data', [1:10])

b = struct('id',2, 'data', [2:11])

beforeVec= [b a]; % 두 struct 를 사용하여 배열로 만듬

sortedVec = struct_sort_by_field(beforeVec,1,1); % 첫번째 field 의 첫번째 인덱스 값에 대해 정렬

beforeVec.id % 기존 배열의 인덱스 확인

sortedVec.id % 정렬된 배열의 인덱스 확인

위 결과를 보면~ sortedVec 는 id 값에 따라 오름차순으로 정렬 된 것을 확인 할 수 있습니다.



프로그래밍을 배우면서 아마도 가장 처음 접하게 되는 알고리즘이 바로 정렬 알고리즘이 아닌가 생각되네요.

 

C++ 에서는 algorithm 헤더에 sort, stable_sort, partial_sort 와 같은 함수들이 정의되어 있습니다.

 

C++ STL 이 참 좋긴 하더군요. ㅋㅋㅋㅋ

 

partial_sort 는 말 그대로 일부를 정렬하겠다는 거로 이해하시면 될 것 같고

 

저는 처음에 sort 와 stable_sort 가 좀 헷갈리더군요. 무슨 차이일까… 하고요.

 

차이는 간단한데요. 동일한 값이 있을 경우 stable_sort 의 경우에는 정렬 하기 전의 순서가 정렬후에도 유지된다고 하더군요.

 

위 함수들의 사용법 등에 대해서는 아래 주소의 예제들을 참조하시면 쉽게 이해하실 겁니다.

 

http://www.cplusplus.com/reference/algorithm/sort/

http://www.cplusplus.com/reference/algorithm/stable_sort/

http://www.cplusplus.com/reference/algorithm/partial_sort/

 

저는 오늘 MATLAB 의 sort() 결과와 마찬가지로 정렬 결과 뿐만 아니라 인덱스도 정렬되어 나올 수 있도록 구성해 보도록 하겠습니다.

 

C++ 에서는 이런 경우 인덱스와 값을 pair 로 묶은 후에 정렬하는 방법이 있더군요.

 

예제는 다음과 같습니다. 아래 예제처럼 comparator 만 오름 차순 내림 차순에 따라 잘 설정하면 되더군요.

 

#include <iostream>

#include <vector>

#include <algorithm>

#include <random>

#include <ctime>

 

 

using namespace std;

 

 

#define N_SIZE (10)

 

 

typedef std::pair<int,int> int_int_pair;

 

bool comparator ( const int_int_pair& l, const int_int_pair& r) // 첫번째 값을 기준으로 내림차순 비교하는 comparator

{

return l.first > r.first;

}

 

 

 

int main()

{

vector<int_int_pair> A; // vector setting

 

srand( unsigned(time (NULL)));

 

for (int i=0; i<N_SIZE ; i++)

{

A.push_back(int_int_pair(i,i)); // (value, index) setting

}

 

random_shuffle(A.begin(), A.end()); // 마구 마구 섞기

 

 

cout << "정렬전\nValue\tIndex\n" ;

 

for (int i=0; i<N_SIZE ; i++) // 섞인거 확인하기

{

cout << A[i].first << "\t" << A[i].second << endl;

}

 

cout << "\n\n" ;

 

 

stable_sort(A.begin(),A.end(), comparator); // 정렬 하기

 

cout << "정렬후\nValue\tIndex\n" ;

for (int i=0; i<N_SIZE ; i++) // 정렬됐나 확인하기

{

cout << A[i].first << "\t" << A[i].second << endl;

}

 

return 0;

}

 

위 코드에 따라 다음과 같이 내림 차순 정렬 되게 됩니다.





  1. 종이눈 2018.04.25 12:40

    감사합니다^^ 인덱스 정렬에 내림차순까지 제가 필요했던게 전부 들어있네요

    • 남성 2018.04.25 19:12 신고

      도움되었다니 다행이네요. 방문해 주셔서 감사합니다. ^^

오늘의 포스팅에서는 MATLAB 기본 함수 몇 가지에 대해 설명해 보려 합니다.

 

  • diff(X, n) 함수는 인자간의 차이를 구하는 함수 입니다.

 

n 값은 차이를 구하는 횟수를 의미 합니다.

 

아래 예를 보면 쉽게 이해하실 겁니다.

 

 

diff(x, 2) 는 차이를 두 번 구하는 거죠. diff(x) 의 결과를 보면 [2 2 2 2] 니까 이 벡터에 대해 차이를 구하면 [0 0 0]이 나오게 되는 겁니다.

 

 

 

  • sortrows(X, n) 은 X matrix 를 n column index 기준으로 정렬하는 함수 입니다. default 는 오름차순입니다.

 

다음 예를 보죠. 1열을 기준으로 오름차순 정렬하는 예입니다.

 

 

2열을 기준으로 오름차순 정렬하는 예입니다.

 

 

다음 예는 1열을 기준으로 오름차순 정렬한 후에 1열에 같은 값이 있을 경우 3 열을 기준으로 오름차순 정렬을 합니다.

 

 

column index 앞에 – 를 붙여주면 내림차순 정렬을 하게 됩니다.

 

    


+ Recent posts