【问题标题】:MATLAB Combine matrices of different dimensions, filling values of corresponding indicesMATLAB组合不同维度的矩阵,填充对应索引的值
【发布时间】:2013-04-25 14:12:13
【问题描述】:

我有两个矩阵,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.

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

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

我怎样才能做到这一点?

【问题讨论】:

  • x2(:,1) 是否包含重复?
  • @Dan 不,它没有。
  • x1(:,1) 和 x2(:,1) 是否总是具有从 1 到各自最大值的所有数字?
  • @Dan 也没有。这就是为什么我的数据难以处理的原因之一。
  • @8eastFromThe3ast:忽略了怎么办?丢弃和消除忽略?填写默认值忽略?

标签: matlab join matrix fill


【解决方案1】:

接受hereAmro 的回答

[~, 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]

【讨论】:

  • 实际上,如果 x1(:,1) 的数字不在 x2(:,1) 中,则会出错:/
  • 成功!杰出的!非常感谢。 @Dan 你有机会告诉我这些步骤吗?
  • @8eastFromThe3ast 哎呀,我在那里使用查找而不是逻辑索引犯了一个新手错误,你应该删除find。查看最新编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多