Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Eigen:参考阵列振打器的有效方法_C++_C++11_Eigen_Eigen3 - Fatal编程技术网

C++ Eigen:参考阵列振打器的有效方法

C++ Eigen:参考阵列振打器的有效方法,c++,c++11,eigen,eigen3,C++,C++11,Eigen,Eigen3,我正在用原始指针连接一些代码。因此,我广泛使用了map类: void foo(T* raw_pointer){ const int rows = ...; const int cols = ...; Map<Matrix<T, rows, cols>> mat(raw_pointer); // DO some stuff with "mat" } 这个问题的一部分是,代码实际上在做什么并不清楚。如果给变量命名会更好: void foo(

我正在用原始指针连接一些代码。因此,我广泛使用了map类:

void foo(T* raw_pointer){
    const int rows = ...;
    const int cols = ...;
    Map<Matrix<T, rows, cols>> mat(raw_pointer);

    // DO some stuff with "mat"
}
这个问题的一部分是,代码实际上在做什么并不清楚。如果给变量命名会更好:

void foo(T* raw_pointer){
    const int rows = ...;
    const int cols = ...;
    Map<Matrix<T, rows, cols>> mat(raw_pointer);

    Matrix<T, 1, cols> thrust = mat.row(1);
    Matrix<T, 1, cols> psi = mat.row(4);
    Matrix<T, 1, cols> bias = mat.row(2);

    for (int i = 0 ; i < 1000 ; ++i)
        ... something = i * thrust.array() * sin(psi.array()) + bias.array();
}
这段代码可以工作,并且在测试时似乎引用了指针中的条目(而不是像前面的代码片段那样复制)。然而 自从Eigen文档发布以来,我一直担心它的效率。那么,在这种情况下,有人能告诉我定义变量类型的首选方法是什么吗

在我看来,我应该在这里使用
Ref
,但我不知道如何让它起作用。具体地说,我已经尝试将
auto
替换为

Eigen::Ref<Eigen::Array<T, 1, cols>>
Eigen::Ref

Eigen::Ref
但是编译器不喜欢这两个

auto-推力=[](auto&&mat){返回mat.row(1.array();};
auto thrust = [](auto&&mat){return mat.row(1).array();};
auto psi = [](auto&&mat){return mat.row(4).array();};
auto bias = [](auto&&mat){return mat.row(2).array();};

for (int i = 0 ; i < 1000 ; ++i)
    ... something = i * thrust(mat) * sin(psi(mat)) + bias(mat)
auto psi=[](auto&&mat){返回mat.row(4.array();}; 自动偏移=[](自动和&mat){返回mat.row(2.array();}; 对于(int i=0;i<1000;++i) ... 某物=i*推力(垫)*sin(psi(垫))+偏置(垫)
有名字。而且数组包装器不会持久存在。

自动推力=[](auto&&mat){return mat.row(1.array();};
auto psi=[](auto&&mat){返回mat.row(4.array();};
自动偏移=[](自动和&mat){返回mat.row(2.array();};
对于(int i=0;i<1000;++i)
... 某物=i*推力(垫)*sin(psi(垫))+偏置(垫)

有名字。而且数组包装不会持久。

为了避免每次使用
Map时都必须写入
array()
,为了避免每次使用
Map时都必须写入
array()
,有两件事:
Ref
不会复制;您可以使用
maphmm。唯一的问题是,我们有一个通用接口类,用于在该对象上获取
映射(mapMatrix.data())
,让我看看这是否适用于我们的案例。啊。事实上,这种方法不起作用,因为在使用我的接口文件时,底层指针有了很大的进步。但这对最初的问题是有效的……这是
auto
的完美安全用法。有两件事:
Ref
不会复制;您可以使用
maphmm。唯一的问题是,我们有一个通用接口类,用于在该对象上获取
映射(mapMatrix.data())
,让我看看这是否适用于我们的案例。啊。事实上,这种方法不起作用,因为在使用我的接口文件时,底层指针有了很大的进步。但这对原来的问题是有效的……这是
auto
的一个完美且安全的用法。类似地,您可以/需要编写
Array-推力=mat.row(1)等。类似地,您可以/需要写入
数组推力=mat.row(1)等。
Eigen::Ref<Eigen::Array<T, 1, cols>>
Eigen::Ref<Eigen::ArrayWrapper<Eigen::Matrix<T, 1, cols>>>
auto thrust = [](auto&&mat){return mat.row(1).array();};
auto psi = [](auto&&mat){return mat.row(4).array();};
auto bias = [](auto&&mat){return mat.row(2).array();};

for (int i = 0 ; i < 1000 ; ++i)
    ... something = i * thrust(mat) * sin(psi(mat)) + bias(mat)