【问题标题】:Efficient way of finding rows in which A>B查找 A>B 行的有效方法
【发布时间】:2013-10-09 16:06:17
【问题描述】:

假设M 是一个矩阵,其中每一行代表N 对象池的随机序列,例如,

1 2 3 4
3 4 1 2
2 1 3 4

如何有效地找到数字 A 位于数字 B 之前的所有行?

例如,A=1B=2;我想检索第一行和第二行(其中12 之前)

【问题讨论】:

  • BA 的大小一样吗?对于给定的行,A 中的一个数字是否大于 B 中的一个数字是否存在问题?
  • 使用AB 我正在表征两个数字,例如A=1B=2,所以我想检索第一行和第二行(其中1 2 之前)(对不起,文中有错字:A 不是矩阵 :))

标签: performance matlab matrix


【解决方案1】:

你去吧:

[iA jA] = find(M.'==A);
[iB jB] = find(M.'==B);
sol = find(iA<iB)

请注意,这是可行的,因为根据问题规范,每个数字都保证在每一行中出现一次。


要查找具有给定前缀的 M 行(根据 cmets 中的要求):让 prefix 成为具有所查找前缀的向量(例如,prefix = [1 2]):

find(all(bsxfun(@eq, M(:,1:numel(prefix)).', prefix(:))))

【讨论】:

  • 给出拒绝投票的理由被认为是一种很好的做法。我的解决方案不起作用吗?丑吗?很慢吗?
  • 对我来说效果很好。很好:)(我不知道为什么有人不赞成你!)
  • 不知道为什么这会被否决,对我有用,而且绝对比我的循环方法更优雅。来自我的 +1 :)
  • 那么如何找到所有具有相同前缀的行呢? (我不知道我是否应该创建第二个问题......)
  • 这应该很容易。你如何定义“前缀”?
【解决方案2】:

类似下面的代码应该可以工作。它将查看每行中A 是否位于B 之前。

temp = [1 2 3 4;
        3 4 1 2;
        2 1 3 4];
A = 1;
B = 2;
orderMatch = zeros(1,size(temp,1));
for i = 1:size(temp,1)
    match1= temp(i,:) == A;
    match2= temp(i,:) == B;
    aIndex = find(match1,1);
    bIndex = find(match2,1);
    if aIndex < bIndex
        orderMatch(i) = 1;
    end
end
solution = find(orderMatch);

这将导致[1,1,0],因为前两行的 1 在 2 之前,但第三行没有。

更新

在 ordermatch 上添加了 find 函数,以按照 Luis 的建议提供行索引

【讨论】:

  • 我建议最后一个 find(orderMatch),因为 OP 想要行号,而不是 0/1 标志
  • 注意,Luis 的方法更好更优雅。
  • @LuisMendo 没问题
猜你喜欢
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 2015-05-17
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多