以更简单的方式使用 Eigen::Vector4d 作为 3d

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

Windows 10 / 特征3 3.4.0-1 / MSYS2/MinGW64 13.1.0 / c++20

为了利用 SIMD 矢量化,我计划使用 vector4d 作为 vector3d。为了使代码不那么混乱并且更加用户友好,这里是实现

typedef Eigen::Vector4d Vec3;

问题是当我使用

创建 vec 时
Vec3 u(1,2,3);

编译器由于第四个缺失值而显示错误。正确的语法是:

Vec3 u(1,2,3,4);

但这又让代码变得更加混乱。在 MSVC 编译器上,可以具有相同的类型和函数名称。示例:

typedef Eigen::Vector4d Vec3;
inline Eigen::Vector4d Vec3(double x, double y, double z) {
     return Eigen::Vector4d(x, y, z, 0.0);
}
inline Eigen::Vector4d Vec3() {
     return Eigen::Vector4d(0.0, 0.0, 0.0, 0.0);
}

Vec3 v = Vec3(1,2,3);
Vec3 w = Vec3();

不幸的是,该功能在 g++/gcc 上不可用。考虑到这里的一切就是我的最终实现:

typedef Eigen::Vector4d Vec3;
inline Eigen::Vector4d Vec3Init(double x, double y, double z) {
     return Eigen::Vector4d(x, y, z, 0.0);
}
inline Eigen::Vector4d Vec3Init() {
     return Eigen::Vector4d(0.0, 0.0, 0.0, 0.0);
}

Vec3 v = Vec3Init(1,2,3);
Vec3 w = Vec3Init();

有什么想法可以让生活更轻松吗?

eigen
1个回答
0
投票

您可以创建一个继承自

Eigen::Vector4d
的类,并重载(某种)构造函数以采用 3 个参数。缺点是你总是会得到第四个值。

#include <iostream>
#include <Eigen/Dense>

class Vec3 : public Eigen::Vector4d {

public:
Vec3(double x, double y, double z, double foo = 0.0) : Eigen::Vector4d(x, y, z, foo){}

};

int main(int argc, char * argv []){

    Vec3 vec3 = Vec3(1,2,3);
    std::cout << vec3 << std::endl;
    return 0;
}

这是该代码的输出。

1 2 3 0

这可能会产生副作用,例如进行叉积或矩阵乘法,您可能不希望 4x1 向量在幕后做事。我也不知道您需要哪些(如果有)额外的重载。

© www.soinside.com 2019 - 2024. All rights reserved.