gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:11:00 25 4
gpt4 key购买 nike

我正在寻找方法、内置函数、良好实践...将新数据附加到矩阵 - 当行和列不相同时

我处理的数据结构如下:

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

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

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

  • 新 ID
  • 新日期

它还可以有开始 min(A.dates)之后 max(A.dates)< 的日期 min(A.dates)max(A.dates) 之间。 B 中的 id 可以是唯一的(全部是新的),或者有些可以重叠。

这是一个示例:

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

问题:然而,这给了我一个很大的时间表,其中行确实同步,但列只是重复(9 列)。我怎样才能同步列?

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]

最佳答案

这是使用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;

关于matlab - 在 Matlab 中追加新数据的有效方法(附示例代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46682751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com