Eigen error C2039: “THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES”: 不是“Eigen::internal::static_asse

本文介绍了一个使用Eigen库求解整数型矩阵逆时遇到的编译错误,并通过将整数类型改为浮点数类型成功解决问题的过程。

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

使用Eigen求矩阵的逆,代码如下:

int array[ 9][ 9] = {
0,0,0,1,1,0,1,0,1,
0,1,1,0,1,0,1,1,1,
0,1,0,1,0,0,1,1,0,
1,1,0,1,0,1,0,0,1,
0,1,0,1,1,0,1,1,1,
0,1,0,1,0,1,0,0,0,
0,0,0,1,1,0,0,0,0,
1,1,0,1,0,1,0,0,0,
0,1,0,1,1,0,1,0,0
};

Matrix< int , 9, 9> m = Map< Matrix< int , 9, 9> >( ( int* )array );

Matrix< int , 9, 9> n = m.inverse();

编译时提示错误error C2039: “THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES”: 不是“Eigen::internal::static_assertion<condition>”的成员。


将int类型改成double,

double array[ 9][ 9] = {
0,0,0,1,1,0,1,0,1,
0,1,1,0,1,0,1,1,1,
0,1,0,1,0,0,1,1,0,
1,1,0,1,0,1,0,0,1,
0,1,0,1,1,0,1,1,1,
0,1,0,1,0,1,0,0,0,
0,0,0,1,1,0,0,0,0,
1,1,0,1,0,1,0,0,0,
0,1,0,1,1,0,1,0,0
};

Matrix< double, 9, 9> m = Map< Matrix< double, 9, 9> >( ( double* )array );

Matrix< double, 9, 9> n = m.inverse();

问题就解决了。

Eigen库中,`internal::eigen_packet_wrapper` 是一个内部使用的模板类,主要用于封装向量化数据包(packet),以便在不同架构(如SSE、AVX、NEON等)上进行高效的数值计算。该类通常用于支持SIMD(Single Instruction, Multiple Data)操作,使得Eigen能够利用现代CPU的向量指令集优化性能。 类 `internal::eigen_packet_wrapper` 的定义通常类似于: ```cpp template<typename Packet, int n> class eigen_packet_wrapper; ``` 其中 `Packet` 表示底层向量类型(如 `__m128` 对于SSE),而 `n` 表示该数据包中包含的元素数量。该类的实例通常包含一个名为 `m_val` 的成员变量,用于存储实际的向量数据。 ### `m_val` 成员的用途 `m_val` 通常是一个类型为 `Packet` 的私有成员变量,用于保存实际的向量数据。例如,在使用SSE指令集时,若 `Packet` 是 `__m128` 类型(表示4个单精度浮点数),则 `m_val` 将存储这4个值作为一个打包的向量单元。该成员变量在Eigen的向量化表达式求值过程中被广泛使用,以实现高效的数值运算。 例如,在向量加法运算中,两个 `eigen_packet_wrapper<__m128, 4>` 类型的对象的 `m_val` 成员将被提取,并使用 `_mm_add_ps`(SSE中的加法指令)进行运算,结果将被封装到新的 `eigen_packet_wrapper` 对象中。 ```cpp // 示例:两个向量包相加 eigen_packet_wrapper<__m128, 4> a, b; a.m_val = _mm_set1_ps(1.0f); b.m_val = _mm_set1_ps(2.0f); eigen_packet_wrapper<__m128, 4> sum; sum.m_val = _mm_add_ps(a.m_val, b.m_val); // 使用SSE指令进行加法 ``` ### 使用场景 - **向量化数学运算**:`m_val` 被用于实现向量化的加法、乘法、比较等操作。 - **数据对齐与加载/存储**:Eigen通过 `m_val` 实现对齐内存访问(如 `_mm_load_ps` 和 `_mm_store_ps`),确保SIMD操作的高效执行。 - **类型抽象与平台兼容性**:通过封装底层Packet类型,`eigen_packet_wrapper` 为不同指令集提供统一接口,`m_val` 作为实际数据的载体,使得上层代码无需关心底层实现细节。 由于 `internal::eigen_packet_wrapper` 属于Eigen的内部实现机制,通常不建议直接在用户代码中使用。它主要用于Eigen的核心实现中,以支持高性能的线性代数运算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值