Matlab 如何基于两列对矩阵进行排序
我尝试使用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
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'})