ndarray
NumPy-friendly multidimensional arrays in C++
Loading...
Searching...
No Matches
eigen.h
Go to the documentation of this file.
1// -*- c++ -*-
2/*
3 * Copyright (c) 2010-2012, Jim Bosch
4 * All rights reserved.
5 *
6 * ndarray is distributed under a simple BSD-like license;
7 * see the LICENSE file that should be present in the root
8 * of the source distribution, or alternately available at:
9 * https://github.com/ndarray/ndarray
10 */
11#ifndef NDARRAY_eigen_h_INCLUDED
12#define NDARRAY_eigen_h_INCLUDED
13
21#if defined __GNUC__ && __GNUC__>=6
22 #pragma GCC diagnostic ignored "-Wignored-attributes"
23 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
24#endif
25
26#include "Eigen/Core"
27#include "ndarray.h"
28#include "ndarray/eigen_fwd.h"
29
30namespace ndarray {
31namespace detail {
32
33template <typename T, int N, int C, typename XprKind>
35
36template <typename T, int N, int C>
37struct SelectEigenPlainBase<T, N, C, Eigen::MatrixXpr> {
38 typedef typename boost::remove_const<T>::type Scalar;
39 typedef Eigen::Matrix<
40 Scalar, Eigen::Dynamic, N == 1 ? 1 : Eigen::Dynamic,
41 Eigen::AutoAlign|(C >= 0 && N > 1 ? Eigen::RowMajor : Eigen::ColMajor)
42 > Type;
43};
44
45template <typename T, int N, int C>
46struct SelectEigenPlainBase<T, N, C, Eigen::ArrayXpr> {
47 typedef typename boost::remove_const<T>::type Scalar;
48 typedef Eigen::Array<
49 Scalar, Eigen::Dynamic, N == 1 ? 1 : Eigen::Dynamic,
50 Eigen::AutoAlign|(C >= 0 && N > 1 ? Eigen::RowMajor : Eigen::ColMajor)
51 > Type;
52};
53
54template <typename T, int N, int C, typename XprKind, bool AddConst=boost::is_const<T>::value>
56
57template <typename T, int N, int C, typename XprKind>
58struct SelectEigenPlain<T, N, C, XprKind, true> {
59 typedef typename SelectEigenPlainBase<T, N, C, XprKind>::Type const Type;
60};
61
62template <typename T, int N, int C, typename XprKind>
63struct SelectEigenPlain<T, N, C, XprKind, false> {
65};
66
67template <typename T, int N, int C, typename XprKind>
68struct SelectEigenMap; // unspecialized template parameters means not supported.
69
70// 1-d, not contiguous
71template <typename T, typename XprKind>
72struct SelectEigenMap<T, 1, 0, XprKind> {
73
74 typedef Eigen::Map<
76 Eigen::Unaligned,
77 Eigen::InnerStride<>
78 > Type;
79
80 static Type apply(ndarray::Array<T, 1, 0> const & array) {
81 return Type(array.getData(), array.template getSize<0>(),
82 Eigen::InnerStride<>(array.template getStride<0>()));
83 }
84
85};
86
87// 1-d, row-major contiguous
88template <typename T, typename XprKind>
89struct SelectEigenMap<T, 1, 1, XprKind> {
90
91 typedef Eigen::Map<
93 Eigen::Unaligned
94 > Type;
95
96 static Type apply(ndarray::Array<T, 1, 1> const & array) {
97 return Type(array.getData(), array.template getSize<0>());
98 }
99
100};
101
102// 1-d, column-major contiguous
103template <typename T, typename XprKind>
104struct SelectEigenMap<T, 1, -1, XprKind> {
105
106 typedef Eigen::Map<
107 typename SelectEigenPlain<T, 1, -1, XprKind>::Type,
108 Eigen::Unaligned
109 > Type;
110
111 static Type apply(ndarray::Array<T, 1, -1> const & array) {
112 return Type(array.getData(), array.template getSize<0>());
113 }
114
115};
116
117// 2-d, not contiguous
118template <typename T, typename XprKind>
119struct SelectEigenMap<T, 2, 0, XprKind> {
120
121 typedef Eigen::Map<
123 Eigen::Unaligned,
124 Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>
125 > Type;
126
127 static Type apply(ndarray::Array<T, 2, 0> const & array) {
128 return Type(array.getData(), array.template getSize<0>(), array.template getSize<1>(),
129 Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>(
130 array.template getStride<0>(), array.template getStride<1>()
131 ));
132 }
133
134};
135
136// 2-d, row-major, contiguous within a row
137template <typename T, typename XprKind>
138struct SelectEigenMap<T, 2, 1, XprKind> {
139
140 typedef Eigen::Map<
142 Eigen::Unaligned,
143 Eigen::OuterStride<>
144 > Type;
145
146 static Type apply(ndarray::Array<T, 2, 1> const & array) {
147 return Type(array.getData(), array.template getSize<0>(), array.template getSize<1>(),
148 Eigen::OuterStride<>(array.template getStride<0>()));
149 }
150
151};
152
153// 2-d, row-major, fully contiguous
154template <typename T, typename XprKind>
155struct SelectEigenMap<T, 2, 2, XprKind> {
156
157 typedef Eigen::Map<
159 Eigen::Unaligned
160 > Type;
161
162 static Type apply(ndarray::Array<T, 2, 2> const & array) {
163 return Type(array.getData(), array.template getSize<0>(), array.template getSize<1>());
164 }
165
166};
167
168// 2-d, column-major, contiguous within a column
169template <typename T, typename XprKind>
170struct SelectEigenMap<T, 2, -1, XprKind> {
171
172 typedef Eigen::Map<
173 typename SelectEigenPlain<T, 2, -1, XprKind>::Type,
174 Eigen::Unaligned,
175 Eigen::OuterStride<>
176 > Type;
177
178 static Type apply(ndarray::Array<T, 2, -1> const & array) {
179 return Type(array.getData(), array.template getSize<0>(), array.template getSize<1>(),
180 Eigen::OuterStride<>(array.template getStride<1>()));
181 }
182
183};
184
185// 2-d, column-major, fully contiguous
186template <typename T, typename XprKind>
187struct SelectEigenMap<T, 2, -2, XprKind> {
188
189 typedef Eigen::Map<
190 typename SelectEigenPlain<T, 2, -2, XprKind>::Type,
191 Eigen::Unaligned
192 > Type;
193
194 static Type apply(ndarray::Array<T, 2, -2> const & array) {
195 return Type(array.getData(), array.template getSize<0>(), array.template getSize<1>());
196 }
197
198};
199
200} // namespace detail
201
202
204
230template <typename XprKind, typename T, int N, int C>
234}
235
236template <typename XprKind, typename T, int N, int C>
237typename detail::SelectEigenMap<T, N, C, XprKind>::Type
238asEigen(ArrayRef<T, N, C> const & a) {
239 return detail::SelectEigenMap<T, N, C, XprKind>::apply(a);
240}
241
242template <typename T, int N, int C>
243typename detail::SelectEigenMap<T, N, C, Eigen::ArrayXpr>::Type
244asEigenArray(Array<T, N, C> const & a) {
245 return asEigen<Eigen::ArrayXpr, T, N, C>(a);
246}
247
248template <typename T, int N, int C>
249typename detail::SelectEigenMap<T, N, C, Eigen::ArrayXpr>::Type
250asEigenArray(ArrayRef<T, N, C> const & a) {
251 return asEigen<Eigen::ArrayXpr, T, N, C>(a);
252}
253
254template <typename T, int N, int C>
255typename detail::SelectEigenMap<T, N, C, Eigen::MatrixXpr>::Type
256asEigenMatrix(Array<T, N, C> const & a) {
257 return asEigen<Eigen::MatrixXpr, T, N, C>(a);
258}
259
260template <typename T, int N, int C>
261typename detail::SelectEigenMap<T, N, C, Eigen::MatrixXpr>::Type
262asEigenMatrix(ArrayRef<T, N, C> const & a) {
263 return asEigen<Eigen::MatrixXpr, T, N, C>(a);
264}
266
267} // namespace ndarray
268
269#endif // !NDARRAY_eigen_h_INCLUDED
Element * getData() const
Return a raw pointer to the first element of the array.
Definition ArrayBase.h:130
A multidimensional strided array.
Definition Array.h:35
detail::SelectEigenMap< T, N, C, XprKind >::Type asEigen(Array< T, N, C > const &a)
Definition eigen.h:232
Forward declarations for ndarray/eigen interface.
Main public header file for ndarray.
Definition eigen.h:68