1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_DETERMINANT_H 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_DETERMINANT_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const typename Derived::Scalar bruteforce_det3_helper 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath(const MatrixBase<Derived>& matrix, int a, int b, int c) 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return matrix.coeff(0,a) 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * (matrix.coeff(1,b) * matrix.coeff(2,c) - matrix.coeff(1,c) * matrix.coeff(2,b)); 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst typename Derived::Scalar bruteforce_det4_helper 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath(const MatrixBase<Derived>& matrix, int j, int k, int m, int n) 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return (matrix.coeff(j,0) * matrix.coeff(k,1) - matrix.coeff(k,0) * matrix.coeff(j,1)) 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * (matrix.coeff(m,2) * matrix.coeff(n,3) - matrix.coeff(n,2) * matrix.coeff(m,3)); 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived, 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int DeterminantType = Derived::RowsAtCompileTime 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath> struct determinant_impl 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static inline typename traits<Derived>::Scalar run(const Derived& m) 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(Derived::ColsAtCompileTime==Dynamic && m.rows()==0) 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return typename traits<Derived>::Scalar(1); 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m.partialPivLu().determinant(); 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> struct determinant_impl<Derived, 1> 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static inline typename traits<Derived>::Scalar run(const Derived& m) 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m.coeff(0,0); 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> struct determinant_impl<Derived, 2> 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static inline typename traits<Derived>::Scalar run(const Derived& m) 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m.coeff(0,0) * m.coeff(1,1) - m.coeff(1,0) * m.coeff(0,1); 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> struct determinant_impl<Derived, 3> 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static inline typename traits<Derived>::Scalar run(const Derived& m) 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return bruteforce_det3_helper(m,0,1,2) 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath - bruteforce_det3_helper(m,1,0,2) 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath + bruteforce_det3_helper(m,2,0,1); 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> struct determinant_impl<Derived, 4> 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static typename traits<Derived>::Scalar run(const Derived& m) 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // trick by Martin Costabel to compute 4x4 det with only 30 muls 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return bruteforce_det4_helper(m,0,1,2,3) 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath - bruteforce_det4_helper(m,0,2,1,3) 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath + bruteforce_det4_helper(m,0,3,1,2) 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath + bruteforce_det4_helper(m,1,2,0,3) 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath - bruteforce_det4_helper(m,1,3,0,2) 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath + bruteforce_det4_helper(m,2,3,0,1); 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \lu_module 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \returns the determinant of this matrix 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename internal::traits<Derived>::Scalar MatrixBase<Derived>::determinant() const 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez eigen_assert(rows() == cols()); 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::nested<Derived,Base::RowsAtCompileTime>::type Nested; 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return internal::determinant_impl<typename internal::remove_all<Nested>::type>::run(derived()); 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_DETERMINANT_H 102