2014-10-27 65 views
0

我已检查其他问题。我没有找到我的答案。我有一个n * 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

不知道为什么你想有一个更好的答案,这看起来很不错。你有什么特别的问题吗? – David 2014-10-27 03:43:05

+2

我认为你的答案很好。也许减少一行为:'o1 = a(:,1)> a(:,2) out = [o1,〜o1]'......只是为了它...我不认为它有什么区别。 – 2014-10-27 03:44:44

+0

@大卫:不,我没有任何问题。只是想减少线路。 – user3527975 2014-10-27 03:55:27

回答

1

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

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

很好地完成! :) – Sheljohn 2014-10-27 09:49:10

1

你做的很好。行数并不重要,重要的是每行中操作的复杂性。下面的评论,我想你可以通过避免复制和多分配获得一些时间,以及:

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

这是在Matlab预分配,并在总体上避免任何编程语言的副本很好的做法。 通过使用不同的操作进一步优化这个运行时间是没有意义的IMO。如果你真的需要速度的话,你可以让Mex在​​一行中进行一次迭代(第二次赋值),但它实际上是十几行C语言,尽管你必须小心你如何编写循环(天真的方式会导致缓存 - 错过每次迭代)。

+1

使用逻辑矩阵使得这比其他任何解决方案更有效率,做得很好! – David 2014-10-27 21:41:35