根据Matlab中的第二列对具有相同编号的第一个排序列进行排序?

时间:2012-01-31 21:18:54

标签: matlab

我有一组数据并要求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 =未检测到,D =检测到。如果您仔细注意,如果第一列具有相同的数字,例如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');

2 个答案:

答案 0 :(得分:2)

您可以使用sortrows,但必须先将mydata转换为n-by-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

答案 1 :(得分:0)

我现在没有MATLAB的副本,所以我无法验证代码,但我相信MATLAB的排序算法是stable。因此,如果您对第二列进行排序,那么在第一列上排序,您应该得到您想要的。

也就是说,所有'U'将被组合在一起,并且在第一次排序后(第二列),所有'D'将被组合在一起。然后,即使在第二次排序后(在第一列上),U和D也将为每个数值组保持组合在一起。