将向量的值传递给特征库格式[重复]

Posted

技术标签:

【中文标题】将向量的值传递给特征库格式[重复]【英文标题】:Passing values of vectors to Eigen library format [duplicate] 【发布时间】:2017-07-26 13:36:05 【问题描述】:

我正在尝试使用 Eigen 对 A 作为二维平方向量的能力来求解线性方程 Ax=b。我将 A 和 b 分别作为基于 C++ 的 2D 向量和 1D 向量。但是,我找不到将它们的值传递给特征格式矩阵和向量的方法。你能告诉我如何以 Eigen 格式复制变量吗? 此外,一开始应该包括什么才能使用 Map 类作为可能的溶剂?! 代码如下:

#include <iostream>
#include <vector>

#include "Eigen/Dense"

using namespace std;
using namespace Eigen;
int main()

    // Let's consider that the A and b are following CPP based vectors:
    vector<vector<double>> mainA=   10.,11.,12. , 13.,14.,15. , 16.,17.,18.  ;  
    vector<double> mainB =  2.,5.,8. ;

    // ??? Here I need to do something to pass the values to the following Eigen 
    //format matrix and vector

    MatrixXf A;
    VectorXf b;

    cout << "Here is the matrix A:\n" << A << endl;
    cout << "Here is the vector b:\n" << b << endl;
    Vector3f x = A.colPivHouseholderQr().solve(b);
    cout << "The solution is:\n" << x << endl;


【问题讨论】:

你为什么不only使用Eigen类型?为什么需要 C++ 向量? @Some程序员老兄原因是我目前有现有的向量,我需要将这些值用于我的操作! 我在这里找到了一些东西:eigen.tuxfamily.org/dox/group__TutorialMapClass.html> 但不知道如何正确使用它以及我应该在开头包含什么! @Avi Ginsburg 谢谢你的回答,我想知道主向量是否应该是“std::vector<:vector>>>”?!因为我尝试了 "std::vector<:vector>>" 并在 Map 中出现错误! 如果您想将double Eigen-vector 类型分配给float Eigen 矩阵/向量,您还需要将其转换为:Eigen::VectorXd::Map(mainA[i].data(), 3).cast&lt;float&gt;() 【参考方案1】:

正如 cmets 中提到的,Eigen::Map 应该可以解决问题。 通常不使用Unaligned 就可以逃脱,但为了正确/稳定,最好使用它:

auto A = Eigen::Map<Eigen::MatrixXd, Eigen::Unaligned>(mainA.data(), mainA.size(), mainA[0].size())
auto b = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(mainB.data(), mainB.size());

Vector3d x = A.colPivHouseholderQr().solve(b);

要回答以下关于健壮性的问题:这可以使用辅助函数来完成:

template <typename T, int Align>
Eigen::Map<Eigen::Matrix<T, -1, -1>, Align> CreateMatrix(const std::vector<std::vector<T>>& x)

    int R = x.size();
    assert(!x.empty());
    int C = x[0].size();
    #ifndef NDEBUG
    for(int r=1; r < R; r++)
        assert(x[r].size() == x[0].size());
    #endif
    return auto A = Eigen::Map<Eigen::Matrix<T,-1,-1>, Align>(x.data(), R, C);

虽然它看起来很冗长,但它会进行大量的健全性检查,然后您可以在进行单元测试的所有代码中依赖这些检查。

【讨论】:

我想知道是否有更可靠的方法来定义基于特征格式的矩阵或向量?我之所以问,是因为我的代码中有内存(与 malloc 相关)泄漏,您可以找到我的问题 here。感谢您的帮助。

以上是关于将向量的值传递给特征库格式[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将向量中的值传递给带有多个参数的函数

无法从构造函数中将数组值传递给向量

单击按钮后如何将输入值(TKinter)传递给其他类中的函数并使用传递的值运行函数[重复]

将 RDD 的值作为变量传递给另一个 RDD - Spark #Pyspark [重复]

将指针向量传递给c ++中的函数[重复]

如何将多个复选框值传递给php [重复]