2013-12-17 104 views
2

我有兩組時間序列數據,按第一列中的日期進行索引;值在第二。日期以yyyymmdd格式表示(例如,珍珠港日期爲19411207)兩個時間序列重疊,但兩者都不是另一個的子集,並且即使在重疊中,也可能缺少日期,並且由於格式,存在間隙以數字順序。由於這些日期最終只是整數,所以我會用下面的小數來替代,以方便閱讀。matlab從具有間隙的向量中創建矩陣

我想打開這兩個矩陣(一26622x2和38067x2)合併爲一個三列的矩陣(38103x3,事實證明。)

我後的合併是這樣的:

Index AVal    Index BVal    Index AVal BVal 
    1  2.5    3 6.5    1  2.5 
    2  3.4  +   5 8.9 =   2  3.4 
    4  5.6    7 9.1    3   6.5 
    5  7.8    8 7.1    4  5.6 
    7  8.00         5  7.8 8.9 
               7  8.00 9.1 
               8   7.1 

在Excel中,我會用VLookup來做到這一點。我可以想象一個Matlab中使用很多條件,循環和存儲索引的方法,但是我想知道是否可能有一組非常簡單的join/intersect-type命令來完成同樣的任務。

有什麼想法?

+0

你真的使用表格(這是Matlab 2013b的新功能)或矩陣嗎? – Daniel

+0

是否有任何重複的日期(在一個源表中,不重疊)?你的例子在任一表中都沒有顯示重複。 – chappjc

+0

丹尼爾 - 我的意思是矩陣 - 我仍然在Matlab 2010上,並不知道新的表格。對困惑感到抱歉。 – Adam

回答

3

嘗試setdiff識別的具體日期,BA,然後用NaN S或遺漏值一些其他值連接:

A = [1 2.5; 2 3.4; 4 5.6; 5 7.8; 7 8.0]; 
B = [3 6.5; 5 8.9; 7 9.1; 8 7.1]; 

[BnA,iB] = setdiff(B(:,1),A(:,1)); 
C = [A NaN(size(A,1),1); BnA NaN(numel(BnA),1) B(iB,2)] 
C = 
    1.0000 2.5000  NaN 
    2.0000 3.4000  NaN 
    4.0000 5.6000  NaN 
    5.0000 7.8000  NaN 
    7.0000 8.0000  NaN 
    3.0000  NaN 6.5000 
    8.0000  NaN 7.100 

然後使用intersect來處理兩者共同的價值觀:

[AB,iA,iBA] = intersect(A(:,1),B(:,1)); 
C(iA,3) = B(iBA,2) 
C = 
    1.0000 2.5000  NaN 
    2.0000 3.4000  NaN 
    4.0000 5.6000  NaN 
    5.0000 7.8000 8.9000 
    7.0000 8.0000 9.1000 
    3.0000  NaN 6.5000 
    8.0000  NaN 7.1000 

然後使用sortrows根據到第一列進行排序:

C = sortrows(C,1) 
C = 
    1.0000 2.5000  NaN 
    2.0000 3.4000  NaN 
    3.0000  NaN 6.5000 
    4.0000 5.6000  NaN 
    5.0000 7.8000 8.9000 
    7.0000 8.0000 9.1000 
    8.0000  NaN 7.1000 
+0

+1很好的回答和解釋 –

+0

@LuisMendo謝謝。希望操作系統正在討論常規數組,而不是丹尼爾R.所指出的那些新的「表格」。 – chappjc

+0

我以爲可能有潛伏在那裏的單線,但這只是一對線,它的工作完美 - 謝謝! – Adam