将向量的值传递给特征库格式[重复]
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<float>()
【参考方案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)传递给其他类中的函数并使用传递的值运行函数[重复]