我检查了其他问题。我没找到答案。我有一个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]
这可以胜任,但我相信有更好的方法可以做到这一点。需要有关的建议/。 忘了提一下,数据类型在矩阵中是浮点数。
答案 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));