57 #if defined(__CUDACC__) 58 #define HD __host__ __device__ 68 #include <initializer_list> 93 template<
typename T,
size_t n>
103 return this->data[i];
108 return this->data[i];
122 template <
typename P>
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];
139 template <
typename P>
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];
157 template <
typename P>
160 return (this->data[0] * y[1] - this->data[1] * y[0]);
171 template <
typename P>
174 for (
size_t i = 0; i < n; ++i)
187 template <
typename P>
190 for (
size_t i = 0; i < n; ++i)
203 template <
typename P>
206 for (
size_t i = 0; i < n; ++i)
207 this->data[i] += y[i];
219 template <
typename P>
222 for (
size_t i = 0; i < n; ++i)
223 this->data[i] -= y[i];
234 template <
typename P>
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];
250 template <
typename P>
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];
266 template <
typename P>
267 HD auto operator*(
const P c)
const ->
numvector<
typename std::remove_const<decltype(this->data[0] * c)>::type, n>
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];
284 for (
size_t i = 0; i < n; ++i)
285 res[i] = -this->data[i];
307 template <
typename P>
310 for (
size_t i = 0; i < n; ++i)
311 if (this->data[i] != y[i])
323 template <
typename P>
326 return !(*
this == y);
337 HD auto norm1() const -> typename
std::remove_const<typename
std::remove_reference<decltype(this->data[0])>::type>::type
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]);
351 HD auto norminf() const -> typename
std::remove_const<typename
std::remove_reference<decltype(this->data[0])>::type>::type
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)
356 if (abs(this->data[i]) > res)
357 res = abs(this->data[i]);
370 template <
typename P =
double>
373 P res = *
this & *
this;
383 HD auto length2() const -> typename
std::remove_const<typename
std::remove_reference<decltype(this->data[0])>::type>::type
385 return (*
this & *
this);
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>
401 auto ilen =
static_cast<decltype(this-
>data[0] * newlen)>(newlen / std::max(this->
length(), 1e-16));
402 return (*
this * ilen);
415 template <
typename P =
double>
418 auto ilen =
static_cast<decltype(this-
>data[0] * newlen)>(newlen / std::max(this->
length(), 1e-16));
429 template <
typename P>
432 for (
size_t i = 0; i < n; ++i)
433 if (this->data[i] == s)
436 return static_cast<size_t>(-1);
445 template <
typename P>
446 operator std::set<P>()
const 449 for (
size_t i = 0; i < n; ++i)
450 newset.insert(this->data[i]);
459 template <
typename P>
460 operator std::vector<P>()
const 464 for (
size_t i = 0; i < n; ++i)
465 vec.push_back(this->data[i]);
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];
510 res[0] = -this->data[1];
511 res[1] = this->data[0];
523 template <
typename P = T>
526 for (
size_t i = 0; i < n; ++i)
540 return (*
this - y).length2();
550 template<
typename R =
double,
typename P>
553 R res = (*
this - y) & (*
this - y);
566 template <
typename P>
569 for (
size_t i = 0; i < n; ++i)
584 memcpy(this->data, vec.
data, n *
sizeof(T));
593 template <
typename P>
596 for (
size_t i = 0; i < n; ++i)
597 this->data[i] = vec[i];
608 template <
typename P>
613 for (
size_t i = 0; i < n; ++i)
614 this->data[i] = vec[i];
618 #if !defined(__CUDACC__) 619 numvector(
const std::initializer_list<T>& z)
629 for (
size_t i = 0; i < n; ++i)
630 this->data[i] = *(z.begin() + i);
641 template <
typename P>
646 for (
size_t i = 0; i < n; ++i)
647 this->data[i] = *(z.begin() + i);
661 template <
typename P,
size_t p>
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)
731 template<
typename T,
size_t n>
735 for (
size_t i = 0; i < n; ++i)
749 template<
typename T,
typename P,
size_t n>
753 for (
size_t i = 0; i < n; ++i)
759 #if !defined(__CUDACC__) 760 template<
typename T,
typename P,
typename R>
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] };
787 template<
typename T,
typename P,
size_t n>
790 numvector<
typename std::remove_const<decltype(x[0] - y[0])>::type, n> p = x - y;
803 template<
typename R =
double,
typename T,
typename P,
size_t n>
820 template<
typename T,
size_t n>
821 std::ostream& operator<< (std::ostream& str, const numvector<T, n>& x)
824 for (
size_t j = 0; j < n - 1; ++j)
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)
851 a.second += b.second;
866 template<
typename T,
typename P,
typename R,
typename S,
size_t n>
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 >>
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;
886 template<
typename T,
typename P,
typename R,
size_t n>
904 template<
typename T,
typename P,
typename R,
size_t n>
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 >>
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;
924 template<
typename T,
typename P,
typename R,
size_t n>
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 >>
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)
945 str <<
"{ " << x.first <<
", " << x.second <<
" }";
1063 template<
typename T,
typename P,
size_t n>
1068 return (x[0] * y[1] - x[1] * y[0]);
const T & operator[](size_t i) const
Шаблонный класс, определяющий вектор фиксированной длины Фактически представляет собой массив...
bool operator!=(const numvector< P, n > &y) const
Перегрузка оператора "!=" логического неравенства
auto operator*(const P c) const -> numvector< typename std::remove_const< decltype(this->data[0]*c)>::type, n >
Оператор "*" умножения вектора на число (вектор слева, число справа)
auto operator^(const numvector< P, 3 > &y) const -> numvector< typename std::remove_const< decltype(this->data[1]*y[2])>::type, 3 >
Оператор "^" векторного произведения
auto norm1() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление 1-нормы вектора
bool operator==(const numvector< P, n > &y) const
Оператор "==" логического равенства
auto norminf() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление inf-нормы вектора
auto operator+(const numvector< P, n > &y) const -> numvector< typename std::remove_const< decltype(this->data[0]+y[0])>::type, n >
Оператор "+" сложения двух векторов
P length() const
Вычисление 2-нормы (длины) вектора
numvector< T, n > rotateLeft(size_t k) const
"Вращение" вектора на несколько позиций влево
numvector< T, n > & operator+=(const numvector< P, n > &y)
Оператор "+=" прибавления другого вектора
numvector(const numvector< P, p > &vec, T add=0)
Явный конструктор инициализации вектором другой размерности
auto operator-(const numvector< P, n > &y) const -> numvector< typename std::remove_const< decltype(this->data[0]-y[0])>::type, n >
Оператор "-" вычитания двух векторов
auto operator&(const numvector< P, n > &y) const -> typename std::remove_const< decltype(this->data[0]*y[0])>::type
Оператор "&" скалярного умножения
auto length2() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление квадрата нормы (длины) вектора
numvector(const std::vector< P > &vec)
Конструктор инициализации с помощью std::vector.
auto dist2To(const numvector< P, n > &y) const -> typename std::remove_const< decltype(this->data[0]-y[0])>::type
Вычисление квадрата расстояния до другой точки
numvector(const P c)
Конструктор, инициализирующий весь вектор одной и той же константой
numvector(const numvector< P, n > &vec)
Шаблонный конструктор копирования
void normalize(P newlen=1.0)
Нормирование вектора на заданную длину
numvector()
Пустой конструктор
const numvector< T, n > & operator+() const
Оператор "+" унарного плюса
numvector(const numvector< T, n > &vec)
Нешаблонный конструктор копирования
double cross3(const numvector< T, n > &x, const numvector< P, n > &y)
Вычисление третьей компоненты векторного произведения
auto dist2(const numvector< T, n > &x, const numvector< P, n > &y) -> typename std::remove_const< decltype(x[0]-y[0])>::type
Вычисление квадрата расстояния между двумя точками
numvector(const std::initializer_list< P > &z)
Шаблонный конструктор инициализации списком
numvector< T, n > & operator-=(const numvector< P, n > &y)
Оператор "-=" вычитания другого вектора
auto unit(P newlen=1) const -> numvector< typename std::remove_const< decltype(this->data[0]*newlen)>::type, n >
Вычисление орта вектора или вектора заданной длины, коллинеарного данному
void cross(const numvector< T, 3 > &x, const numvector< P, 3 > &y, numvector< R, 3 > &z)
Быстрое вычисление векторного произведения
numvector< T, n > operator-() const
Оператор "-" унарного минуса
R dist(const numvector< T, n > &x, const numvector< P, n > &y)
Вычисление расстояния между двумя точками
numvector< T, n > & operator/=(P c)
Оператор "/=" деления вектора на действительное число
R distTo(const numvector< P, n > &y)
Вычисление расстояния между двумя точками
numvector< T, n > & toZero(P val=0)
Установка всех компонент вектора в константу (по умолчанию — нуль)
size_t member(const P &s) const
Проверка вхождения элемента в вектор
numvector< T, n > & operator*=(P c)
Оператор "*=" домножения вектора на действительное число
numvector< T, 2 > kcross() const
Геометрический поворот двумерного вектора на 90 градусов