【发布时间】:2016-07-21 03:57:43
【问题描述】:
我有以下代码:
template <typename T>
using Arr = Array<T, Dynamic, 1>;
template <typename T>
using Arr2 = Array<T, Dynamic, Dynamic>;
template <typename T>
Arr2<typename T::Scalar> reshape (const ArrayBase<T> & A, const uint n, const uint m) {
return Map<const Arr2<typename T::Scalar>>(A.eval().data(), n, m);
}
Arr<double> v = Arr<double>::LinSpaced(16, 0, 15);
auto w = reshape(v, 4, 4).transpose();
std::cout << w << std::endl;
产生错误
静态 void Eigen::internal::checkTransposeAliasing_impl::run(const Derived&, const OtherDerived&) [with Derived = Eigen::Array; OtherDerived = Eigen::Transpose >; bool MightHaveTransposeAliasing = true]:断言 `(!check_transpose_aliasing_run_time_selector ::IsTransposed,OtherDerived> ::run(extract_data(dst), other)) && "期间检测到混叠 转置,使用 transposeInPlace() " "或将 rhs 评估为 临时使用 .eval()"' 失败。
添加eval 确实解决了这个问题:
auto w = reshape(v, 4, 4).transpose().eval();
(但添加它会像 << w.eval() << 那样执行打印行)。
我想更好地了解正在发生的事情,并了解是否有其他方法可以解决此问题。
谢谢
【问题讨论】: