25 #include <multi/array.hpp> 27 template<
class T, std::
size_t N,
class base_type = std::array<T, N>>
31 T
const&
operator()(std::size_t
n)
const {
return base_type::operator[](
n); }
33 template<
class Scalar>
36 std::transform(v.begin(), v.end(), v.begin(), [&
s](
auto e) {
return e *
s; });
41 template<
class T, std::
size_t N1, std::
size_t N2,
class base_type = std::array<std::array<T, N2>, N1>>
46 std::array<T, N2> val;
51 T
const&
operator()(std::size_t i, std::size_t j)
const {
return base_type::operator[](i)[j]; }
52 T&
operator()(std::size_t i, std::size_t j) {
return base_type::operator[](i)[j]; }
55 for (
auto i = 0; i != N1; ++i)
57 for (
auto j = 0; j != N2; ++j)
58 os <<
self(i, j) <<
',';
67 class base_type = boost::multi::array<T, D>>
68 struct Array : base_type
70 using base_type::base_type;
73 base_type::operator=(t);
76 Array(
int rs,
int cs) : base_type({rs, cs}) {}
82 return std::get<0>(base_type::sizes());
84 return std::get<1>(base_type::sizes());
89 auto rows()
const {
return std::get<0>(base_type::sizes()); }
90 auto cols()
const {
return std::get<1>(base_type::sizes()); }
91 void resize(
int rs,
int cs) { base_type::reextent({rs, cs}); }
92 using sizes_type = decltype(std::declval<base_type const&>().sizes());
96 template<
class... Ints>
99 base_type::reextent(sizes...);
105 base_type::reextent(std::apply(
107 return typename base_type::extensions_type{
static_cast<typename base_type::size_type
>(ss)...};
111 template<
class... Ints>
114 base_type::reextent({
ns...});
116 typename base_type::element_ptr
data() {
return base_type::data_elements(); }
117 typename base_type::element_const_ptr
data()
const {
return base_type::data_elements(); }
120 template<
class T,
class base_type>
121 struct Array<T, 1, base_type> : base_type
123 using base_type::base_type;
126 std::fill(base_type::begin(), base_type::end(), t);
133 std::transform(a.
begin(), a.
end(), b.
begin(), ret.begin(), [](
auto a,
auto b) {
return a - b; });
138 assert(a.extensions() == b.extensions());
139 Array ret(a.extensions());
140 std::transform(a.
begin(), a.
end(), b.
begin(), ret.begin(), [](
auto a,
auto b) {
return a + b; });
143 auto rows()
const {
return base_type::size(); }
144 using sizes_type = decltype(std::declval<base_type const&>().sizes());
153 return std::get<0>(base_type::sizes());
158 template<
class... Ints>
161 base_type::reextent(
typename base_type::extensions_type({
static_cast<typename base_type::size_type
>(
ns)...}));
165 Array ret(a.extensions());
166 std::transform(a.
begin(), a.
end(), ret.begin(), [&](
auto const&
e) {
return t *
e; });
169 typename base_type::element_ptr
data() {
return base_type::data_elements(); }
170 typename base_type::element_const_ptr
data()
const {
return base_type::data_elements(); }
173 struct Range : boost::multi::index_range
175 using boost::multi::index_range::index_range;
176 static auto all() {
return boost::multi::ALL; }
182 template<
class... Args>
213 template<
class T,
int size>
217 for (
int i = 0; i < size; i++)
236 result[0] =
s * v[0];
237 result[1] =
s * v[1];
246 result[0] = v1[0] + v2[0];
247 result[1] = v1[1] + v2[1];
255 result[0] = v1[0] - v2[0];
256 result[1] = v1[1] - v2[1];
264 result[0] =
s * v[0];
265 result[1] =
s * v[1];
266 result[2] =
s * v[2];
273 result[0] =
s * v[0];
274 result[1] =
s * v[1];
275 result[2] =
s * v[2];
283 result[0] = v1[0] + v2[0];
284 result[1] = v1[1] + v2[1];
285 result[2] = v1[2] + v2[2];
292 result[0] = v1[0] - v2[0];
293 result[1] = v1[1] - v2[1];
294 result[2] = v1[2] - v2[2];
302 result[0] =
s * v[0];
303 result[1] =
s * v[1];
304 result[2] =
s * v[2];
305 result[3] =
s * v[3];
312 result[0] =
s * v[0];
313 result[1] =
s * v[1];
314 result[2] =
s * v[2];
315 result[3] =
s * v[3];
323 result[0] = v1[0] + v2[0];
324 result[1] = v1[1] + v2[1];
325 result[2] = v1[2] + v2[2];
326 result[3] = v1[3] + v2[3];
333 result[0] = v1[0] - v2[0];
334 result[1] = v1[1] - v2[1];
335 result[2] = v1[2] - v2[2];
336 result[3] = v1[3] - v2[3];
344 sM(0, 0) =
s * M(0, 0);
345 sM(0, 1) =
s * M(0, 1);
346 sM(0, 2) =
s * M(0, 2);
347 sM(1, 0) =
s * M(1, 0);
348 sM(1, 1) =
s * M(1, 1);
349 sM(1, 2) =
s * M(1, 2);
350 sM(2, 0) =
s * M(2, 0);
351 sM(2, 1) =
s * M(2, 1);
352 sM(2, 2) =
s * M(2, 2);
359 C(0, 0) =
A(0, 0) *
B(0, 0) +
A(0, 1) *
B(1, 0) +
A(0, 2) *
B(2, 0);
360 C(0, 1) =
A(0, 0) *
B(0, 1) +
A(0, 1) *
B(1, 1) +
A(0, 2) *
B(2, 1);
361 C(0, 2) =
A(0, 0) *
B(0, 2) +
A(0, 1) *
B(1, 2) +
A(0, 2) *
B(2, 2);
362 C(1, 0) =
A(1, 0) *
B(0, 0) +
A(1, 1) *
B(1, 0) +
A(1, 2) *
B(2, 0);
363 C(1, 1) =
A(1, 0) *
B(0, 1) +
A(1, 1) *
B(1, 1) +
A(1, 2) *
B(2, 1);
364 C(1, 2) =
A(1, 0) *
B(0, 2) +
A(1, 1) *
B(1, 2) +
A(1, 2) *
B(2, 2);
365 C(2, 0) =
A(2, 0) *
B(0, 0) +
A(2, 1) *
B(1, 0) +
A(2, 2) *
B(2, 0);
366 C(2, 1) =
A(2, 0) *
B(0, 1) +
A(2, 1) *
B(1, 1) +
A(2, 2) *
B(2, 1);
367 C(2, 2) =
A(2, 0) *
B(0, 2) +
A(2, 1) *
B(1, 2) +
A(2, 2) *
B(2, 2);
374 for (
int i = 0; i < 3; i++)
375 for (
int j = 0; j < 3; j++)
376 ApB(i, j) =
A(i, j) +
B(i, j);
384 for (
int i = 0; i < 3; i++)
385 for (
int j = 0; j < 3; j++)
386 AmB(i, j) =
A(i, j) -
B(i, j);
393 Av[0] =
A(0, 0) * v[0] +
A(0, 1) * v[1] +
A(0, 2) * v[2];
394 Av[1] =
A(1, 0) * v[0] +
A(1, 1) * v[1] +
A(1, 2) * v[2];
395 Av[2] =
A(2, 0) * v[0] +
A(2, 1) * v[1] +
A(2, 2) * v[2];
402 vA[0] =
A(0, 0) * v[0] +
A(1, 0) * v[1] +
A(2, 0) * v[2];
403 vA[1] =
A(0, 1) * v[0] +
A(1, 1) * v[1] +
A(2, 1) * v[2];
404 vA[2] =
A(0, 2) * v[0] +
A(1, 2) * v[1] +
A(2, 2) * v[2];
411 ApB(0, 0) =
A(0, 0) +
B(0, 0);
412 ApB(0, 1) =
A(0, 1) +
B(0, 1);
413 ApB(0, 2) =
A(0, 2) +
B(0, 2);
414 ApB(1, 0) =
A(1, 0) +
B(1, 0);
415 ApB(1, 1) =
A(1, 1) +
B(1, 1);
416 ApB(1, 2) =
A(1, 2) +
B(1, 2);
417 ApB(2, 0) =
A(2, 0) +
B(2, 0);
418 ApB(2, 1) =
A(2, 1) +
B(2, 1);
419 ApB(2, 2) =
A(2, 2) +
B(2, 2);
426 AmB(0, 0) =
A(0, 0) -
B(0, 0);
427 AmB(0, 1) =
A(0, 1) -
B(0, 1);
428 AmB(0, 2) =
A(0, 2) -
B(0, 2);
429 AmB(1, 0) =
A(1, 0) -
B(1, 0);
430 AmB(1, 1) =
A(1, 1) -
B(1, 1);
431 AmB(1, 2) =
A(1, 2) -
B(1, 2);
432 AmB(2, 0) =
A(2, 0) -
B(2, 0);
433 AmB(2, 1) =
A(2, 1) -
B(2, 1);
434 AmB(2, 2) =
A(2, 2) -
B(2, 2);
466 inline double operator*(
const Vec3& v1,
const Vec3& v2) {
return (v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]); }
471 zA(0, 0) = z *
A(0, 0);
472 zA(0, 1) = z *
A(0, 1);
473 zA(0, 2) = z *
A(0, 2);
474 zA(1, 0) = z *
A(1, 0);
475 zA(1, 1) = z *
A(1, 1);
476 zA(1, 2) = z *
A(1, 2);
477 zA(2, 0) = z *
A(2, 0);
478 zA(2, 1) = z *
A(2, 1);
479 zA(2, 2) = z *
A(2, 2);
488 Ax[0] =
A(0, 0) * x[0] +
A(0, 1) * x[1] +
A(0, 2) * x[2];
489 Ax[1] =
A(1, 0) * x[0] +
A(1, 1) * x[1] +
A(1, 2) * x[2];
490 Ax[2] =
A(2, 0) * x[0] +
A(2, 1) * x[1] +
A(2, 2) * x[2];
496 return std::inner_product(a.begin(), a.end(), b.begin(), 0., std::plus<>{},
497 [](
auto ae,
auto be) {
return (ae - be) * (ae - be); });
506 inline int index(
int row,
int col)
const 508 return ((row > col) ? ((row * (row + 1) >> 1) + col) : ((col * (col + 1) >> 1) + row));
514 N = (
n * (
n + 1)) >> 1;
518 inline int rows()
const {
return N; }
541 memcpy(array.
data(), vec.
data(), array.
size() *
sizeof(double));
547 for (
int i = 0; i < vec.
size(); i++)
549 array(3 * i + 0) = vec(i)[0];
550 array(3 * i + 1) = vec(i)[1];
551 array(3 * i + 2) = vec(i)[2];
560 memcpy(vec.
data(), array.
data(), array.
size() *
sizeof(double));
566 memcpy(vec.
data(), array.
data(), array.
size() *
sizeof(double));
573 assert(array.
extent(1) == 2);
574 memcpy(array.
data(), vec.
data(), array.
size() *
sizeof(double));
580 assert(array.
extent(1) == 3);
581 for (
int i = 0; i < vec.
size(); i++)
583 array(i, 0) = vec(i)[0];
584 array(i, 1) = vec(i)[1];
585 array(i, 2) = vec(i)[2];
595 assert(array.
extent(1) == 2);
596 memcpy(vec.
data(), array.
data(), array.
size() *
sizeof(double));
602 assert(array.
extent(1) == 3);
603 memcpy(vec.
data(), array.
data(), array.
size() *
sizeof(double));
609 for (
int i = 0; i < array.
size(); i++)
610 result(i) = vec + array(i);
617 for (
int i = 0; i < array.
size(); i++)
618 result(i) = vec + array(i);
622 template<
typename T,
int N>
626 for (
int i = 0; i <
N; i++)
627 equals = equals && (a[i] == b[i]);
631 template<
typename T,
int N>
638 template<
typename T1,
typename T2>
642 for (
int ix = 0; ix < src.
extent(0); ix++)
643 for (
int iy = 0; iy < src.
extent(1); iy++)
644 for (
int iz = 0; iz < src.
extent(2); iz++)
645 dest(ix, iy, iz) = src(ix, iy, iz);
648 inline std::complex<float>
operator+(std::complex<float> z,
double r)
650 return std::complex<float>(z.real() +
static_cast<float>(r), z.imag());
656 return (
A(0, 0) * (
A(1, 1) *
A(2, 2) -
A(1, 2) *
A(2, 1)) -
A(0, 1) * (
A(1, 0) *
A(2, 2) -
A(1, 2) *
A(2, 0)) +
657 A(0, 2) * (
A(1, 0) *
A(2, 1) -
A(1, 1) *
A(2, 0)));
663 double dinv = 1.0 /
det(
A);
664 Ainv(0, 0) = dinv * (
A(1, 1) *
A(2, 2) -
A(1, 2) *
A(2, 1));
665 Ainv(1, 0) = -dinv * (
A(1, 0) *
A(2, 2) -
A(1, 2) *
A(2, 0));
666 Ainv(2, 0) = dinv * (
A(1, 0) *
A(2, 1) -
A(1, 1) *
A(2, 0));
667 Ainv(0, 1) = -dinv * (
A(0, 1) *
A(2, 2) -
A(0, 2) *
A(2, 1));
668 Ainv(1, 1) = dinv * (
A(0, 0) *
A(2, 2) -
A(0, 2) *
A(2, 0));
669 Ainv(2, 1) = -dinv * (
A(0, 0) *
A(2, 1) -
A(0, 1) *
A(2, 0));
670 Ainv(0, 2) = dinv * (
A(0, 1) *
A(1, 2) -
A(0, 2) *
A(1, 1));
671 Ainv(1, 2) = -dinv * (
A(0, 0) *
A(1, 2) -
A(0, 2) *
A(1, 0));
672 Ainv(2, 2) = dinv * (
A(0, 0) *
A(1, 1) -
A(0, 1) *
A(1, 0));
679 Atran(0, 0) =
A(0, 0);
680 Atran(0, 1) =
A(1, 0);
681 Atran(0, 2) =
A(2, 0);
682 Atran(1, 0) =
A(0, 1);
683 Atran(1, 1) =
A(1, 1);
684 Atran(1, 2) =
A(2, 1);
685 Atran(2, 0) =
A(0, 2);
686 Atran(2, 1) =
A(1, 2);
687 Atran(2, 2) =
A(2, 2);
694 #define NAN sqrt(-1.0) void resize(sizes_type sizes)
SymmArray< T > & operator=(const SymmArray< T > &B)
void resizeAndPreserve(sizes_type sizes)
Vec2 operator+(const Vec2 &v1, const Vec2 &v2)
T & operator()(std::size_t n)
void resizeAndPreserve(Ints... sizes)
void resize(int rs, int cs)
base_type::element_ptr data()
bool operator!=(const TinyVector< T, N > &a, const TinyVector< T, N > &b)
Array & operator=(const T t)
TinyMatrix & operator=(const T t)
Mat3 Transpose(const Mat3 &A)
Mat3 Inverse(const Mat3 &A)
bool operator==(const TinyVector< T, N > &a, const TinyVector< T, N > &b)
decltype(std::declval< base_type const & >().sizes()) sizes_type
cMat3 & operator-=(cMat3 &A, const cMat3 &B)
base_type::element_const_ptr data() const
void resize(const std::array< SIZET, D > &dims)
Resize the container.
std::ptrdiff_t extent(int d) const
friend Array operator-(Array const &a, Array const &b)
T const & operator()(std::size_t n) const
friend TinyVector & operator*=(TinyVector &v, Scalar s)
T & operator()(std::size_t i, std::size_t j)
void copy(const Array< T1, 3 > &src, Array< T2, 3 > &dest)
int index(int row, int col) const
void Vec2Array(Array< Vec2, 1 > &vec, Array< double, 1 > &array)
T operator()(int i, int j) const
T const & operator()(std::size_t i, std::size_t j) const
std::ptrdiff_t extent(int d) const
TinyVector< T, size > operator-(TinyVector< T, size > v)
Vec2 operator*(const Vec2 &v, scalar s)
constexpr class neverDeleteData_t neverDeleteData
friend std::ostream & operator<<(std::ostream &os, TinyMatrix const &self)
base_type::element_ptr data()
friend Array operator+(Array const &a, Array const &b)
friend Array operator*(T const &t, Array const &a)
decltype(std::declval< base_type const &>().sizes()) sizes_type
base_type::element_const_ptr data() const
Array & operator=(const T t)
Container_t::iterator begin()
void Array2Vec(Array< double, 1 > &array, Array< Vec2, 1 > &vec)
double B(double x, int k, int i, const std::vector< double > &t)
A D-dimensional Array class based on PETE.
double distSqrd(Vec2 a, Vec2 b)
cMat3 & operator+=(cMat3 &A, const cMat3 &B)
void resizeAndPreserve(sizes_type sizes)
T & operator()(int i, int j)
void resize(sizes_type sizes)
const std::array< size_t, D > & shape() const
double det(const Mat3 &A)
Container_t::iterator end()