Eigen::MatrixXd.块分配使用 std::vector
Eigen::MatrixXd.block assignment using a std::vector
想法是将 std::vector 中的值分配给 Eigen::MatrixXd 中的块。
我的问题是,什么是好的方法?
1 1 1 1 1 1
1 1 1 to 1 102 123
1 1 1 1 1 1
我尝试将 std::vector 转换为 Eigen::Map,但没有成功。
我有一个工作代码 [以下片段],但它并没有太大吸引力。也许有更简单的方法?
void do_work(Eigen::MatrixXd &m, const std::vector<double> &v,
const Index i, const Index j,
const Index p, const Index q) {
auto stop = j + q;
for (Index start = j, idx = 0; start < stop; ++start, ++idx)
m.block(i, start, p, 1) << v[idx];
}
Eigen::MatrixXd m(3, 3);
m << 1, 1, 1, 1, 1, 1, 1, 1, 1;
std::vector<double> v = {102, 123};
Index change_row = 0;
Index change_column_from = 1, change_column_to = v.size();
do_work(m, v, change_row, change_column_from, 1, change_column_to);
预期结果是以高效(并且可能更干净)的方式执行操作。
要将 std::vector<double>
转换为 Eigen::Map
写入,例如
Eigen::Map<Eigen::VectorXd> map(v.data(), v.size());
用于 read-writable 访问,或以下内容,如果您有 read-only 访问您的矢量:
Eigen::Map<const Eigen::VectorXd> map(v.data(), v.size());
这可以分配给一个 block-expression,假设块的大小与地图的大小匹配:
m.block(i,j, map.size(), 1) = map.transpose();
// transpose is actually optional here
想法是将 std::vector 中的值分配给 Eigen::MatrixXd 中的块。
我的问题是,什么是好的方法?
1 1 1 1 1 1
1 1 1 to 1 102 123
1 1 1 1 1 1
我尝试将 std::vector 转换为 Eigen::Map,但没有成功。 我有一个工作代码 [以下片段],但它并没有太大吸引力。也许有更简单的方法?
void do_work(Eigen::MatrixXd &m, const std::vector<double> &v,
const Index i, const Index j,
const Index p, const Index q) {
auto stop = j + q;
for (Index start = j, idx = 0; start < stop; ++start, ++idx)
m.block(i, start, p, 1) << v[idx];
}
Eigen::MatrixXd m(3, 3);
m << 1, 1, 1, 1, 1, 1, 1, 1, 1;
std::vector<double> v = {102, 123};
Index change_row = 0;
Index change_column_from = 1, change_column_to = v.size();
do_work(m, v, change_row, change_column_from, 1, change_column_to);
预期结果是以高效(并且可能更干净)的方式执行操作。
要将 std::vector<double>
转换为 Eigen::Map
写入,例如
Eigen::Map<Eigen::VectorXd> map(v.data(), v.size());
用于 read-writable 访问,或以下内容,如果您有 read-only 访问您的矢量:
Eigen::Map<const Eigen::VectorXd> map(v.data(), v.size());
这可以分配给一个 block-expression,假设块的大小与地图的大小匹配:
m.block(i,j, map.size(), 1) = map.transpose();
// transpose is actually optional here