VM2D  1.12
Vortex methods for 2D flows simulation
numvector.h
Go to the documentation of this file.
1 /*--------------------------------*- VMlib -*----------------*---------------*\
2 | ## ## ## ## ## ## ## | | Version 1.12 |
3 | ## ## ### ### ## ## | VMlib: VM2D/VM3D Library | 2024/01/14 |
4 | ## ## ## # ## ## ## #### | Open Source Code *----------------*
5 | #### ## ## ## ## ## ## | https://www.github.com/vortexmethods/VM2D |
6 | ## ## ## #### ### #### | https://www.github.com/vortexmethods/VM3D |
7 | |
8 | Copyright (C) 2017-2024 Ilia Marchevsky |
9 *-----------------------------------------------------------------------------*
10 | File name: numvector.h |
11 | Info: Source code of VMlib |
12 | |
13 | This file is part of VMlib. |
14 | VMLib is free software: you can redistribute it and/or modify it |
15 | under the terms of the GNU General Public License as published by |
16 | the Free Software Foundation, either version 3 of the License, or |
17 | (at your option) any later version. |
18 | |
19 | VMlib is distributed in the hope that it will be useful, but WITHOUT |
20 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
21 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
22 | for more details. |
23 | |
24 | You should have received a copy of the GNU General Public License |
25 | along with VMlib. If not, see <http://www.gnu.org/licenses/>. |
26 \*---------------------------------------------------------------------------*/
27 
28 
37 #ifndef NUMVECTOR_H_
38 #define NUMVECTOR_H_
39 
40 /*
41 #define STRINGIZE_HELPER(x) #x
42 #define STRINGIZE(x) STRINGIZE_HELPER(x)
43 #define WARNING(desc) message(__FILE__ "(" STRINGIZE(__LINE__) ") : warning: " #desc)
44 */
45 
46 /*
47 #if defined(__GNUC__) || defined(__clang__)
48 #define DEPRECATED __attribute__((deprecated))
49 #elif defined(_MSC_VER)
50 #define DEPRECATED __declspec(deprecated)
51 #else
52 #pragma message("WARNING: You need to implement DEPRECATED for this compiler")
53 #define DEPRECATED
54 #endif
55 */
56 
57 #if defined(__CUDACC__)
58  #define HD __host__ __device__
59 #else
60  #define HD
61 #endif
62 
63 #define DEPRECATED
64 
65 #include <array>
66 #include <cmath>
67 #include <cstring>
68 #include <initializer_list>
69 #include <ostream>
70 #include <set>
71 #include <vector>
72 
73 namespace VMlib
74 {
75 
76  class Point2D;
77  class Point;
78 
93  template<typename T, size_t n>
94  //class numvector : public std::array<T, n>
95  class numvector
96  {
97  protected:
98  T data[n];
99 
100  public:
101  HD T& operator[](size_t i)
102  {
103  return this->data[i];
104  }
105 
106  HD const T& operator[](size_t i) const
107  {
108  return this->data[i];
109  }
110 
111  HD size_t size() const
112  {
113  return n;
114  }
115 
122  template <typename P>
123  HD auto operator& (const numvector<P, n>& y) const -> typename std::remove_const<decltype(this->data[0] * y[0])>::type
124  {
125  typename std::remove_const<decltype(this->data[0] * y[0])>::type res = 0;
126  for (size_t j = 0; j < n; ++j)
127  res += this->data[j] * y[j];
128  return res;
129  }//operator&(...)
130 
131 
139  template <typename P>
140  HD auto operator^(const numvector<P, 3>& y) const -> numvector<typename std::remove_const<decltype(this->data[1] * y[2])>::type, 3>
141  {
142  numvector<typename std::remove_const<decltype(this->data[1] * y[2])>::type, 3> vec;
143  vec[0] = this->data[1] * y[2] - this->data[2] * y[1];
144  vec[1] = this->data[2] * y[0] - this->data[0] * y[2];
145  vec[2] = this->data[0] * y[1] - this->data[1] * y[0];
146  return vec;
147  }//operator^(...)
148 
149 
157  template <typename P>
158  HD auto operator^ (const numvector<P, 2>& y) const -> typename std::remove_const<decltype(this->data[0] * y[1])>::type
159  {
160  return (this->data[0] * y[1] - this->data[1] * y[0]);
161  }//operator^(...)
162 
163 
171  template <typename P>
173  {
174  for (size_t i = 0; i < n; ++i)
175  this->data[i] *= c;
176  return *this;
177  }//operator*=(...)
178 
179 
187  template <typename P>
189  {
190  for (size_t i = 0; i < n; ++i)
191  this->data[i] /= c;
192  return *this;
193  }//operator/=(...)
194 
195 
203  template <typename P>
205  {
206  for (size_t i = 0; i < n; ++i)
207  this->data[i] += y[i];
208  return *this;
209  }//operator+=(...)
210 
211 
219  template <typename P>
221  {
222  for (size_t i = 0; i < n; ++i)
223  this->data[i] -= y[i];
224  return *this;
225  }//operator-=(...)
226 
227 
234  template <typename P>
235  HD auto operator+(const numvector<P, n>& y) const -> numvector<typename std::remove_const<decltype(this->data[0] + y[0])>::type, n>
236  {
237  numvector<typename std::remove_const<decltype(this->data[0] + y[0])>::type, n> res;
238  for (size_t i = 0; i < n; ++i)
239  res[i] = this->data[i] + y[i];
240  return res;
241  }//operator+(...)
242 
243 
250  template <typename P>
251  HD auto operator-(const numvector<P, n>& y) const -> numvector<typename std::remove_const<decltype(this->data[0] - y[0])>::type, n>
252  {
253  numvector<typename std::remove_const<decltype(this->data[0] - y[0])>::type, n> res;
254  for (size_t i = 0; i < n; ++i)
255  res[i] = this->data[i] - y[i];
256  return res;
257  }//operator-(...)
258 
259 
266  template <typename P>
267  HD auto operator*(const P c) const -> numvector<typename std::remove_const<decltype(this->data[0] * c)>::type, n>
268  {
269  numvector<typename std::remove_const<decltype(this->data[0] * c)>::type, n> res;
270  for (size_t i = 0; i < n; ++i)
271  res[i] = c * this->data[i];
272  return res;
273  }//operator*(...)
274 
275 
282  {
283  numvector<T, n> res;
284  for (size_t i = 0; i < n; ++i)
285  res[i] = -this->data[i];
286  return res;
287  }//operator-()
288 
289 
295  HD const numvector<T, n>& operator+() const
296  {
297  return *this;
298  }//operator+()
299 
300 
307  template <typename P>
308  HD bool operator==(const numvector<P, n>& y) const
309  {
310  for (size_t i = 0; i < n; ++i)
311  if (this->data[i] != y[i])
312  return false;
313  return true;
314  }//operator==(...)
315 
316 
323  template <typename P>
324  HD bool operator!=(const numvector<P, n>& y) const
325  {
326  return !(*this == y);
327  }//operator!=(...)
328 
329 
330 
331 
337  HD auto norm1() const -> typename std::remove_const<typename std::remove_reference<decltype(this->data[0])>::type>::type
338  {
339  typename std::remove_const<typename std::remove_reference<decltype(this->data[0])>::type>::type res = 0;
340  for (size_t i = 0; i < n; ++i)
341  res += abs(this->data[i]);
342  return res;
343  }//norm1()
344 
345 
351  HD auto norminf() const -> typename std::remove_const<typename std::remove_reference<decltype(this->data[0])>::type>::type
352  {
353  typename std::remove_const<typename std::remove_reference<decltype(this->data[0])>::type>::type res = 0;
354  for (size_t i = 0; i < n; ++i)
355  {
356  if (abs(this->data[i]) > res)
357  res = abs(this->data[i]);
358  }
359  return res;
360  }//norminf()
361 
362 
370  template <typename P = double>
371  HD P length() const
372  {
373  P res = *this & *this;
374  return sqrt(res);
375  }//length()
376 
377 
383  HD auto length2() const -> typename std::remove_const<typename std::remove_reference<decltype(this->data[0])>::type>::type
384  {
385  return (*this & *this);
386  }//length2()
387 
388 
398  template <typename P = double>
399  HD auto unit(P newlen = 1) const -> numvector<typename std::remove_const<decltype(this->data[0] * newlen)>::type, n>
400  {
401  auto ilen = static_cast<decltype(this->data[0] * newlen)>(newlen / std::max(this->length(), 1e-16));
402  return (*this * ilen);
403  }//unit(...)
404 
405 
406 
415  template <typename P = double>
416  HD void normalize(P newlen = 1.0)
417  {
418  auto ilen = static_cast<decltype(this->data[0] * newlen)>(newlen / std::max(this->length(), 1e-16));
419  *this *= ilen;
420  }//normalize(...)
421 
422 
423 
429  template <typename P>
430  HD size_t member(const P& s) const
431  {
432  for (size_t i = 0; i < n; ++i)
433  if (this->data[i] == s)
434  return i;
435 
436  return static_cast<size_t>(-1);
437  }//member(...)
438 
439 
440 
445  template <typename P>
446  operator std::set<P>() const
447  {
448  std::set<P> newset;
449  for (size_t i = 0; i < n; ++i)
450  newset.insert(this->data[i]);
451  return newset;
452  }//toSet()
453 
454 
459  template <typename P>
460  operator std::vector<P>() const
461  {
462  std::vector<P> vec;
463  vec.reserve(n);
464  for (size_t i = 0; i < n; ++i)
465  vec.push_back(this->data[i]);
466  return vec;
467  }
468 
469 
478  HD numvector<T, n> rotateLeft(size_t k) const
479  {
480  if (k > n)
481  throw;
482 
483  if (k == n)
484  return *this;
485 
486  numvector<T, n> res;
487 
488  //for (size_t i = 0; i < n; ++i)
489  // res[i] = r[(i + k) % n];
490 
491  for (size_t i = 0; i < n - k; ++i)
492  res[i] = this->data[i + k];
493  for (size_t i = n - k; i < n; ++i)
494  res[i] = this->data[i + k - n];
495  return res;
496  }//rotateLeft(...)
497 
498 
499 
508  {
509  numvector<T, 2> res;
510  res[0] = -this->data[1];
511  res[1] = this->data[0];
512  return res;
513  }//kcross()
514 
515 
523  template <typename P = T>
525  {
526  for (size_t i = 0; i < n; ++i)
527  this->data[i] = val;
528  return *this;
529  }
530 
531 
537  template<typename P>
538  HD auto dist2To(const numvector<P, n>& y) const -> typename std::remove_const<decltype(this->data[0] - y[0])>::type
539  {
540  return (*this - y).length2();
541  }//dist2To(...)
542 
543 
550  template<typename R = double, typename P>
552  {
553  R res = (*this - y) & (*this - y);
554  return sqrt(res);
555  }//distTo(...)
556 
557 
559  HD numvector() { };
560 
561 
566  template <typename P>
567  explicit numvector(const P c)
568  {
569  for (size_t i = 0; i < n; ++i)
570  this->data[i] = c;
571  }//numvector(...)
572 
573 
574 
581  {
582  //for (size_t i = 0; i < n; ++i)
583  // r[i] = vec[i];
584  memcpy(this->data, vec.data, n * sizeof(T));
585  }//numvector(...)
586 
587 
593  template <typename P>
595  {
596  for (size_t i = 0; i < n; ++i)
597  this->data[i] = vec[i];
598  }//numvector(...)
599 
600 
608  template <typename P>
609  numvector(const std::vector<P>& vec)
610  {
611  if (vec.size() != n)
612  throw;
613  for (size_t i = 0; i < n; ++i)
614  this->data[i] = vec[i];
615  }//numvector(...)
616 
617 
618 #if !defined(__CUDACC__)
619  numvector(const std::initializer_list<T>& z)
626  {
627  if (z.size() != n)
628  throw;
629  for (size_t i = 0; i < n; ++i)
630  this->data[i] = *(z.begin() + i);
631  }//numvector(...)
632 
633 
634 
641  template <typename P>
642  numvector(const std::initializer_list<P>& z)
643  {
644  if (z.size() != n)
645  throw;
646  for (size_t i = 0; i < n; ++i)
647  this->data[i] = *(z.begin() + i);
648  }//numvector(...)
649 #endif
650 
651 
661  template <typename P, size_t p>
662  explicit numvector(const numvector<P, p>& vec, T add = 0)
663  {
664  size_t minPN = (p < n) ? p : n;
665  for (size_t i = 0; i < minPN; ++i)
666  this->data[i] = vec[i];
667  for (size_t i = minPN; i < n; ++i)
668  this->data[i] = add;
669  }//numvector(...)
670 
671 
672 // ////////////////////////////////////////////////////////////////////////////
673 // //// Далее deprecate-функции для ПОЛНОЙ СОВМЕСТИМОСТИ со старой версией ////
674 // //// -------------------- ////
675 // ////////////////////////////////////////////////////////////////////////////
676 //
677 // /// \brief Оператор присваивания всем компонентам вектора одного и того же числа
678 // DEPRECATED numvector<T, n>& operator=(double c)
679 // {
680 // toZero(c);
681 // return *this;
682 // }//operator(...)
683 
684 
685 // /// \brief Построение множества std::set на основе вектора
686 // ///
687 // /// \return множество типа std::set, состоящее из тех же элементов, что исходный вектор
688 // DEPRECATED std::set<T> toSet() const
689 // {
690 // //(deprecate: use implicit type conversion)
691 //
692 // std::set<T> newset;
693 // for (size_t i = 0; i < n; ++i)
694 // newset.insert(this->data[i]);
695 // return newset;
696 // }//toSet()
697 
698 
699 // /// \brief Построение вектора std::vector на основе вектора
700 // ///
701 // /// \return вектор типа std::vector, состоящий из тех же элементов, что исходный вектор
702 // DEPRECATED std::vector<T> toVector() const
703 // {
704 // //(deprecate: use implicit type conversion)
705 //
706 // std::vector<T> vec;
707 // vec.reserve(n);
708 // for (size_t i = 0; i < n; ++i)
709 // vec.push_back(this->data[i]);
710 // return vec;
711 // }
712 
713  }; //class numvector
714 
715 // /// \todo Исследовать целесообразность наличия нешаблонного умножения
716 // inline numvector<double, 3> operator*(double c, const numvector<double, 3>& x)
717 // {
718 // numvector<double, 3> res(x);
719 // for (size_t i = 0; i < 3; ++i)
720 // res[i] *= c;
721 // return res;
722 // }//operator*(...)
723 
731  template<typename T, size_t n>
733  {
734  numvector<T, n> res(x);
735  for (size_t i = 0; i < n; ++i)
736  res[i] *= c;
737  return res;
738  }//operator*(...)
739 
740 
749  template<typename T, typename P, size_t n>
751  {
753  for (size_t i = 0; i < n; ++i)
754  res[i] = x[i] * c;
755  return res;
756  }//operator*(...)
757 
758 
759 #if !defined(__CUDACC__)
760  template<typename T, typename P, typename R>
773  {
774  z = { x[1] * y[2] - x[2] * y[1], x[2] * y[0] - x[0] * y[2], x[0] * y[1] - x[1] * y[0] };
775  }//cross(...)
776 #endif
777 
778 
787  template<typename T, typename P, size_t n>
788  HD auto dist2(const numvector<T, n>& x, const numvector<P, n>& y) -> typename std::remove_const<decltype(x[0] - y[0])>::type
789  {
790  numvector<typename std::remove_const<decltype(x[0] - y[0])>::type, n> p = x - y;
791  return p.length2();
792  }//dist2(...)
793 
794 
803  template<typename R = double, typename T, typename P, size_t n>
804  HD R dist(const numvector<T, n>& x, const numvector<P, n>& y)
805  {
806  numvector<R, n> p = x - y;
807  return sqrt(p&p);
808  }//dist(...)
809 
810 
820  template<typename T, size_t n>
821  std::ostream& operator<< (std::ostream& str, const numvector<T, n>& x)
822  {
823  str << "{ ";
824  for (size_t j = 0; j < n - 1; ++j)
825  str << x[j] << ", ";
826  str << x[n - 1];
827  str << " }";
828  return str;
829  }//operator<<(...)
830 
831 
835 
836 
847  template<typename T, typename P, typename R, typename S, size_t n>
848  inline std::pair<numvector<T, n>, numvector<P, n>>& operator+=(std::pair<numvector<T, n>, numvector<P, n>>& a, const std::pair<numvector<R, n>, numvector<S, n>>& b)
849  {
850  a.first += b.first;
851  a.second += b.second;
852  return a;
853  }//operator+=(...)
854 
855 
866  template<typename T, typename P, typename R, typename S, size_t n>
867  inline auto operator+(const std::pair<numvector<T, n>, numvector<P, n>>& a, const std::pair<numvector<R, n>, numvector<S, n>>& b) -> \
868  std::pair<numvector<typename std::remove_const<decltype(a.first[0] + b.first[0])>::type, n>, numvector<typename std::remove_const<decltype(a.second[0] + b.second[0])>::type, n >>
869  {
870  std::pair<numvector<typename std::remove_const<decltype(a.first[0] + b.first[0])>::type, n>, numvector<typename std::remove_const<decltype(a.second[0] + b.second[0])>::type, n >> res;
871  res.first = a.first + b.first;
872  res.second = a.second + b.second;
873  return res;
874  }//operator+(...)
875 
876 
886  template<typename T, typename P, typename R, size_t n>
887  inline std::pair<numvector<T, n>, numvector<P, n>>& operator*=(std::pair<numvector<T, n>, numvector<P, n>>& a, R c)
888  {
889  a.first *= c;
890  a.second *= c;
891  return a;
892  }//operator*=(...)
893 
894 
904  template<typename T, typename P, typename R, size_t n>
905  inline auto operator*(R c, const std::pair<numvector<T, n>, numvector<P, n>>& a) -> \
906  std::pair<numvector<typename std::remove_const<decltype(c * a.first[0])>::type, n>, numvector<typename std::remove_const<decltype(c * a.second[0])>::type, n >>
907  {
908  std::pair<numvector<typename std::remove_const<decltype(c * a.first[0])>::type, n>, numvector<typename std::remove_const<decltype(c * a.second[0])>::type, n >> res;
909  res.first = c * a.first;
910  res.second = c * a.second;
911  return res;
912  }//operator*(...)
913 
914 
924  template<typename T, typename P, typename R, size_t n>
925  inline auto operator*(const std::pair<numvector<T, n>, numvector<P, n>>& a, R c) -> \
926  std::pair<numvector<typename std::remove_const<decltype(a.first[0] * c)>::type, n>, numvector<typename std::remove_const<decltype(a.second[0] * c)>::type, n >>
927  {
928  return c * a;
929  }//operator*(...)
930 
931 
942  template<typename T, typename P, size_t n>
943  std::ostream& operator<< (std::ostream& str, const std::pair<numvector<T, n>, numvector<P, n>>& x)
944  {
945  str << "{ " << x.first << ", " << x.second << " }";
946  return str;
947  }//operator<<
948 
949 
951  // Далее deprecate-функции для ПОЛНОЙ СОВМЕСТИМОСТИ со старой версией //
952  // -------------------- //
954 
955 // /// \brief Умножение квадратной матрицы на вектор (без приведения типов)
956 // ///
957 // /// \tparam T тип данных компонент матрицы и вектора
958 // /// \tparam n размерность матрицы и вектора
959 // /// \param[in] A константная ссылка на матрицу
960 // /// \param[in] x константная ссылка на вектор
961 // /// \return вектор результат умножения матрицы на вектор
962 // template<typename T, size_t n>
963 // DEPRECATED inline numvector<T, n> dot(const numvector<numvector<T, n>, n>& A, const numvector<T, n>& x)
964 // {
965 // //deprecate: use nummatrix.operator& instead of dot(numvector<numvector<>>, numvector<>)
966 //
967 // numvector<T, n> res;
968 // for (size_t i = 0; i < n; ++i)
969 // res[i] = A[i] & x;
970 // return res;
971 // }//dot(...)
972 
973 
974 // /// \brief Умножение вектора на квадратную матрицу (без приведения типов)
975 // ///
976 // /// \tparam T тип данных компонент матрицы и вектора
977 // /// \tparam n размерность матрицы и вектора
978 // /// \param[in] A константная ссылка на матрицу
979 // /// \param[in] x константная ссылка на вектор
980 // /// \return вектор результат умножения матрицы на вектор
981 // template<typename T, size_t n>
982 // DEPRECATED inline numvector<T, n> dot(const numvector<T, n>& x, const numvector<numvector<T, n>, n>& A)
983 // {
984 // //deprecate: use operator&(numvector<>, nummatrix<>) instead of dot(numvector<>, numvector<numvector<>>)
985 //
986 // numvector<T, n> res;
987 // for (size_t i = 0; i < n; ++i)
988 // {
989 // res[i] = 0.0;
990 // for (size_t j = 0; j < n; ++j)
991 // res[i] += x[j] * A[j][i];
992 // }
993 // return res;
994 // }//dot(...)
995 
996 
997 // /// \brief Умножение квадратной матрицы на вектор
998 // ///
999 // /// \tparam T тип данных вектора и матрицы
1000 // /// \tparam n длина вектора и размерность матрицы
1001 // /// \param[in] A константная ссылка на матрицу
1002 // /// \param[in] x константная ссылка на вектор
1003 // /// \return вектор --- результат умножения матрицы на вектор
1004 // template<typename T, size_t n>
1005 // DEPRECATED inline numvector<T, n> matDotVec(const numvector<numvector<T, n>, n>& A, const numvector<T, n>& x)
1006 // {
1007 // //deprecate: use nummatrix.operator& instead of matDotVec(numvector<numvector<>>, numvector<>)
1008 //
1009 // numvector<T, n> res;
1010 // for (size_t i = 0; i < n; ++i)
1011 // res[i] = A[i] * x;
1012 // return res;
1013 // }//dot(...)
1014 
1015 
1016 // /// \brief Умножение вектора на вектор той же размерности внешним образом
1017 // ///
1018 // /// \tparam T тип данных компонент векторов
1019 // /// \tparam n размерность векторов
1020 // /// \param[in] x константная ссылка на первый вектор
1021 // /// \param[in] y константная ссылка на второй вектор
1022 // /// \return матрицу ранга 1, являющюуся внешним (кронекеровым) произведением двух векторов
1023 // template<typename T, size_t n>
1024 // DEPRECATED inline numvector<numvector<T, n>, n> KronProd(const numvector<T, n>& x, const numvector<T, n>& y)
1025 // {
1026 // //deprecate: use nummatrix.operator|(numvector<>, numvector<>) instead of KronProd(numvector<>, numvector<>)
1027 // numvector<numvector<T, n>, n> res;
1028 // for (size_t i = 0; i < n; ++i)
1029 // for (size_t j = 0; j < n; ++j)
1030 // res[i][j] = x[i] * y[j];
1031 // return res;
1032 // }//KronProd(...)
1033 
1034 
1035 // /// \brief Транспонирование квадратной матрицы
1036 // ///
1037 // /// \tparam T тип данных компонент матрицы
1038 // /// \tparam n размерность матрицы
1039 // /// \return транспонированную матрицу
1040 // template<typename T, size_t n>
1041 // DEPRECATED inline numvector<numvector<T, n>, n> Transpose(const numvector<numvector<T, n>, n>& A)
1042 // {
1043 // //deprecate: use member class nummatrix.transpose() instead of Transpose(numvector<numvector>)
1044 //
1045 // numvector<numvector<T, n>, n> res;
1046 // for (size_t i = 0; i < n; ++i)
1047 // for (size_t j = 0; j < n; ++j)
1048 // res[i][j] = A[j][i];
1049 // return res;
1050 // }
1051 
1052 
1063  template<typename T, typename P, size_t n>
1065  {
1066  //deprecate: use numvector.operator^ instead of cross3(numvector<>,numvector<>)
1067 
1068  return (x[0] * y[1] - x[1] * y[0]);
1069  }//cross3(...)
1070 
1071 
1072 // /// \brief Скалярное умножение двух векторов
1073 // ///
1074 // /// \param[in] x константная ссылка на первый множитель
1075 // /// \param[in] y константная ссылка на второй множитель
1076 // /// \return результат скалярного умножения
1077 // DEPRECATED inline double operator*(const Point2D& x, const Point2D& y)
1078 // {
1079 // //deprecate: use numvector.operator& instead of operator*
1080 //
1081 // const numvector<double, 2> xx = *(reinterpret_cast<const numvector<double, 2>*>(&x));
1082 // const numvector<double, 2> yy = *(reinterpret_cast<const numvector<double, 2>*>(&y));
1083 // return (xx & yy);
1084 // }//operator*(...)
1085 
1086 
1087 // /// \brief Скалярное умножение двух векторов
1088 // ///
1089 // /// \param[in] x константная ссылка на первый множитель
1090 // /// \param[in] y константная ссылка на второй множитель
1091 // /// \return результат скалярного умножения
1092 // DEPRECATED inline double operator*(const numvector<double, 2>& x, const Point2D& y)
1093 // {
1094 // //deprecate: use numvector.operator& instead of operator*
1095 //
1096 // const numvector<double, 2> yy = *(reinterpret_cast<const numvector<double, 2>*>(&y));
1097 // return (x & yy);
1098 // }//operator*(...)
1099 
1100 
1101 // /// \brief Скалярное умножение двух векторов
1102 // ///
1103 // /// \param[in] x константная ссылка на первый множитель
1104 // /// \param[in] y константная ссылка на второй множитель
1105 // /// \return результат скалярного умножения
1106 // DEPRECATED inline double operator*(const Point2D& x, const numvector<double, 2>& y)
1107 // {
1108 // //deprecate: use numvector.operator& instead of operator*
1109 //
1110 // const numvector<double, 2> xx = *(reinterpret_cast<const numvector<double, 2>*>(&x));
1111 // return (xx & y);
1112 // }//operator*(...)
1113 
1114 
1115 // /// \brief Скалярное умножение двух векторов
1116 // ///
1117 // /// \param[in] x константная ссылка на первый множитель
1118 // /// \param[in] y константная ссылка на второй множитель
1119 // /// \return результат скалярного умножения
1120 // DEPRECATED inline double operator*(const Point& x, const Point& y)
1121 // {
1122 // //deprecate: use numvector.operator& instead of operator*
1123 //
1124 // const numvector<double, 2> xx = *(reinterpret_cast<const numvector<double, 2>*>(&x));
1125 // const numvector<double, 2> yy = *(reinterpret_cast<const numvector<double, 2>*>(&y));
1126 // return (xx & yy);
1127 // }//operator*(...)
1128 
1129 
1130 // /// \brief Скалярное умножение двух векторов
1131 // ///
1132 // /// \param[in] x константная ссылка на первый множитель
1133 // /// \param[in] y константная ссылка на второй множитель
1134 // /// \return результат скалярного умножения
1135 // DEPRECATED inline double operator*(const numvector<double, 2>& x, const Point& y)
1136 // {
1137 // //deprecate: use numvector.operator& instead of operator*
1138 //
1139 // const numvector<double, 2> yy = *(reinterpret_cast<const numvector<double, 2>*>(&y));
1140 // return (x & yy);
1141 // }//operator*(...)
1142 
1143 
1144 // /// \brief Скалярное умножение двух векторов
1145 // ///
1146 // /// \param[in] x константная ссылка на первый множитель
1147 // /// \param[in] y константная ссылка на второй множитель
1148 // /// \return результат скалярного умножения
1149 // DEPRECATED inline double operator*(const Point& x, const numvector<double, 2>& y)
1150 // {
1151 // //deprecate: use numvector.operator& instead of operator*
1152 //
1153 // const numvector<double, 2> xx = *(reinterpret_cast<const numvector<double, 2>*>(&x));
1154 // return (xx & y);
1155 // }//operator*(...)
1156 
1157 
1158 
1159 
1160 // /// \brief Скалярное умножение двух векторов
1161 // ///
1162 // /// \param[in] x константная ссылка на первый множитель
1163 // /// \param[in] y константная ссылка на второй множитель
1164 // /// \return результат скалярного умножения
1165 // DEPRECATED inline double operator*(const numvector<double, 2>& x, const numvector<double, 2>& y)
1166 // {
1167 // //deprecate: use numvector.operator& instead of operator*
1168 //
1169 // return (x & y);
1170 // }//operator*(...)
1171 
1172 
1173 // /// \brief Скалярное умножение двух векторов
1174 // ///
1175 // /// \param[in] x константная ссылка на первый множитель
1176 // /// \param[in] y константная ссылка на второй множитель
1177 // /// \return результат скалярного умножения
1178 // DEPRECATED inline double operator*(const numvector<double, 3>& x, const numvector<double, 3>& y)
1179 // {
1180 // //deprecate: use numvector.operator& instead of operator*
1181 //
1182 // return (x & y);
1183 // }//operator*(...)
1184 
1185 }//namespace VMlib
1186 
1187 using VMlib::numvector;
1188 using VMlib::dist2;
1189 
1190 #endif
const T & operator[](size_t i) const
Definition: numvector.h:106
Шаблонный класс, определяющий вектор фиксированной длины Фактически представляет собой массив...
Definition: numvector.h:95
bool operator!=(const numvector< P, n > &y) const
Перегрузка оператора "!=" логического неравенства
Definition: numvector.h:324
auto operator*(const P c) const -> numvector< typename std::remove_const< decltype(this->data[0]*c)>::type, n >
Оператор "*" умножения вектора на число (вектор слева, число справа)
Definition: numvector.h:267
auto operator^(const numvector< P, 3 > &y) const -> numvector< typename std::remove_const< decltype(this->data[1]*y[2])>::type, 3 >
Оператор "^" векторного произведения
Definition: numvector.h:140
#define DEPRECATED
Definition: numvector.h:63
auto norm1() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление 1-нормы вектора
Definition: numvector.h:337
bool operator==(const numvector< P, n > &y) const
Оператор "==" логического равенства
Definition: numvector.h:308
auto norminf() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление inf-нормы вектора
Definition: numvector.h:351
STL namespace.
auto operator+(const numvector< P, n > &y) const -> numvector< typename std::remove_const< decltype(this->data[0]+y[0])>::type, n >
Оператор "+" сложения двух векторов
Definition: numvector.h:235
P length() const
Вычисление 2-нормы (длины) вектора
Definition: numvector.h:371
numvector< T, n > rotateLeft(size_t k) const
"Вращение" вектора на несколько позиций влево
Definition: numvector.h:478
numvector< T, n > & operator+=(const numvector< P, n > &y)
Оператор "+=" прибавления другого вектора
Definition: numvector.h:204
numvector(const numvector< P, p > &vec, T add=0)
Явный конструктор инициализации вектором другой размерности
Definition: numvector.h:662
auto operator-(const numvector< P, n > &y) const -> numvector< typename std::remove_const< decltype(this->data[0]-y[0])>::type, n >
Оператор "-" вычитания двух векторов
Definition: numvector.h:251
auto operator&(const numvector< P, n > &y) const -> typename std::remove_const< decltype(this->data[0]*y[0])>::type
Оператор "&" скалярного умножения
Definition: numvector.h:123
auto length2() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление квадрата нормы (длины) вектора
Definition: numvector.h:383
numvector(const std::vector< P > &vec)
Конструктор инициализации с помощью std::vector.
Definition: numvector.h:609
auto dist2To(const numvector< P, n > &y) const -> typename std::remove_const< decltype(this->data[0]-y[0])>::type
Вычисление квадрата расстояния до другой точки
Definition: numvector.h:538
numvector(const P c)
Конструктор, инициализирующий весь вектор одной и той же константой
Definition: numvector.h:567
numvector(const numvector< P, n > &vec)
Шаблонный конструктор копирования
Definition: numvector.h:594
T & operator[](size_t i)
Definition: numvector.h:101
void normalize(P newlen=1.0)
Нормирование вектора на заданную длину
Definition: numvector.h:416
numvector()
Пустой конструктор
Definition: numvector.h:559
const numvector< T, n > & operator+() const
Оператор "+" унарного плюса
Definition: numvector.h:295
numvector(const numvector< T, n > &vec)
Нешаблонный конструктор копирования
Definition: numvector.h:580
double cross3(const numvector< T, n > &x, const numvector< P, n > &y)
Вычисление третьей компоненты векторного произведения
Definition: numvector.h:1064
auto dist2(const numvector< T, n > &x, const numvector< P, n > &y) -> typename std::remove_const< decltype(x[0]-y[0])>::type
Вычисление квадрата расстояния между двумя точками
Definition: numvector.h:788
numvector(const std::initializer_list< P > &z)
Шаблонный конструктор инициализации списком
Definition: numvector.h:642
numvector< T, n > & operator-=(const numvector< P, n > &y)
Оператор "-=" вычитания другого вектора
Definition: numvector.h:220
auto unit(P newlen=1) const -> numvector< typename std::remove_const< decltype(this->data[0]*newlen)>::type, n >
Вычисление орта вектора или вектора заданной длины, коллинеарного данному
Definition: numvector.h:399
void cross(const numvector< T, 3 > &x, const numvector< P, 3 > &y, numvector< R, 3 > &z)
Быстрое вычисление векторного произведения
Definition: numvector.h:772
numvector< T, n > operator-() const
Оператор "-" унарного минуса
Definition: numvector.h:281
size_t size() const
Definition: numvector.h:111
R dist(const numvector< T, n > &x, const numvector< P, n > &y)
Вычисление расстояния между двумя точками
Definition: numvector.h:804
#define HD
Definition: numvector.h:60
numvector< T, n > & operator/=(P c)
Оператор "/=" деления вектора на действительное число
Definition: numvector.h:188
R distTo(const numvector< P, n > &y)
Вычисление расстояния между двумя точками
Definition: numvector.h:551
numvector< T, n > & toZero(P val=0)
Установка всех компонент вектора в константу (по умолчанию — нуль)
Definition: numvector.h:524
size_t member(const P &s) const
Проверка вхождения элемента в вектор
Definition: numvector.h:430
numvector< T, n > & operator*=(P c)
Оператор "*=" домножения вектора на действительное число
Definition: numvector.h:172
numvector< T, 2 > kcross() const
Геометрический поворот двумерного вектора на 90 градусов
Definition: numvector.h:507