比较矩阵列并给出布尔输出

时间:2014-10-27 03:09:50

标签: matlab

我检查了其他问题。我没找到答案。我有一个n * 2大小的矩阵。我想比较第1列和第2列,并根据哪个更大,我想将0/1分配给相应的索引。假设我想输出

a = 1 2
    4 3
    7 8

我想要像这样的输出

out = 0 1
      1 0
      0 1

我这样做了:

o1 = a(:,1) > a (:,2)
o2 = not(o1)
out = [o1, o2] 

这可以胜任,但我相信有更好的方法可以做到这一点。需要有关的建议/。 忘了提一下,数据类型在矩阵中是浮点数。

2 个答案:

答案 0 :(得分:1)

你做的很好。线的数量并不重要,重要的是每条线的操作的复杂性。在评论之后,我认为你可以通过避免复制和多次分配来获得一些时间:

out = false(size(a)); out(:,1) = (a(:,1) > a(:,2)); out(:,2) = ~out(:,1);

优良作法是在Matlab中预分配,并且通常避免使用任何编程语言进行复制。 通过使用不同的操作进一步优化运行时是无意义的IMO。如果你真的需要速度你可以通过它来排除一次迭代(第二次分配),它实际上是十几个C行,虽然你必须要小心你如何编写循环(天真的方式会导致缓存 - 错过每次迭代)。

答案 1 :(得分:1)

一种更通用的解决方案,可以处理包含两列以上的矩阵:

out = bsxfun(@eq, a, max(a,[],2));