有一个 class 和一个映射到 std::vector 属性的 Eigen::matrix 属性
Have a class with an Eigen::matrix attribute that maps to a std::vector attribute
我希望 class Test
有一个映射到 Test::_a 的 Eigen::Matrix。
这意味着每当我更改 std::vector 时,Eigen::Matrix 也会立即反映更改,因为向量和矩阵都使用相同的内存块来保存数据。
这个有效:
#include <Eigen/Dense>
#include <vector>
int main() {
std::vector<int> a;
a.resize(10);
typedef Eigen::Matrix<int, 1, Eigen::Dynamic> mat_type;
Eigen::Map< mat_type > a_eigen(a.data(), a.size());
}
但这行不通....
#include <Eigen/Dense>
#include <vector>
class Test {
public:
Test(int size) {
_a.resize(size);
_a_eigen(_a.data(), size );
}
std::vector<int> _a;
Eigen::Map< Eigen::Matrix<int, 1, Eigen::Dynamic> > _a_eigen;
};
int main() {
Test t(10);
}
下面也不起作用,因为 cout 什么都不打印
#include <Eigen/Dense>
#include <vector>
#include <iostream>
class Test {
public:
typedef Eigen::Matrix<int, 1, Eigen::Dynamic> mat_type;
Test(int size) {
_a.resize(size);
Eigen::Map<mat_type>(_a_eigen) = Eigen::Map<mat_type>(_a.data(), size );
for (int i = 0; i < size; ++i) _a[i] = i;
}
std::vector<int> _a;
mat_type _a_eigen;
};
int main() {
Test t(10);
std::cout << t._a_eigen;
}
您需要在 class' 构造函数的 initializer-list 中初始化地图:
#include <Eigen/Core>
#include <vector>
class Test {
public:
Test(int size) : _a(size), _a_eigen(_a.data(), size) { }
std::vector<int> _a;
Eigen::Map< Eigen::Matrix<int, 1, Eigen::Dynamic> > _a_eigen;
};
我希望 class Test
有一个映射到 Test::_a 的 Eigen::Matrix。
这意味着每当我更改 std::vector 时,Eigen::Matrix 也会立即反映更改,因为向量和矩阵都使用相同的内存块来保存数据。
这个有效:
#include <Eigen/Dense>
#include <vector>
int main() {
std::vector<int> a;
a.resize(10);
typedef Eigen::Matrix<int, 1, Eigen::Dynamic> mat_type;
Eigen::Map< mat_type > a_eigen(a.data(), a.size());
}
但这行不通....
#include <Eigen/Dense>
#include <vector>
class Test {
public:
Test(int size) {
_a.resize(size);
_a_eigen(_a.data(), size );
}
std::vector<int> _a;
Eigen::Map< Eigen::Matrix<int, 1, Eigen::Dynamic> > _a_eigen;
};
int main() {
Test t(10);
}
下面也不起作用,因为 cout 什么都不打印
#include <Eigen/Dense>
#include <vector>
#include <iostream>
class Test {
public:
typedef Eigen::Matrix<int, 1, Eigen::Dynamic> mat_type;
Test(int size) {
_a.resize(size);
Eigen::Map<mat_type>(_a_eigen) = Eigen::Map<mat_type>(_a.data(), size );
for (int i = 0; i < size; ++i) _a[i] = i;
}
std::vector<int> _a;
mat_type _a_eigen;
};
int main() {
Test t(10);
std::cout << t._a_eigen;
}
您需要在 class' 构造函数的 initializer-list 中初始化地图:
#include <Eigen/Core>
#include <vector>
class Test {
public:
Test(int size) : _a(size), _a_eigen(_a.data(), size) { }
std::vector<int> _a;
Eigen::Map< Eigen::Matrix<int, 1, Eigen::Dynamic> > _a_eigen;
};