/* * tensorInterface.h * @brief Interfacing tensors template library and gtsam * Created on: Feb 12, 2010 * @author: Frank Dellaert */ #pragma once #include #include namespace gtsam { /** Reshape rank 2 tensor into Matrix */ template Matrix reshape(const tensors::Tensor2Expression& T, int m, int n) { if (m * n != I::dim * J::dim) throw std::invalid_argument( "reshape: incompatible dimensions"); Matrix M(m, n); size_t t = 0; for (int j = 0; j < J::dim; j++) for (int i = 0; i < I::dim; i++) M.data()[t++] = T(i, j); return M; } /** Reshape 3*3 rank 2 tensor into Vector : TODO 9 ???*/ template Vector toVector(const tensors::Tensor2Expression& T) { Vector v(I::dim * J::dim); size_t t = 0; for (int j = 0; j < J::dim; j++) for (int i = 0; i < I::dim; i++) v(t++) = T(i, j); return v; } /** Reshape Vector into rank 2 tensor */ template tensors::Tensor2 reshape2(const Vector& v) { if (v.size() != N1 * N2) throw std::invalid_argument( "reshape2: incompatible dimensions"); double data[N1][N2]; int t = 0; for (int j = 0; j < N2; j++) for (int i = 0; i < N1; i++) data[j][i] = v(t++); return tensors::Tensor2(data); } /** Reshape rank 3 tensor into Matrix */ template Matrix reshape(const tensors::Tensor3Expression& T, int m, int n) { if (m * n != I::dim * J::dim * K::dim) throw std::invalid_argument( "reshape: incompatible dimensions"); Matrix M(m, n); int t = 0; for (int k = 0; k < K::dim; k++) for (int j = 0; j < J::dim; j++) for (int i = 0; i < I::dim; i++) M.data()[t++] = T(i, j, k); return M; } /** Reshape Vector into rank 3 tensor */ template tensors::Tensor3 reshape3(const Vector& v) { if (v.size() != N1 * N2 * N3) throw std::invalid_argument( "reshape3: incompatible dimensions"); double data[N1][N2][N3]; int t = 0; for (int k = 0; k < N3; k++) for (int j = 0; j < N2; j++) for (int i = 0; i < N1; i++) data[k][j][i] = v(t++); return tensors::Tensor3(data); } /** Reshape rank 5 tensor into Matrix */ template Matrix reshape(const tensors::Tensor5Expression& T, int m, int n) { if (m * n != I::dim * J::dim * K::dim * L::dim * M::dim) throw std::invalid_argument( "reshape: incompatible dimensions"); Matrix R(m, n); int t = 0; for (int m = 0; m < M::dim; m++) for (int l = 0; l < L::dim; l++) for (int k = 0; k < K::dim; k++) for (int j = 0; j < J::dim; j++) for (int i = 0; i < I::dim; i++) R.data()[t++] = T(i, j, k, l, m); return R; } /** * Find Vector v that minimizes algebraic error A*v * Returns rank of A, minimum error, and corresponding eigenvector */ boost::tuple DLT(const Matrix& A); } // namespace gtsam