代码之家  ›  专栏  ›  技术社区  ›  WJA

在Matlab中添加新数据的有效方法(附示例代码)

  •  3
  • WJA  · 技术社区  · 7 年前

    当行和列不相同时

    我处理的数据结构如下:

    A.values: Ta x Ma matrix of values
    A.dates:  Ta x 1 vector of datenum
    A.id:     1 x Ma cell array of ids
    

    现在的挑战是如何处理新的(可能重叠的)数据 B 我加载并想附加到一个新的矩阵 C

    当新数据进入时,由于以下原因,它可以水平和垂直扩展:

    • 新ID
    • 新日期

    它也可以有开始的日期 之前 min(A.dates) 之后 max(A.dates) 之间 最小值(A.dates) . ID在B中可以是唯一的(都是新的),也可以是重叠的。

    下面是一个示例:

    A.values = [2.1 2.4 2.5 2.6; ...
                4.1 4.4 4.5 4.6; ...
                6.1 6.4 6.5 6.6];
    A.dates  = [730002; ...
                730004; ...
                730006];
    A.id     = {'x1', 'x4', 'x5', 'x6'};
    

    现在有了新的数据:

    B.values = [1.2 1.9 1.5 1.6 1.7; ...
                3.2 3.9 3.5 3.6 3.7; ...
                7.2 7.9 7.5 7.6 7.7; ...
                8.2 8.9 8.5 8.6 8.7];
    B.dates  = [730001; ...
                730003; ...
                730007; ...
                730008];
    B.id     = {'x2', 'x9', 'x5', 'x6', 'x7'};
    

    我们现在如何高效快速地构建新的结构 C ?

    C.values = [NaN 1.2 NaN 1.5 1.6 1.7 1.9; ...
                2.1 NaN 2.4 2.5 2.6 NaN NaN; ...
                NaN 3.2 NaN 3.5 3.6 3.7 3.9; ...
                4.1 NaN 4.4 4.5 4.6 NaN NaN; ...
                6.1 NaN 6.4 6.5 6.6 NaN NaN; ...
                NaN 7.2 NaN 7.5 7.6 7.7 7.9; ...
                NaN 8.2 NaN 8.5 8.6 8.7 8.9];
    C.dates  = [730001; ...
                730002; ...
                730003; ...
                730004; ...
                730006; ...
                730007; ...
                730008];
    C.id     = {'x1', 'x2', 'x4', 'x5', 'x6', 'x7', 'x9'};
    

    更新时间表

    在这些评论之后,我试着用 timetable 具体如下:

    function dfmerged = in_mergeCache(dfA, dfB)
    
    dtA = datenum2datetime(dfA.dates); % function datenum2datetime can be found here: https://stackoverflow.com/a/46685634/4262057
    dtB = datenum2datetime(dfB.dates);
    
    TTa = array2timetable(dfA.values, 'RowTimes', dtA, 'VariableNames', dfA.id);
    TTb = array2timetable(dfB.values, 'RowTimes', dtB, 'VariableNames', dfB.id);
    
    TTs = synchronize(TTa,TTb);
    
    dfmerged.id     = TTs.Properties.VariableNames;
    dfmerged.values = table2array(TTs);
    dfmerged.dates  = datenum(TTs.Time); %to convert datenum
    
    end 
    

    C = 
    
      struct with fields:
    
            id: {'x1'  'x4'  'x5_TTa'  'x6_TTa'  'x2'  'x9'  'x5_TTb'  'x6_TTb'  'x7'}
        values: [7×9 double]
         dates: [7×1 double]
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   rahnema1    7 年前

    下面是一个使用 unique 和索引:

    %combine the data and take unique value of them + their index
    [C.id,~,date_i] = unique([A.dates(:);B.dates(:)]);
    [C.dates,~,id_i] = unique([A.id B.id]);
    
    C.values = nan(numel(C.dates),numel(C.id));
    %use matrix indexing to fill the sub-materices corresponding to elements of A and B
    C.values(date_i(1:numel(A.dates)),id_i(1:numel(A.id)))=A.values;
    C.values(date_i(numel(A.dates)+1:end),id_i(numel(A.id)+1:end))=B.values;