2011-07-13 54 views
2

我試圖理清使用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 

任何人都知道我該怎麼做?謝謝。

+2

歡迎來到StackOverflow!請閱讀[FAQ](http://stackoverflow.com/faq)瞭解它的工作原理。另外,如果您可以決定最佳答案,請點擊旁邊的複選標記來接受它。 – Jacob

回答

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)); 
    
+0

功能風格的優雅使用。 – BlessedKey

1

將兩者連接起來單元陣列到串的一個單一的單元陣列。對得到的字符串數組進行排序並獲取指示符的順序。使用這些indicies以下雅各布的建議原電池陣列

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} = [num2str(datenum(a{i})),b{i}] 
0

使用替代

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

類似的想法@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] 
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'})