在MATLAB中加入矩阵 [英] Join Matrices in MATLAB
问题描述
我有两个矩阵,如下所示:
'01 / 01/2010'1
'02 / 01/2010'2
'03 / 01/2010'3
'05 / 01/2010'11
'06 / 01/2010'17
'01/01/2010'4
'02 / 01/2010'5
'04 / 01/2010'6
'05 / 01/2010'7
,在MATLAB中做了一些棘手的事情之后,我想创建以下三个矩阵:
'01/01/2010'1 4
/ pre>
'02 / 01/2010'2 5
'03 / 01/2010' 3 NaN
'04 / 01/2010'NaN 6
'05 / 01/2010'11 7
'06 / 01/2010'17 NaN
'01 / 01/2010'1 4
'02 / 01/2010'2 5
'05 / 01/2010'11 7
有关如何加入这些标签的任何想法les?
干杯。
编辑:真的很抱歉我的错别字,伙计们。我更新了问题和输入/输出数据。请您随时提供建议。
解决方案我相信您尝试实现的内容称为内部连接和全部外连接。
首先我们从两个数据集开始:
d1 = {
'01 / 01/2010'1
'02 / 01/2010'2
'03 / 01/2010'3
'05 / 01/2010'11
'06 / 01/2010'17
};
d2 = {
'01 / 01/2010'4
'02 / 01/2010'5
'04 / 01/2010'6
'05 / 01/2010'7
};
以下是执行两种类型连接的代码:
%#获取所有可能的日期,并将它们转换为从1
开始的索引[keys,〜,ind] = unique([d1(:,1 ); d2(:,1)]);
%#full outer join
ind1 = ind(1:size(d1,1));
ind2 = ind(size(d1,1)+1:end);
fullOuterJoin = cell(numel(keys),3);
fullOuterJoin(:) = {NaN}; %#fill with NaNs
fullOuterJoin(:,1)= keys; %#union of dates
fullOuterJoin(ind1,2)= d1(:,2); %#插入第一个数据集值
fullOuterJoin(ind2,3)= d2(:,2); %#insert第二个数据集值
%#inner join
loc1 = ismember(ind1,ind2);
loc2 = ismember(ind2,ind1);
innerJoin = cell(sum(loc1),3);
innerJoin(:,1)= d1(loc1,1); %#交集日期
innerJoin(:,2)= d1(loc1,2); %#插入第一个数据集值
innerJoin(:,3)= d2(loc2,2); %#插入第二个数据集值
或者,我们可以从外部连接数据集中提取内部连接只需删除任何
NaN
值的行:idx = all(〜 isnan(cell2mat(fullOuterJoin(:,2:end))),2);
innerJoin = fullOuterJoin(idx,:);
无论哪种方式,结果:
>> $ 1 $ / $ / $ / $ / $ / $ / $ / $ / $ / $ / $ / $ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / 2010年[3] [NaN]
'04 / 01/2010'[NaN] [6]
'05 / 01/2010'[11] [7]
'06 / 01 / 2010'[17] [NaN]
>> $ $ $ $ $ $ $ $ $ / $ / $ / $ / $ / $ / $ / $ / $ 2010'[11] [7]
I have two matrices like the following ones:
'01/01/2010' 1 '02/01/2010' 2 '03/01/2010' 3 '05/01/2010' 11 '06/01/2010' 17 '01/01/2010' 4 '02/01/2010' 5 '04/01/2010' 6 '05/01/2010' 7
, and after doing a few tricky things in MATLAB, I want to create the following three matrices:
'01/01/2010' 1 4 '02/01/2010' 2 5 '03/01/2010' 3 NaN '04/01/2010' NaN 6 '05/01/2010' 11 7 '06/01/2010' 17 NaN '01/01/2010' 1 4 '02/01/2010' 2 5 '05/01/2010' 11 7
Any idea on how to join these tables? Cheers.
EDIT: Really sorry for my typos, guys. I updated both the question and the input/output data. Please, feel free to provide suggestions.
解决方案I believe what you are trying to achieve are called inner join, and full outer join in the database world.
First we start with the two datasets:
d1 = { '01/01/2010' 1 '02/01/2010' 2 '03/01/2010' 3 '05/01/2010' 11 '06/01/2010' 17 }; d2 = { '01/01/2010' 4 '02/01/2010' 5 '04/01/2010' 6 '05/01/2010' 7 };
Here is the code to perform the two types of join:
%# get all possible dates, and convert them to indices starting at 1 [keys,~,ind] = unique( [d1(:,1);d2(:,1)] ); %# full outer join ind1 = ind(1:size(d1,1)); ind2 = ind(size(d1,1)+1:end); fullOuterJoin = cell(numel(keys),3); fullOuterJoin(:) = {NaN}; %# fill with NaNs fullOuterJoin(:,1) = keys; %# union of dates fullOuterJoin(ind1,2) = d1(:,2); %# insert 1st dataset values fullOuterJoin(ind2,3) = d2(:,2); %# insert 2nd dataset values %# inner join loc1 = ismember(ind1, ind2); loc2 = ismember(ind2, ind1); innerJoin = cell(sum(loc1),3); innerJoin(:,1) = d1(loc1,1); %# intersection of dates innerJoin(:,2) = d1(loc1,2); %# insert 1st dataset values innerJoin(:,3) = d2(loc2,2); %# insert 2nd dataset values
Alternatively, we could have extracted the inner join from the outer join dataset by simply removing rows with any
NaN
values:idx = all(~isnan(cell2mat(fullOuterJoin(:,2:end))), 2); innerJoin = fullOuterJoin(idx,:);
Either way, the result:
>> fullOuterJoin fullOuterJoin = '01/01/2010' [ 1] [ 4] '02/01/2010' [ 2] [ 5] '03/01/2010' [ 3] [NaN] '04/01/2010' [NaN] [ 6] '05/01/2010' [ 11] [ 7] '06/01/2010' [ 17] [NaN] >> innerJoin innerJoin = '01/01/2010' [ 1] [4] '02/01/2010' [ 2] [5] '05/01/2010' [11] [7]
这篇关于在MATLAB中加入矩阵的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!