Eigen相关(MatrixBase, Assert, ALIGNED. quaternion, normalize()和normalized)

本文深入探讨Eigen库的MatrixBase类及其应用,介绍如何利用模板处理矩阵和向量,使用Eigen的断言进行调试,以及如何正确对齐内存避免运行错误。同时,详细解释了quaternion的操作与规范化处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MatrixBase

This class is the base that is inherited by all matrix, vector, and related expression types. Most of the Eigen API is contained in this class, and its base classes. Other important classes for the Eigen API are Matrix, and VectorwiseOp.

该类在Eigen中是一个基类,使用模板不指定变量的具体类型的时侯可以使用该类

如:

//打印输入Eigen中定义的矩阵、向量等类型的x的第一行
template<typename Derived>
void printFirstRow(const Eigen::MatrixBase<Derived>& x)
{
  cout << x.row(0) << endl;
}

可以使用模板找到行数,列数,定义新的类型

template<class H_type>
void dosomething(Eigen::MatrixBase<H_type>){
  H_type S;
  Eigen::Matrix<double,R_type::RowsAtCompileTime,R_type::ColsAtCompileTime> K;
  enum {
    rows = Eigen::MatrixBase < H_type > ::RowsAtCompileTime,
    cols = Eigen::MatrixBase < H_type > ::ColsAtCompileTime
  };
  Eigen::Matrix<double,rows,cols>T;
}

Assert

在C++中assert(x)用来调试,如果x计算值为false则中断,输出调试信息,Eigen中也有

EIGEN_STATIC_ASSERT_FIXED_SIZE(TYPE) \\ passes if TYPE is fixed size.
EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(TYPE) \\ passes if TYPE is dynamic size.
EIGEN_STATIC_ASSERT_LVALUE(Derived) \\ failes if Derived is read-only.
EIGEN_STATIC_ASSERT_ARRAYXPR(Derived) \\ passes if Derived is an array expression.
EIGEN_STATIC_ASSERT_SAME_XPR_KIND(Derived1, Derived2) \\ failes if the two expressions are an array one and a matrix one.
EIGEN_STATIC_ASSERT_VECTOR_ONLY(TYPE) \\ passes if TYPE must be a vector type.
EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(TYPE, SIZE) \\ passes if TYPE must be a vector of the given size.
EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(TYPE, ROWS, COLS) \\ passes if TYPE must be a matrix with given rows and columns.
EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(TYPE0,TYPE1) \\ fails if the two vector expression types must have different sizes.
EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(TYPE0,TYPE1) \\ fails if the two matrix expression types must have different sizes.
EIGEN_STATIC_ASSERT_SIZE_1x1(TYPE) \\ fails if TYPE cannot be an 1x1 expression.

对齐

在生成定长的Matrix或Vector对象时,需要开辟内存,调用默认构造函数,内存位数没对齐就会导致程序运行出错,对于这种情况需要自己定义new的operator,但是Eigen中定义了语句“EIGEN_MAKE_ALIGNED_OPERATOR_NEW”放入类中(结尾没有“;”)这样操作之后不用担心指针对齐问题

such as

class Foo
{
  ...
  Eigen::Vector2d v;
public:
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
  ...
};
...
Foo *foo = new Foo;

quaternion

Eigen::quaternion不同于其它matrix,按照类似于向量类型输出需要q.coeffs(),其包括x,y,z,w四个元素,赋值或是调用需用类似q.x()的用法

Eigen::Quaterniond q;
q.x() = 1;
q.y() = 2;
q.z() = 3;
q.w() = 4;
std::cout << q.coeffs() << std::endl;

normalize() 和 normalized()

normalize()对使用它的变量单位化,无返回

normalized() 返回使用它变量的单位化后的值,但是使用它的变量无变化

//q1(1,2,3,4), q2(3,2,1,4)    
	cout << q2.coeffs() << endl;
    q2.normalize();
    cout << q2.coeffs() << endl;
    Eigen::Quaternion<double> q3;
    q3 = q1.normalized();
    cout << q1.coeffs() << endl;
    cout << q3.coeffs() << endl;

out:

3
2
1
4
0.547723
0.365148
0.182574
0.730297
1
2
3
4
0.182574
0.365148
0.547723
0.730297
### EIGEN_STATIC_ASSERT 宏的用途 `EIGEN_STATIC_ASSERT` 是 Eigen 库中的一个重要工具,用于在编译期执行静态断言。它允许开发者验证某些条件是否满足,并在不满足时提供清晰的错误消息[^3]。这种机制有助于捕获潜在的设计缺陷或误用,从而提高代码质量。 当 `EIGEN_STATIC_ASSERT` 的条件未通过时,通常会触发编译器错误并显示一条自定义的消息。这使得开发人员能够快速定位问题所在。例如,在处理固定大小矩阵的操作时,如果操作不符合特定约束(如对齐方式),则可以通过此宏强制中断编译过程。 #### 解决与 `EIGEN_STATIC_ASSERT` 相关的编译问题 要解决由 `EIGEN_STATIC_ASSERT` 引发的编译问题,可以采取以下方法: 1. **检查模板参数的一致性** 如果涉及动态尺寸固定尺寸混合使用的场景,则需确认这些参数之间是否存在冲突。例如,对于 `Matrix<double, Dynamic, Dynamic>` 类型的对象,其最大尺寸应合理设置以避免违反内存对齐规则。 2. **更新至最新版本的 Eigen** 部分已知问题可能已被修复于较新的发布版本中。因此建议升级到最新的稳定版库文件来规避此类异常情况的发生。比如从引用提到的内容可知,在 Eigen 2.0.13 中解决了若干重要 bug,其中包括因 SSE 对齐引发的崩溃以及不必要的动态分配等问题。 3. **审查目标链接配置** 若项目依赖多个第三方组件并通过 CMake 构建系统管理它们之间的关系,则应注意正确导出命名空间前缀以便下游模块识别导入的目标对象。具体而言,“双冒号”的约定能帮助 CMake 更好地区分本地定义实体还是外部引入资源[^1]。 4. **查阅日志文件诊断失败原因** 当遇到诸如 `"Configuring incomplete"` 这样的提示信息时,应该查看指定路径下的输出(`CMakeOutput.log`) 错误 (`CMakeError.log`) 日志记录进一步分析根本原因[^2]。 ```cpp // Example demonstrating use case of EIGEN_STATIC_ASSERT within custom function. template<typename Derived> void validate_matrix(const Eigen::MatrixBase<Derived>& mat){ EIGEN_STATIC_ASSERT((Derived::RowsAtCompileTime != Eigen::Dynamic), THIS_FUNCTION_REQUIRES_A_FIXED_SIZE_MATRIX); } ``` 上述代码片段展示了如何利用该宏检测输入矩阵是否具有固定的行列数属性;如果不符预期设定的话就会阻止后续逻辑继续运行下去直到修正为止。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值