我有两个矩阵,22007x3
和352x2
。每个中的第一列是一个索引,大多数(但不是全部)都是共享的(即x1包含不在x2中的索引)。
我想将两个矩阵组合成一个22007x4
矩阵,这样第4列就会填充与原始矩阵中特定索引相对应的值。
例如:
x1 =
1 1 5
1 2 4
1 3 5
2 1 1
2 2 1
2 3 2
x2 =
1 15.5
2 -5.6
变为
x3 =
1 1 5 15.5
1 2 4 15.5
1 3 5 15.5
2 1 1 -5.6
2 2 1 -5.6
2 3 2 -5.6
我尝试了一些
的方法x3(1:numel(x1),1:3)=x1;
x3(1:numel(x2(:,2)),4)=x2(:,2);
但首先我收到了错误
??? Subscripted assignment dimension mismatch.
然后我无法弄清楚我会填补其余部分。
重要的一点是,我的数据中每个索引的行数不一定相同。
我如何才能使这项工作?
答案 0 :(得分:3)
从here
获取Amro的答案[~, loc] = ismember(x1(:,1), x2(:,1));
ismember的第二个参数返回x2中可以找到x1的每个元素的位置(如果不能,则返回0)
a = x2(loc(loc > 0), 2);
使用这些行索引获取相关值但不包括零,因此loc > 0
掩码。您必须将这些排除为1,它们不在x2和2中,您无法使用0
进行索引。
创建一个新的默认值列以粘贴在x1的末尾。我认为NaN()
可能更好,但zeros()
也可以
newCol = NaN(size(x1,1),1)
现在使用逻辑索引来获取非零元素的位置,并将a
放在这些位置
newCol(loc > 0) = a
Finnaly坚持到最后
x3 = [x1, newCol]