MATLAB: как отсортировать матрицу по определенному имени столбца, а также позволить именам строк следовать порядку?

Я новичок в MATLAB. У меня есть структура данных с именем da. Я хочу отсортировать первый столбец da.mat и позволить da.rid и другим столбцам следовать измененному порядку. da.cid содержит имена столбцов, а da.rid содержит идентификаторы строк.

da = 
    mat: [22268x377 single]
    rid: {22268x1 cell}
    rhd: {''}
  rdesc: {22268x1 cell}
    cid: {377x1 cell}
    chd: {0x1 cell}
  cdesc: {377x0 cell}

Кроме того, если я хочу использовать какой-то другой столбец вместо первого столбца da.mat и который я получу из da.cid, как я могу этого добиться? Например, если я хочу найти имя столбца 'A02' в cid и использовать его для выбора определенного столбца da.mat для сортировки. Не могли бы вы мне помочь? Спасибо.

Вуди


person woodylin    schedule 15.05.2014    source источник
comment
Спасибо за комментарий. Мой вопрос на самом деле совсем другой. Я хочу отсортировать один из столбцов в структуре данных и заставить другие столбцы (особенно избавиться) следовать тому же порядку.   -  person woodylin    schedule 15.05.2014
comment
я отзываю свой дубликат   -  person JamesENL    schedule 15.05.2014
comment
Под other columns что вы подразумеваете? То есть other столбца других полей? Если да, то как это возможно, потому что другие поля не имеют того же размера, что и da.mat.   -  person Divakar    schedule 15.05.2014
comment
Да, я имел в виду другие столбцы в самом da.mat.   -  person woodylin    schedule 15.05.2014


Ответы (1)


Предполагая, что под другими столбцами вы имеете в виду другие столбцы самого da.mat, вы можете попробовать это -

[val,ind] = sort(da.mat(:,1))
da.mat = da.mat(ind,:)
da.rid = da.rid(ind)

Если вы хотите использовать какой-либо другой номер столбца вместо 1 для сортировки и на основе имен в поле cid, используйте это -

cid_matchcol =  'A02'; %// column name to be used from `da.cid` to choose column of `da.mat`

base_col = find(strcmp(da.cid,cid_matchcol),1)
[val,ind] = sort(da.mat(:,base_col))
da.mat = da.mat(ind,:)
da.rid = da.rid(ind)
person Divakar    schedule 15.05.2014
comment
Отсортировав первый столбец с помощью da.mat(:,1), вы извлекли его значение и индекс. Затем вы назначаете индекс для rid. Да, это то, что я хотел! Спасибо!! - person woodylin; 15.05.2014
comment
Привет, Divakar. Не могли бы вы подробнее объяснить, что делает da.mat(ind,:)? Разве ind не только индекс? Как матлаб узнает, какой столбец сортировать? - person woodylin; 15.05.2014
comment
da.mat(ind,:) имеет :, который указывает MATLAB отсортировать все столбцы. Если бы я написал da.mat(ind,2), он отсортирует только второй столбец, da.mat(ind,3) для третьего столбца и так далее. - person Divakar; 15.05.2014
comment
Кроме того, могу ли я указать имена столбцов с помощью cid для сортировки (da.mat (:, 1))? - person woodylin; 15.05.2014
comment
имена столбцов или номера столбцов? - person Divakar; 15.05.2014
comment
cid содержит имена столбцов. - person woodylin; 15.05.2014
comment
Ну, вы не можете индексировать столбцы матриц только с именами, а по именам я предполагаю строки. Вам нужны числа, начинающиеся с 1. Например, если имя столбца 'col1', вы не можете сказать da.mat(ind,'col1'), так как это не имеет смысла для MATLAB. - person Divakar; 15.05.2014
comment
Но я должен иметь возможность получить индекс столбца из имен столбцов, верно? Например, col1 имеет порядковый номер 1 в cid. - person woodylin; 15.05.2014
comment
Дайте нам пример значений cid? Это может дать нам некоторое представление о том, что вы ищете. 'col1' был просто примером. Что, если в cid у вас есть такие имена, как {'john', 'mike'}, как тогда MATLAB узнает? - person Divakar; 15.05.2014
comment
cid имеет такие имена столбцов, как A01, A02, A03 и так далее. Я надеюсь отсортировать столбец A02. A02 должен быть вторым столбцом. Это должно быть написано как sort(da.mat(:,2)). Я просто хочу заменить 2 на A02. - person woodylin; 15.05.2014
comment
Я думаю, могли бы мы получить номер индекса из cid на основе имени столбца A02. И мы могли бы поставить порядковый номер вместо 2. - person woodylin; 15.05.2014
comment
Спасибо! Это то, что я ожидал! Функция find()! - person woodylin; 15.05.2014
comment
Может быть, добавить это дополнительное требование использования da.cid для индексации столбцов da.mat в свой вопрос и, таким образом, сделать его очень безопасным от присвоения его как дублирующего вопроса? Таким образом, дополнительный код также останется в контексте, так как комментарии часто удаляются модами. - person Divakar; 15.05.2014
comment
Я отредактировал свой вопрос. Пожалуйста, посмотрите, если мне нужно добавить больше вещей. Спасибо за помощь искренне. - person woodylin; 15.05.2014
comment
Внес несколько правок в ваш вопрос. Надеюсь, они не расходились с вашими первоначальными намерениями. - person Divakar; 15.05.2014
comment
Следуйте этому ответу и используйте последние 5 строк кода. - person Divakar; 15.05.2014
comment
Спасибо за помощь! - person woodylin; 15.05.2014