Сортировать первый отсортированный столбец с одинаковым номером на основе второго столбца в Matlab? - PullRequest
1 голос
/ 01 февраля 2012

У меня есть набор данных, и я прошу 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)

Данные были получены следующим образом:

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 = Detects,Если вы внимательно заметите, если первый столбец имеет такое же число, скажем, 0,41, Matlab отсортирует первый столбец и проигнорирует порядок второго столбца.Я хотел бы, чтобы 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 = Не обнаружить. Спасибо за вашу помощь и время.

Редактировать: я также должен добавить, что sortrow не работает, потому что я быхотел бы сохранить структуру данных так, чтобы следующий код следовал

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');

end

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012

Вы можете использовать sortrows, но сначала нужно преобразовать mydata в массив ячеек n-на-2:

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'

Вы можете выполнить обратное преобразование, вызвав

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

Очевидно, что если вы преобразуете свои данные так, что mydata{2} будет числовым, вы можете просто отказаться от массива ячеек и сразу вызвать sortrows.

0 голосов
/ 01 февраля 2012

У меня сейчас нет копии MATLAB, поэтому я не могу проверить код, но я считаю, что алгоритм сортировки MATLAB стабилен .Из-за этого, если вы сортируете по второму столбцу, ПОТОМ сортируете по первому столбцу, вы должны получить то, что вы хотите.

То есть все «U» будут сгруппированы вместе, и все »D будут сгруппированы вместе, после первой сортировки (во втором столбце).Тогда даже после второй сортировки (в первом столбце) буквы U и D будут сгруппированы для каждой группы числовых значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...