2

我有两个矩阵,22007x3352x2。每个中的第一列是一个索引,其中大部分(但不是全部)是共享的(即 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.

然后我想不出我会填满剩下的部分。

重要的一点是,我的数据中每个索引的行数不一定相等。

我怎样才能使这项工作?

4

1 回答 1

3

这里接受 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

最后贴到最后

x3 = [x1, newCol]
于 2013-04-25T14:30:12.093 回答