Advanced: Тема повышенной сложности или важная.
Нужно сделать векторное произведение для векторов N-размерности.
Использую символы Леви-Чивита, но осилил только для 3D.
Как мне брать CrossProduct в N-мерном пространстве, в частности нужно N = 27D
P.S: Можно с помощью косиметричной матрицы
Как сделать пермутации по индексам , чтобы получить индексы Леви-Чивита в коде , по этой формуле?
template <typename T, std::size_t N> IVector<T, N> ICrossProduct(const std::initializer_list<IVector<T, N>>& values) { IVector<T, N> res; if( N == 3) { int i=0; IVector<T, N> V[N]; for ( auto it: values) V[i++] = it; for ( std::size_t i = 0; i < N; ++i) { for ( std::size_t j = 0; j < N; ++j) { for ( std::size_t k = 0; k < N; ++k) { int LiveChivitaSymbol = ( ( i-j)*( j-k)*( k-i)); res[i] += ( LiveChivitaSymbol / 2) * V[0][j] * V[1][k]; } } } } else if( N == 4) { // int i=0; // IVector<T, N> V[N]; // for (auto it: values) V[i++] = it; // for (std::size_t i = 0; i < N; ++i) // { // for (std::size_t j = 0; j < N; ++j) // { // for (std::size_t k = 0; k < N; ++k) // { // for (std::size_t c = 0; c < N; ++c) // { // int LiveChivitaSymbol = ((i-j)*(j-k)*(k-c)*(c-i)); // res[i] += (LiveChivitaSymbol / 2) * V[0][j] * V[1][k] * V[2][c]; // } // } // } // } } else if ........27D return res; }
дай угадаю: ты опять понятия не имеешь, зачем оно тебе сдалось?
Suslik
> дай угадаю: ты опять понятия не имеешь, зачем оно тебе сдалось?
Надо решить одну видуманою мной же мат-задачу , для этого надо обобщить векторное произведение !
Ну и в целом , это же очень интересно ! Это просто игра в математику !
werasaimon
это такая же "игра в математику", как разбивание витрин магазина клюшкой — хоккей.
векторное произведение двух векторов определено только для трёх- и семимерного пространства:
https://en.wikipedia.org/wiki/Cross_product
> But if the product is limited to non-trivial binary products with vector results, it exists only in three and seven dimensions
Suslik
Ну очевидно же, что речь о векторном произведении, как (N-1)-арной функции:
https://en.wikipedia.org/wiki/Cross_product#External_product .
FordPerfect
> Ну очевидно же, что речь о векторном произведении, как (N-1)-арной функции:
кому очевидно? в 43-х предыдущих темах про векторное произведение, созданных ОП'ом, ему во что бы то ни стало было нужно именно векторное произведение двух векторов.
Suslik
> очевидно?
Ну
> const std::initializer_list<IVector<T, N>>& values
намекает, что векторов не обязательно 2.
> в 43-х предыдущих темах про векторное произведение, созданных ОП'ом, ему во что бы то ни стало было нужно именно векторное произведение двух векторов.
Точно? Вроде когда как.
Вроде так:
template<int N,typename T> void cross_product(T inputs[][N],T output[]) { T m[N][N]; for( int i=0;i<N-1;++i) for( int j=0;j<N;++j) m[i][j]=inputs[i][j]; for( int i=0;i<N;++i) { for( int j=0;j<N;++j) m[N-1][j]=T( i==j); output[i]=determinant( m); } }
Suslik
Но я не знаю что тут сказать! Очевидно что векторное произведение для векторов N-1.
Для этого достаточно было глянуть на код!
FordPerfect
Inputs[][N] это что вектора в тезорном произведении?
werasaimon
> Inputs[][N] это
2-мерный массив - матрица (размера (N-1) x N), строки которой - входные векторы для функции векторного произведения.
FordPerfect
> werasaimon
> > Inputs[][N] это
> 2-мерный массив - матрица (размера (N-1) x N), строки которой - входные векторы
> для функции векторного произведения.
попробовал в 4D и 3D! ouput - не равно CrossProduct ...?
werasaimon
> и 3D
Вроде работает:
https://rextester.com/KZEX45006