Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何基于两列对矩阵进行排序_Matlab_Datetime_Sorting_Date_Matrix - Fatal编程技术网

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

Matlab 如何基于两列对矩阵进行排序,matlab,datetime,sorting,date,matrix,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 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 c

我尝试使用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
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

有人知道我怎么做吗?谢谢。

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

这里有一些代码;假设
d
是您给出的示例中的4x3单元阵列:

  • 将日期列转换为带有

  • 对矩阵进行排序(首先是日期,然后是股票代码)

  • 将日期替换为具有的字符串


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

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);
按照Jacob的建议,如果您使用的日期格式不能按字母顺序排序,则可以替换

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

使用类似于的想法,这里有一个稍微简单的解决方案:

%# 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]
针对您的具体情况:


优雅实用的风格。欢迎使用StackOverflow!请阅读本手册以了解其工作原理。此外,如果您可以决定最佳答案,请单击旁边的复选标记接受它。
   ab{i} = [num2str(datenum(a{i})),b{i}]
%# 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]
[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'})