我试图遵循代数方程,并将其转换为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'?
答案 0 :(得分:4)
||dp||
是向量dp的欧几里德范数。请查看此链接以获得更完整的解释:
https://en.wikipedia.org/wiki/Euclidean_distance
欧几里德范数计算如下:||dp|| = sqrt(dp.dp)
,其中。代表点积。
在C ++中,这等同于||dp|| = std::sqrt(dx*dx + dy*dy)
。如果dp具有更多尺寸,那么最好使用线性代数库作为点积。
答案 1 :(得分:2)
标准化向量是一个长度为1的向量,如果您正在查找长度,则不是您想要的。计算长度是标准化矢量的第一步,但我认为你不需要最后一步!
要计算长度,你需要毕达哥拉斯定理。我不打算进行完整的描述,但基本上你采用双方正方形的平方根。
换句话说,将dx和dy自身相乘,将它们加在一起,然后将结果平方根。
r = std::sqrt(dx*dx + dy*dy);
如果你确实想要对矢量进行标准化,那么你所做的最后一步就是用r除以dx和dy。这给出了长度为1的结果单位矢量。
答案 2 :(得分: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};