【问题标题】:Selecting rows of matrix by value of first column按第一列的值选择矩阵的行
【发布时间】:2015-02-19 16:35:23
【问题描述】:

假设我有一个矩阵 A,其第一列是 ID,还有一个向量 B,其中包含随机顺序的某些 ID(其中一些可能会丢失等)。 如何按照B给出的顺序选择具有匹配ID的A的行?

示例

使用矩阵

A = [2, 0.4, 0.3;
     9, 0.2, 0.8;
     3, 0.3, 0.4;
     5, 0.1, 0.5];
B = [9; 2; 5];

我想得到矩阵

C = [9, 0.2, 0.8;
     2, 0.4, 0.3;
     5, 0.1, 0.5];

【问题讨论】:

  • @knedlsepp 我认为链接问题的答案可能会在之后需要sorting 来解决它。当然,这是假设这里的 OP 想要使用向量作为索引数组。
  • 好吧,也许不是那么清楚。 A 包含两列,一列是 ID,另一列是值。 B 只是按特定顺序包含 ID。 B 不包含我想要的索引,但是我想要的 Ids
  • @Flos 然后查看发布的解决方案?认为你想要这样的东西?
  • 如果你不关心订单:A(ismember(A(:,1),B),:) ----如果你关心订单并且B的大小固定为3 ---- A([find(A(:,1)==B(1)), find(A(:,1)==B(2)), find(A(:,1)==B(3))],:) 跨度>

标签: matlab select matrix


【解决方案1】:

根据修改后的问题,A 的第一列是IDsB 还包含某些IDs,我们需要将AIDs 与@987654327 匹配@'s 并从 A 中选择匹配的行。基于这样的假设,您可以在这里使用几种方法。

方法#1 [使用ismember]

[~,idx] = ismember(B,A(:,1))
C = A(idx,:)

方法#2 [使用bsxfun]

[idx,~] = find(bsxfun(@eq,A(:,1),B'))
C = A(idx,:)

方法#3 [使用intersect]

[~,~,idx] = intersect(B,A(:,1),'stable')
C = A(idx,:)

【讨论】:

  • 不知道 sortrows。不错:)
  • 非常感谢,但实际上我需要保持与 B 中相同的顺序,即如果 B 为 [3; 1个; 4],我需要[3, 1; 1、2; 4, 6] 我有点需要在右ID旁边的B向量中添加正确的值,而不改变任何顺序
  • 简直完美 :) 不知道 ismember 还返回索引 :) 谢谢 :) PS:它在 11 秒内给出 C 矩阵,for 循环 35 分钟......(我的 A 矩阵很大)
【解决方案2】:

如果您的 ID 是唯一的正整数,您可以执行以下操作:

方法 #4 [使用sparse 和索引]

构造一个对应于映射的稀疏向量:ID -> rowIndex 并评估这个向量:

indexOfID = sparse(A(:,1), 1, 1:size(A,1));
C = A(indexOfID(B),:);

当您想多次查询您的 ID 时,这可能很有用,因为您只需构建一次 indexOfID。 (我也喜欢“函数评估”indexOfID(B) 的语法)

【讨论】:

  • 这也行得通,但实际上我在 A 中有更多的列,我没有找到一种方法让它轻松地处理几列:((不习惯使用稀疏矩阵)但是无论如何谢谢:)
  • 很高兴您正在维护方法的 ID :) 在 Stackoverflow 上很好,我们用各种方法淹没 OP!这对他们有好处,对我们回答者也有好处!
  • @Divakar:嗯,一致性是关键! ;-) [仍然让我意识到这可能不是最好的主意,因为其他人可能会在稍后的某个时间点改变他们的答案。好吧,没关系...]
猜你喜欢
  • 2015-03-09
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
相关资源
最近更新 更多