gpt4 book ai didi

c++ - Eigen::map 真的有 "view"语义吗

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:40 24 4
gpt4 key购买 nike

我想用 Eigen 在一些 C 风格的代码中做一些计算,函数接口(interface)有一个原始指针,如下所示,

#include <iostream>
#include <memory>
#include <Eigen/Dense>

using namespace Eigen;
typedef Eigen::Matrix<double, -1, -1, Eigen::RowMajor> Mrow;

void compute_with_Eigen(double * p_data, int row, int col)
{
// Q1: is there any data copy here?
Eigen::MatrixXd Mc = Eigen::Map<Mrow>(p_data, row, col);

// do computations with Mc, for example
auto M_temp = Mc.inverse();
Mc = M_temp;

// Q2: why is this assign-back necessary?
Eigen::Map<Mrow>( p_data, row, col ) = Mc;
}

int main()
{

std::unique_ptr<double[]> p(new double[10]);
for (int i = 0; i < 9; ++i)
{
p[i]=i+1.0;
std::cout<<p[i]<<std::endl;
}

compute_with_Eigen(p.get(),3,3);

std::cout<<"after inverse\n";
for (int i = 0; i < 10; ++i)
std::cout<<p[i]<<std::endl;
}

我有问题 1,因为此 thread 中已接受的答案建议有一些拷贝,但是,原则上“ View ”不应复制任何内容。

我有问题 2,因为否则结果不是预期的,但是如果我真的必须分配回来,这不像一个“ View ”(另请参阅 answer)

最佳答案

广告 Q1:

Eigen::MatrixXd Mc = Eigen::Map<Mrow>(p_data, row, col);

这会将临时 Map 复制到动态 Matrix Mc 中。如果你想避免那个拷贝,你可以写:

Eigen::Map<Mrow> Mc(p_data, row, col);

广告问题 2:如果将 Mc 声明为 map (如上),则可以避免该拷贝。在您编写它时,您正在将值从 MatrixXd Mc 复制回临时 Map

顺便说一句,写作

    auto M_temp = Mc.inverse();
Mc = M_temp;

几乎相当于直接写

    Mc = Mc.inverse();

因为 auto M_temp 实际上不是一个矩阵,而是一个表达式模板,一旦它被分配给一个实际的矩阵(或 M_temp.eval())就会计算一个逆被称为。

关于c++ - Eigen::map 真的有 "view"语义吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41002437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com