2015-11-19 149 views
1

我想要遵循一个代数方程,并将其转换为C++。C++规范化一个矢量为一个双?

我被困在:

Calculate the radius as r = ||dp|| 

其中DP是一个矢量,并且:

dp = (dx,dy) 

根据我的谷歌搜索,在R上的竖线= || DP ||意味着我需要对矢量进行归一化。

我:

std::vector<double> dpVector; 
dpVector.push_back(dx); 
dpVector.push_back(dy); 

我应该如何进行标准化这一点,以便它返回一个双象“R”?

+3

否,'r'大概是**欧几里得范数**载体:'R =标准:: SQRT(DX * DX + DY * DY);' – Pixelchemist

+0

谢谢!那是我需要的。 – anti

+2

只使用C++ std :: vector作为矢量的几何概念,只是因为这些单词是相同的。在你的情况下,一个向量只是2个数字 - X和Y.它真的和一个点相同。 – sashoalm

回答

1

您可能正在寻找欧几里德范数,它是矢量的几何长度和标量值。

double r = std::sqrt(dx*dx + dy*dy); 

与此相反,一个向量的归​​一化表示与它的长度(其欧几里得范数)相同的方向)被设置为1。这又是一个矢量。

固定维矢量对象(特别是低维度)可以表示为类类型。

一个简单的例子:

namespace wse 
{ 
    struct v2d { double x, y; }; 
    inline double dot(v2d const &a, v2d const &b) 
    { 
     return a.x*b.x + a.y*b.y; 
    } 
    inline double len(v2d const &v) { return std::sqrt(dot(v,v)); } 
} 

// ... 

wse::v2d dp{2.4, 3.4}; 
// ... Euclidean norm: 
auto r = len(dp); 
// Normalized vector 
wse::v2d normalized_dp{dp.x/r, dp.y/r}; 
2

规格化的矢量是长度为1的矢量,如果您正在寻找长度,则不是您想要的矢量。计算长度是标准化矢量的第一步,但我认为你不需要最后一步!

要计算长度,你需要毕达哥拉斯定理。我不打算详细描述,但基本上你可以看到双方广场的平方根。

换句话说,乘以dx和dy自己,将它们加在一起,然后平方根结果。

r = std::sqrt(dx*dx + dy*dy); 

如果你真的想正常化矢量然后你要做的最后一步是将其分摊dx和用r DY两者。这给出长度为1的结果单位矢量。

4

||dp||是矢量dp的欧氏范数。看看这个链接,一个更完整的解释:

https://en.wikipedia.org/wiki/Euclidean_distance

欧几里得范数的计算如下:||dp|| = sqrt(dp.dp),其中。代表点积。

在C++中,这相当于||dp|| = std::sqrt(dx*dx + dy*dy)。如果dp有更多的维度,那么对于点积使用线性代数库会更好。