diff --git a/src/array.hpp b/src/array.hpp index bdce598219daffc4925660dc3211be8171be04fc..025f2ff8840f25e0046728a4ddeb4d4aea1f5aed 100644 --- a/src/array.hpp +++ b/src/array.hpp @@ -67,7 +67,7 @@ public: std::array<size_t, NDim-1> stride; size_t offset; - offset = stride[axis] * pos; + offset = offset_ + stride_[axis] * pos; for (size_t i = 0, j = 0; i < NDim; ++i) { if (i == axis) @@ -89,7 +89,7 @@ public: std::array<size_t, NDim> stride; size_t offset; - offset = stride[axis] * begin; + offset = offset_ + stride_[axis] * begin; for (size_t i = 0; i < NDim; ++i) { if (i == axis) @@ -143,6 +143,23 @@ public: #endif return idx; } + + typedef Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> EigenMatrix; + typedef Eigen::Map<EigenMatrix, 0, Eigen::Stride<Eigen::Dynamic,Eigen::Dynamic> > EigenMap; + + operator EigenMap() const + { + static_assert(NDim == 2, "matrixes must be two-dimensional"); + return EigenMap((Scalar *)data_.data() + offset_, + shape_[0], shape_[1], + {(long)stride_[1], (long)stride_[0]}); + } + + operator EigenMatrix() const + { + return EigenMap(*this); + } }; + #endif diff --git a/src/main.cpp b/src/main.cpp index 1e02e127aa75eb1bc9698f06ab058857df7360fe..f4aaac31bf2080e41e95595bb734346cff03c52a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,7 +3,7 @@ #include "action.hpp" -template <typename Scalar=double> +template <typename Scalar> void dump(Array<Scalar,3> Q) { for (size_t i = 0; i < Q.template shape<0>(); ++i) { @@ -21,12 +21,22 @@ void dump(Array<Scalar,3> Q) int main() { - std::vector<double> v(2*2*2); - Array<double,3> Q(v,{2,2,2},false); + std::vector<ADComplex> v(2*2*2); + Array<ADComplex,3> Q0(v,{2,2,2},true); + auto Q = Q0.slice<0>(1); - S_2(Q.slice<2>()); + std::cout << Q0.index(1u,0u,0u) << std::endl; - dump<>(Q); + S_2(Q); + + std::cout << Q.index(0u,0u) << std::endl; + + Array<ADComplex,3>::EigenMap mat(Q); + + mat(1,1) = 123; + + dump(Q0); + std::cout << mat << std::endl; return 0; }