我正在写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);
}
答案 0 :(得分:1)
两个版本相同,并且都是安全的。这是因为ArrayWrapper
返回的诸如Block
或middleCols()
之类的代理表达式是按值嵌套的,而不是按引用嵌套的。