c++将向量归一化为二重

c++ normalize a vector to a double?

本文关键字:二重 向量 c++      更新时间:2023-10-16

我正试图遵循一个代数方程,并将其转换为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"?

||dp||是向量dp的欧氏范数。查看此链接以获得更完整的解释:

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

欧氏范数的计算如下:||dp|| = sqrt(dp.dp),其中。表示点积。

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

归一化向量是长度为1的向量,如果您正在寻找长度,这不是您想要的。计算长度是规范化向量的第一步,但我认为不需要最后一步!

要计算长度,你需要毕达哥拉斯定理。我不打算进行全面的描述,但基本上你要取两边的平方根。

换句话说,把dx和dy相乘,加在一起,然后把结果平方根。

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

如果你真的想归一化向量,那么最后一步你所做的就是把dx和dy都除以r。这得到了一个长度为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};