2013-12-17 59 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