【问题标题】:Find rows of a matrix that belong to another one查找属于另一个矩阵的行
【发布时间】:2015-10-29 10:11:23
【问题描述】:

我无法找到关于我所问内容的现有来源,尽管我认为其他人以前也遇到过这个问题,所以如果有,请随意标记为重复,我会删除这个问题。

我有两个矩阵:

A 一个Mx5 矩阵,它的前 4 列是整数,第 5 列用双精度数填充。

B Nx4 矩阵,其 4 列与 A 中的前 4 列相同,但顺序不同,并且某些行不属于 A(我们总是有 M<N) .

我想做的是:

  1. 获取A 中行的索引(相对于更大的矩阵B),其中前4 个值适合B 中的一行
  2. A 的第5 列中的值填充Nx1 向量,其中的索引处有匹配的行和其他位置为零。

我这里确实有一些工作代码,但它很慢,因为N 将至少有 200 万行(大约 7 秒,这太大了,因为该过程将被重复)。另外,为了做我想做的事,我现在必须根据前 4 列对两个矩阵中的行进行排序,从而花费更多时间。

工作代码:

N=size(B,1);
A=sortrows(A,1:4);
[B,ind]=sortrows(B);
[~,index]=sort(ind)
FinValues=zeros(N,1);
FinValues(ismember(B,A(:,1:4),'rows'))=A(:,5);
FinValues=FinValues(index);

玩具示例:

A= [134 3 16998 2 2.0234e-2;...
    134 2 15557 1 3.0234e-3];

B=[17778 1 16559 4;...
   134 2 15557 1;...
   134 3 16998 2;...
   15554 2 16998 3];

期望的输出:

FinValues=

0
3.0234e-3  
2.0234e-2
0

我希望这已经足够清楚了,在此先感谢!

【问题讨论】:

  • 您的工作代码缺少N 的定义,并且您的玩具示例输出FinValues = [0.0030 0.0202 0 0]; - 不同的顺序。
  • 查看这篇文章...这可能会有所帮助stackoverflow.com/questions/33316919/…
  • @IKavanagh :我在代码中添加了N 的定义。你有这个输出的原因是你重新定义了 N 但没有清除变量所以 AB 已经排序。清除变量并再次运行它应该可以工作^^

标签: matlab sorting


【解决方案1】:

这应该更快,因为它完全不需要任何排序。我们可以使用ismember 的第二个输出参数立即 找到行的索引,然后使用这些直接索引F,并用A 填充它。

>> [~, idx] = ismember(A(:, 1:4), B, 'rows');
>> F = zeros(N, 1);
>> F(idx) = A(:, 5)
F =
         0
    0.0030
    0.0202
         0

【讨论】:

  • 是的,这正是我想要的!我会运行时间测试并将其放入 cmets,谢谢!
  • 很高兴我能帮上忙。我很想看看时间安排。
  • 它实际上运行速度比以前的版本慢。也许排序帮助ismember走得更快(以前的时间:7.02s,新的时间:11.24s)
  • 每次50次,平均耗时。然后我运行分析器,对结果感到非常惊讶:排序的ismember 调用需要 2.9 秒,而未排序的调用需要 6 秒!
  • 排序需要多长时间? F(idx) 的 5 秒听起来像是问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
相关资源
最近更新 更多