Eigen::Vector3f 逐元素比较并将个体设置为零

问题描述 投票:0回答:1

我有 3 个向量,用于存储笛卡尔坐标系中沿 x、y 和 z 轴的坐标、速度和加速度。
我正在检查这些值中的任何一个是否接近 0(零),如果接近 0,我手动将它们设为零。
他们是实现这一目标的有效(更快)方法吗?

硬件加速:AVX2

代码

Eigen::Vector3f coordinates;
Eigen::Vector3f velocity;   
Eigen::Vector3f acceleration;   
//Some operations on coordinates, velocity and acceleration
if( (coordinates(0) < 0.0001f) && (coordinates(0) > -0.0001f))
{
    coordinates(0) = 0.0f;
}
if ((coordinates(1) < 0.0001f) && (coordinates(1) > -0.0001f))
{
    coordinates(1) = 0.0f;
}
if ((coordinates(2) < 0.0001f) && (coordinates(2) > -0.0001f))
{
    coordinates(2) = 0.0f;
}
if ((velocity(0) < 0.0001f) && (velocity(0) > -0.0001f))
{
    velocity(0) = 0.0f;
}
if ((velocity(1) < 0.0001f) && (velocity(1) > -0.0001f))
{
    velocity(1) = 0.0f;
}
if ((velocity(2) < 0.0001f) && (velocity(2) > -0.0001f))
{
    velocity(2) = 0.0f;
}
if ((acceleration(0) < 0.0001f) && (acceleration(0) > -0.0001f))
{
    acceleration(0) = 0.0f;
}
if ((acceleration(1) < 0.0001f) && (acceleration(1) > -0.0001f))
{
    acceleration(1) = 0.0f;
}
if ((acceleration(2) < 0.0001f) && (acceleration(2) > -0.0001f))
{
    acceleration(2) = 0.0f;
}
c++ eigen eigen3
1个回答
0
投票

无需详细了解 Eigen,您的代码可以减少很多:

  • 编写一个函数来处理任何
    Vector3f
  • 编写一个循环,而不是从
    1
    3
  • 进行硬编码迭代
  • 使用
    fabs
    表示绝对值

void normalize_zero(Eigen::Vector3f& v) {
      for (size_t i=1;i<4;++i) {
           if( (std::fabs(v(i)) < 0.0001f) v(i) = 0.0f;
      }
}

我希望

Vector3f
与基于范围的 for 循环兼容,但我不确定。如果是,你应该使用它们。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.