【问题标题】:matlab make matrix from vectors with gapsmatlab从有间隙的向量制作矩阵
【发布时间】:2013-12-17 19:49:58
【问题描述】:

我有两组时间序列数据,按第一列中的日期索引;值在第二个。日期以 yyyymmdd 格式表示(例如珍珠港日是 19411207) 两个时间序列重叠,但两者都不是另一个的子集,即使在重叠中,也可能缺少日期,并且由于格式的原因,存在间隙在数字序列中。由于这些日期最终只是整数,为了便于阅读,我将在下面替换为小数字。

我想把这两个矩阵(一个 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 中使用大量条件、循环和存储索引的方法,但我想知道是否可能没有一组非常简单的连接/相交类型命令可以完成同样的事情。

有什么想法吗?

【问题讨论】:

  • 您真的使用表格(这是 Matlab 2013b 的新功能)还是矩阵?
  • 是否有重复的日期(在一个源表中,不重叠)?您的示例在任一表中均未显示重复。
  • Daniel - 我的意思是矩阵 - 我还在使用 Matlab 2010,不知道新的表格。很抱歉造成混乱。

标签: matlab time-series


【解决方案1】:

尝试setdiff 识别B 中的日期而不是A 中的日期,然后与NaNs 或其他一些值连接以查找缺失值:

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

【讨论】:

  • @LuisMendo 谢谢。希望 OP 谈论的是常规数组,而不是 Daniel R. 指出的新 tables。
  • 我以为那里可能潜伏着一条线,但这只是几行而且效果很好 - 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 2016-07-16
  • 2021-12-01
  • 1970-01-01
  • 2021-12-04
  • 2014-01-02
相关资源
最近更新 更多