我是C ++的新手并且有以下内容,让我们称之为问题。在我的计算机模拟中,我使用矢量工作了很多。我自己构建了一个表示向量的小结构,并希望学习如何进行操作(例如normalize()
函数更有效。另外,使用C ++ valarray
有什么好处吗?它似乎预先实现了一些有用的方法。
我几乎只使用normalize()
函数和向量的加法/减法/乘法。由于我的所有向量只有三个元素,我对在项目中包含第三方库犹豫不决。
这是我的结构:
struct vector_t {
int _i, _j, _k;
vector_t(int i, int j, int k) {
_i = i;
_j = j;
_k = k;
}
vector_t() {}
inline int getI() {
return _i;
}
inline int getJ() {
return _j;
}
inline int getK() {
return _k;
}
inline void setI(int val) {
_i = val;
}
inline void setJ(int val) {
_j = val;
}
inline void setK(int val) {
_k = val;
}
void normalize() {
float length = sqrt(_i*_i + _k*_k + _j*_j);
_i /= length;
_j /= length;
_k /= length;
}
};
我的问题:
normalize()
功能,或者这是否已经是最有效的方式?答案 0 :(得分:5)
使用fast reciprocal square root function计算1 /长度,然后将每个元素乘以此因子。除了比sqrt
更快的功能之外,这还有3个相对便宜的乘法交易3个昂贵的除法运算:
struct vector_t {
float _i, _j, _k;
// ...
void normalize() {
float r_length = Q_rsqrt(_i*_i + _k*_k + _j*_j);
_i *= r_length;
_j *= r_length;
_k *= r_length;
}
};
注意:您可能想要考虑如何处理i == j == k == 0
的病态案例。
答案 1 :(得分:2)
这不会有很大的不同,但你的构造函数应该是这样的:
vector_t(int i, int j, int k)
: _i(i), _j(j), _k(k)
{
}
要进行优化,您应该查看SSE:http://www.cortstratton.org/articles/OptimizingForSSE.php