c ++将向量规范化为双精度?

c++ normalize a vector to a double?

我正在尝试遵循代数方程,并将其转换为 C++。

我卡在了:

Calculate the radius as r = ||dp||

其中 dp 是一个向量,并且:

 dp = (dx,dy)

根据我的google搜索,r中的竖线= ||dp||意味着我需要规范化向量。

我有:

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

我应该如何对其进行规范化,使其 returns 成为 'r' 的两倍?

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

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

换句话说,将dx和dy各自相乘,相加,然后对结果进行平方根。

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

如果您真的想对向量进行归一化,那么最后一步就是将 dx 和 dy 除以 r。这给出了长度为 1 的结果单位向量。

||dp||是向量dp的欧氏范数。看看这个 link 以获得更完整的解释:

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

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

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

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

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

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

固定维矢量对象(尤其是低维)适合表示为 class 类型。

一个简单的例子:

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};