返回包含ArrayWrapper的表达式

时间:2018-12-10 19:36:48

标签: eigen3

我正在写C ++ / Python混合体。粘合这两个部分的库支持本征矩阵/阵列,但不支持张量。

做这样的事安全吗?

#include <iostream>
#include <Eigen/Eigen>
using namespace Eigen;

template<typename D>
auto f(DenseBase<D>& x, const Index i) {
    // x2 is destroyed when the program leaves 
    // this function.
    ArrayWrapper<D> x2(x.derived());  
    return x2.middleCols(i * 3, 3);
}

int main() {
    ArrayXf a(3, 9);
    a = 0;
    f(x, 1) = 1;
    std::cout << x << "\n";
}

或者,这样做更好吗?

template<typename D>
auto f(DenseBase<D>& x, const Index i) {
    return x.derived().array().middleCols(i * 3, 3);
}

1 个答案:

答案 0 :(得分:1)

两个版本相同,并且都是安全的。这是因为ArrayWrapper返回的诸如BlockmiddleCols()之类的代理表达式是按值嵌套的,而不是按引用嵌套的。