【问题标题】:Sorting RowVectorXd and return indices in new vector对 RowVectorXd 进行排序并在新向量中返回索引
【发布时间】:2022-01-08 17:22:39
【问题描述】:

我正在尝试按绝对值对 RowVector 进行排序,并以降序返回与无序向量相对应的索引。所以如果我有:x_rcv = (-2.5,3.9,1.5) oei(索引向量)应该读为:oei = (2,1,3)

所以我总是得到一个 oei = (0,0,0,0,0,0,0)

OEI.cpp

#include "OEI.h"
#include <eigen3/Eigen/Dense>
#include <iostream>
#include <algorithm>

void OEI::calculateOEI(RowVectorXd &v)
{

    std::sort(oei.data(), oei.data() + oei.size(), [&v](int i1, int i2)
              { return abs(v[i1]) < abs(v[i2]); });
    
    std::cout << oei.size() << std::endl;
}

OEI.h

#include <eigen3/Eigen/Dense>
#include <iostream>
#include <algorithm>
using namespace Eigen;

class OEI
{
public:
    int dim;
    OEI(int dim) : dim(dim) { oei = RowVectorXd::Zero(dim); };
    RowVectorXd oei;

public:
    void calculateOEI(RowVectorXd &v);
    
};

main.cpp

int main(){

Encode vec(4, 4, 7);
    awgn channel(7);
    OEI errorvec(7);

    vec.encodeDataVector();
    cout << vec.x << endl;
    channel.addGausian(vec.x);
    cout << channel.x_rcv << endl;
    errorvec.calculateOEI(channel.x_rcv);
    cout << errorvec.oei << endl;

}

我只发布了不起作用的相关代码 sn-ps。如果您需要更多信息,请告诉我。

谢谢!

【问题讨论】:

    标签: c++ sorting eigen


    【解决方案1】:

    向量oei需要包含每个索引:

    构造函数应该是:

    OEI(int dim) : dim(dim) { 
        oei = RowVectorXd::Zero(dim);
        for (int i=0; i<dim; ++i) oei[i] = i;
    };
    

    要按降序排序,排序比较器应大于

    std::sort(oei.data(), oei.data() + oei.size(), [&v](int i1, int i2)
              { return abs(v[i1]) > abs(v[i2]); });
    

    【讨论】:

    • 我不完全明白为什么这是必要的。这是某种“类型转换”吗?因为 oei 实际上是在构造函数中用零初始化的,不是吗?
    • oei 应该是索引向量,对于 size=3 的向量,它应该包含 0、1 和 2。我认为我使用的“初始化”一词令人困惑。
    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 2015-12-31
    • 2013-04-27
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多