You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:57:03