C++ Eigen:参考阵列振打器的有效方法
我正在用原始指针连接一些代码。因此,我广泛使用了map类: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(
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)