2016-03-18 31 views
2

例如,如果我使用下面的代码来计算两个向量xp之间的角度:为什么使用acos获得复数?

x = [1 1 -1]; 
p = [-1 -1 1]; 

angle = acos(dot(x,p)/(norm(x) * norm(p))); 

它表明angle = 3.141592653589793 - 0.000000021073424i,这是一个复杂的数字。

但我们都知道,xp点积-3,的xp规范的产品是3,那么angle = acos(-3/3),所以角度应该完全PI,3.14159。为什么MatLab会给出一个复数,而我怎样才能让结果成为一个真正的数字呢?

+1

我不MATLAB附近,但你可以检查中间值实际上是-1不是很接近,但外面[-1,1]的范围,由于浮点错误? – Amro

+0

这里是一个相关页面:http://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab(特别看比较'acos'和'atan2'准确度)。 – Amro

回答

2

您的问题正常化开始:

norm(x) * norm(p) 

在这里,你得到的值稍微偏离3,你会期望:

> (norm(x) * norm(p))-3 
ans = -4.4409e-16 

错误传播和你结束了其中x略高于1的acos(x)。

sqrt是可能导致非理性结果的操作。当用笔和纸来解决时,你会保持平方根并首先进行乘法运算。重写它的方式更好的数值probabillities:

angle = acos(dot(x,p)/sqrt(sum(x.^2)*sum(p.^2))) 
+0

谢谢,这是一个绝妙的解决方案! – FalloutRanger

相关问题