Merge pull request #1192 from fortify-iq/ln-determinant
Add ln_determinant to Cholesky
This commit is contained in:
commit
9e5854034c
|
@ -1,7 +1,7 @@
|
||||||
#[cfg(feature = "serde-serialize-no-std")]
|
#[cfg(feature = "serde-serialize-no-std")]
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use num::One;
|
use num::{One, Zero};
|
||||||
use simba::scalar::ComplexField;
|
use simba::scalar::ComplexField;
|
||||||
use simba::simd::SimdComplexField;
|
use simba::simd::SimdComplexField;
|
||||||
|
|
||||||
|
@ -161,6 +161,27 @@ where
|
||||||
}
|
}
|
||||||
prod_diag.simd_modulus_squared()
|
prod_diag.simd_modulus_squared()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Computes the natural logarithm of determinant of the decomposed matrix.
|
||||||
|
///
|
||||||
|
/// This method is more robust than `.determinant()` to very small or very
|
||||||
|
/// large determinants since it returns the natural logarithm of the
|
||||||
|
/// determinant rather than the determinant itself.
|
||||||
|
#[must_use]
|
||||||
|
pub fn ln_determinant(&self) -> T::SimdRealField {
|
||||||
|
let dim = self.chol.nrows();
|
||||||
|
let mut sum_diag = T::SimdRealField::zero();
|
||||||
|
for i in 0..dim {
|
||||||
|
sum_diag += unsafe {
|
||||||
|
self.chol
|
||||||
|
.get_unchecked((i, i))
|
||||||
|
.clone()
|
||||||
|
.simd_modulus_squared()
|
||||||
|
.simd_ln()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
sum_diag
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: ComplexField, D: Dim> Cholesky<T, D>
|
impl<T: ComplexField, D: Dim> Cholesky<T, D>
|
||||||
|
|
Loading…
Reference in New Issue