如何基于两列对矩阵进行排序

时间:2011-07-13 15:56:17

标签: matlab datetime sorting date matrix

我正在尝试使用MATLAB基于两列对单元格矩阵进行排序:

ticker date price
msft 1/9/11 19.8
msft 1/8/11 18.7
csco 1/8/11 9.8
csco 1/9/11 10.0

我想先按日期排序矩阵然后按自动收报机排序,所以我想要的结果是:

ticker date price
csco 1/8/11 9.8
msft 1/8/11 18.7
csco 1/9/11 10.0
msft 1/9/11 19.8

任何人都知道我该怎么做?感谢。

4 个答案:

答案 0 :(得分:5)

我会使用datenum将日期列转换为相应的序列日期编号,并使用sortrows按照所需的顺序对数据进行排序。

这是一些代码;假设d是您给出的示例中的4x3单元格数组:

d = 

'msft'    '1/9/11'    [19.8000]
'msft'    '1/8/11'    [18.7000]
'csco'    '1/8/11'    [ 9.8000]
'csco'    '1/9/11'    [     10]
  • 将日期列转换为arrayfun

    的数字
    d(:,2) = arrayfun(@(x){datenum(x)},d(:,2));
    
  • 使用sortrows(日期优先,然后是股票代码)

    对矩阵进行排序
    d = sortrows(d,[2 1]);
    
  • 用包含datestr的字符串替换日期。

    d(:,2) = arrayfun(@(x){datestr(x{1},'mm/dd/yy')},d(:,2));
    

答案 1 :(得分:1)

将两个单元格数组连接成一个单元格的字符串数组。对结果的字符串数组进行排序,并获得指标的顺序。使用这些指标对原始单元格数组进行排序

a = {'1', '2', '2', '3'}
b = {'a', 'b', 'a', 'a'}
for i = 1:length(a)
   ab{i} = [a{i},b{i}]
end
[s,si] = sort(ab);
sorted_a = a(si);
sorted_b = b(si);

按照雅各布的建议,如果您使用的日期格式不能按字母顺序排序,则可以替换

   ab{i} = [a{i},b{i}]

   ab{i} = [num2str(datenum(a{i})),b{i}]

答案 2 :(得分:0)

使用与@Jacob类似的想法,这是一个稍微简单的解决方案:

%# your cell array
d = {
    'msft' '1/9/11' 19.8
    'msft' '1/8/11' 18.7
    'csco' '1/8/11'  9.8
    'csco' '1/9/11' 10.0
};

%# extract 2 columns, convert to serial date, sort, apply order to original data
[~,idx] = sortrows([datenum(d(:,2),'mm/dd/yy') cell2mat(d(:,3))], [1 2]);
d = d(idx,:)

之前:

d = 
    'msft'    '1/9/11'    [19.8]
    'msft'    '1/8/11'    [18.7]
    'csco'    '1/8/11'    [ 9.8]
    'csco'    '1/9/11'    [  10]

之后:

d = 
    'csco'    '1/8/11'    [ 9.8]
    'msft'    '1/8/11'    [18.7]
    'csco'    '1/9/11'    [  10]
    'msft'    '1/9/11'    [19.8]

答案 3 :(得分:0)

[tblB,index] = sortrows(tblA,{'Height','Weight'},{'ascend','descend'})

针对您的具体案例:

ticker date price
msft 1/9/11 19.8
msft 1/8/11 18.7
csco 1/8/11 9.8
csco 1/9/11 10.0

[tblB,index] = sortrows(tblA,{'date','price'},{'ascend','descend'})