Eigen RowVectorXd按绝对值降序取索引输出全零问题排查
问题根因
- 索引向量未初始化有效序列:你在构造函数中仅将
oei初始化为全零向量,std::sort是对向量内已有元素做排序,全零元素排序后不会发生任何顺序变化,因此输出始终为全零。你需要先将oei初始化为0~dim-1(0-based索引)或1~dim(1-based索引,符合你给出的示例输出要求)的连续索引序列。 - 排序规则不符合需求:当前比较函数
return abs(v[i1]) < abs(v[i2])实现的是绝对值升序排列,你需要的降序需要反转比较逻辑。 - 类型不匹配优化:当前用
RowVectorXd(双精度浮点型)存储整数索引属于类型错配,虽然不会直接触发报错,但存在隐式转换风险,建议替换为RowVectorXi(整型向量)。
修复代码
OEI.h
#include <eigen3/Eigen/Dense> #include <iostream> #include <algorithm> using namespace Eigen; class OEI { public: int dim; // 构造函数初始化oei为1~dim的1-based索引序列,匹配你给出的示例输出要求 OEI(int dim) : dim(dim) { oei = RowVectorXi::LinSpaced(dim, 1, dim); }; // 替换为整型向量存储索引 RowVectorXi oei; public: void calculateOEI(RowVectorXd &v); };
OEI.cpp
#include "OEI.h" #include <eigen3/Eigen/Dense> #include <iostream> #include <algorithm> void OEI::calculateOEI(RowVectorXd &v) { // 反转比较逻辑,实现绝对值降序排序,1-based索引访问时做-1偏移避免越界 std::sort(oei.data(), oei.data() + oei.size(), [&v](int i1, int i2) { return abs(v[i1-1]) > abs(v[i2-1]); }); std::cout << oei.size() << std::endl; }
注:如果你的业务场景使用0-based索引,只需将构造函数的LinSpaced范围改为
0, dim-1,同时比较函数中去掉i1-1、i2-1的偏移即可。
内容的提问来源于stack exchange,提问作者johnny_b_good
相关产品推荐
相关产品推荐

