2012-01-31 9 views
1

나는 이런 식으로 나온 데이터 세트를 가지고 있고이Matlab의 두 번째 열을 기준으로 동일한 번호를 가진 첫 번째 정렬 된 열을 정렬 하시겠습니까?

filename=input('Type filename.txt: ','s'); 
fid=fopen(filename); 
mydata=textscan(fid,'%f %c','headerlines', 1, 'delimiter','\t'); 
fclose(fid); 

% sort data 
[mydata{1},idx] = sort(mydata{1}) 
mydata{2} = mydata{2}(idx) 

데이터처럼 오름차순으로 정렬 matlab에 물어 :

0.41 U 
0.41 U 
0.41 U 
0.41 D 
0.41 U 
0.41 D 
0.41 U 
0.41 U 
0.41 D 
0.41 U 
0.42 U 
0.42 D 
0.42 U 
0.42 U 
0.42 U 
0.42 D 
0.43 U 

U = undetect 및 D = 감지합니다. 주의 깊게 살펴보면 첫 번째 열의 숫자가 같은 경우 (예 : 0.41) Matlab은 첫 번째 열을 정렬하고 두 번째 열의 순서는 무시합니다. 그 첫 번째 열에서 같은 수를 본다면 내가 매트랩하는 것입니다 싶습니다 그렇다면 두 번째 열을 기반으로 수를 놓고, U는 D.
최종 정렬 된 데이터는이 싶습니다하기 전에 먼저 :

0.41 U 
0.41 U 
0.41 U 
0.41 U 
0.41 U 
0.41 U 
0.41 U 
0.41 D 
0.41 D 
0.41 D 
0.42 U 
0.42 U 
0.42 U 
0.42 U 
0.42 D 
0.42 D 
0.43 U 

어떻게 든 쉽게 만들 수 있다면 1 = 감지하고 0 = 감지하지 않음 도움과 시간에 감사드립니다.

편집 : 나는 다음과 같은 코드가

o=mydata{1} %index the first column of the array mydata 


c = zeros(size(mydata,1),1); % preallocate empty matrix 
c = mydata{2} == 'U'; 
for i = 1:size(mydata,1) 
curValue = mydata{i,2}; 
data{i,3} = ~isempty(curValue) && ischar(curValue) && strcmp(curValue ,'U'); 

최종

+0

질문을 더 잘 이해하려면 데이터도 게시하십시오. –

+1

가능한 복제 http://stackoverflow.com/questions/8620185/sort-columns-in-matlab – Phonon

+0

사실은 해당 게시물의 확장입니다. – Amateur

답변

2

당신은 sortrows를 사용할 수 있지만 처음 n 개의 별 2 셀 어레이에 mydata을 변환 할 수 있습니다,

mydata = [num2cell(mydata{1}),num2cell(mydata{2})]; 

cs = sortrows(mydata,[1,-2]) %# sort the first col ascending, then second descending 
cs = 
    [0.41] 'U' 
    [0.41] 'U' 
    [0.41] 'U' 
    [0.41] 'U' 
    [0.41] 'U' 
    [0.41] 'U' 
    [0.41] 'U' 
    [0.41] 'D' 
    [0.41] 'D' 
    [0.41] 'D' 
    [0.42] 'U' 
    [0.42] 'U' 
    [0.42] 'U' 
    [0.42] 'U' 
    [0.42] 'D' 
    [0.42] 'D' 
    [0.43] 'U' 

당신은 그것을 backtransform 수 분명히

mydataSorted = {cat(1,cs{:,1}),cat(1,cs{:,2})}; 

를 호출하여 경우 mydata{2}이 숫자가되도록 데이터를 변환하면 셀 배열을 포기하고 sortrows을 바로 호출 할 수 있습니다.

+0

시도한 정렬 오류 및이 오류가 발생했습니다. mydata = [47x1 double] [47x1 char] ??? 색인이 행렬 크기를 초과합니다. 오류 ==> sortrows> sort_cell_back_to_front at 137 ndx = ndx (ind); ==> sortrows at 90 에 오류가 있습니다. ndx = sort_cell_back_to_front (x_sub, col); – Amateur

+0

@TransHuynh :'sortrows' 작업을하기 위해'mydata'를 어떻게 변형 시켰는지를 추가했습니다. – Jonas

+0

고맙습니다. 그것은 효과가있다! – Amateur

0

내가 사본이없는 따를 수 있도록 데이터 구조를 유지하고자하기 때문에 나는 또한 작동하지 않는 sortrow을 추가해야합니다 지금은 MATLAB의 코드를 확인할 수 없지만 MATLAB의 정렬 알고리즘은 stable입니다. 따라서 두 번째 열을 정렬 한 다음 첫 번째 열을 정렬하면 원하는 것을 얻을 수 있습니다.

즉, 모든 'U'가 함께 그룹화되고 모든 'D'가 두 번째 열의 첫 번째 정렬 후에 함께 그룹화됩니다. 그런 다음 두 번째 정렬 (첫 ​​번째 열에서) 후에도 U와 D는 각 숫자 값 그룹별로 함께 그룹으로 유지됩니다.

관련 문제