void verify_is_approx_upto_permutation(const VectorType& vec1, const VectorType& vec2) { typedef typename NumTraits<typename VectorType::Scalar>::Real RealScalar; VERIFY(vec1.cols() == 1); VERIFY(vec2.cols() == 1); VERIFY(vec1.rows() == vec2.rows()); for (int k = 1; k <= vec1.rows(); ++k) { VERIFY_IS_APPROX(vec1.array().pow(RealScalar(k)).sum(), vec2.array().pow(RealScalar(k)).sum()); } }
void verify_is_approx_upto_permutation(const VectorType& vec1, const VectorType& vec2) { typedef typename VectorType::Scalar Scalar; typedef typename NumTraits<Scalar>::Real RealScalar; VERIFY(vec1.cols() == 1); VERIFY(vec2.cols() == 1); VERIFY(vec1.rows() == vec2.rows()); Index n = vec1.rows(); RealScalar tol = test_precision<RealScalar>()*test_precision<RealScalar>()*numext::maxi(vec1.squaredNorm(),vec2.squaredNorm()); Matrix<RealScalar,Dynamic,Dynamic> diffs = (vec1.rowwise().replicate(n) - vec2.rowwise().replicate(n).transpose()).cwiseAbs2(); VERIFY( find_pivot(tol, diffs) ); }
void testTriangularProduct(const MatrixType& m, const VectorType& v, double tol) { typedef typename MatrixType::RealScalar RealScalar; MatrixType m1; VectorType v1, v2, v3; RealScalar p; for (int i=0; i < g_repeat; ++i) { generateTriangularMatrix<MatrixType>::run(m1, m.rows()); MatrixPowerTriangular<MatrixType> mpow(m1); v1 = VectorType::Random(v.rows(), v.cols()); p = internal::random<RealScalar>(); v2.noalias() = mpow(p) * v1; v3.noalias() = mpow(p).eval() * v1; std::cout << "testTriangularProduct: error powerm = " << relerr(v2, v3) << '\n'; VERIFY(v2.isApprox(v3, static_cast<RealScalar>(tol))); } }