Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Matlab中添加新数据的有效方法(附示例代码)_Matlab_Matrix_Vector_Synchronization - Fatal编程技术网

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

在Matlab中添加新数据的有效方法(附示例代码),matlab,matrix,vector,synchronization,Matlab,Matrix,Vector,Synchronization,我正在寻找方法、内置函数、良好实践。。。若要将新数据附加到矩阵,请在行和列不相同时执行- 我处理的数据结构如下: 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 function dfmerged = in_mergeCache(dfA, dfB) dtA = datenum2datetime(dfA.dates); % funct

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

我处理的数据结构如下:

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
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 
现在的挑战是如何处理我加载并希望附加到新矩阵中的新数据(可能重叠):

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

  • 新ID
  • 新日期
它还可以具有在
min(A.dates)
之前或
max(A.dates)
之后或
min(A.dates)
max(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'};
现在有了新数据:

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'};

更新时间表

在评论之后,我试图通过
时间表实现这一点,如下所示:

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
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?从2016b开始,您可以使用
时间表
对象和
同步
来处理这类事情。Ingah发现了:)这样的例子在上面会怎样?我必须改变时间表中的一切?这不是要花很多时间吗?首先,你可以将数据存储在表中,你不需要对代码做太多的修改,因为表变量可以像结构一样用点符号访问,但事情可能会简单一些;考虑到您基本上有一个包含标题和行数据的表结构,是的,我现在就尝试了(请参阅更新)。但是,请继续关注我的列没有被考虑在内的问题。AB不起作用,因为它们可能有不同的行数。A和B的行数和列数不同。值的范围是否在
1.1
9.9
之间?不,它们总是变化的。参见示例A和示例B。行数事先未知。此外,列的数量可能会有所不同。所以我们需要在水平方向和垂直方向上同步。在您的示例中,取唯一的A和B值。但它们可能并不总是唯一的。您应该通过唯一的日期和id连接它们,而不是通过A或B的唯一值。在我的示例中,是值是唯一的。但假设x2在730008的日期也有2.1(将B中的8.2替换为2.1)。请编辑您的问题,并用a准确解释您想要什么。