1
0
mirror of https://github.com/aportelli/LatAnalyze.git synced 2025-04-11 03:20:46 +01:00

corr to var and SVD dynamic range

This commit is contained in:
Antonin Portelli 2022-02-16 18:54:16 +00:00
parent 0de8091f3c
commit 857a8e59c9
2 changed files with 29 additions and 1 deletions

View File

@ -29,7 +29,8 @@ using namespace Latan;
******************************************************************************/ ******************************************************************************/
DMat MATH_NAMESPACE::varToCorr(const DMat &var) DMat MATH_NAMESPACE::varToCorr(const DMat &var)
{ {
DMat res = var, invDiag = res.diagonal(); DMat res = var;
DVec invDiag = res.diagonal();
invDiag = invDiag.cwiseInverse().cwiseSqrt(); invDiag = invDiag.cwiseInverse().cwiseSqrt();
res = (invDiag*invDiag.transpose()).cwiseProduct(res); res = (invDiag*invDiag.transpose()).cwiseProduct(res);
@ -37,6 +38,28 @@ DMat MATH_NAMESPACE::varToCorr(const DMat &var)
return res; return res;
} }
DMat MATH_NAMESPACE::corrToVar(const DMat &corr, const DVec &varDiag)
{
DMat res = corr;
DVec varSqrtDiag = varDiag.cwiseSqrt();
res = (varSqrtDiag*varSqrtDiag.transpose()).cwiseProduct(res);
return res;
}
double MATH_NAMESPACE::svdDynamicRange(const DMat &mat)
{
DVec s = mat.singularValues();
return s.maxCoeff()/s.minCoeff();
}
double MATH_NAMESPACE::svdDynamicRangeDb(const DMat &mat)
{
return 10.*log10(svdDynamicRange(mat));
}
/****************************************************************************** /******************************************************************************
* Standard C functions * * Standard C functions *
******************************************************************************/ ******************************************************************************/

View File

@ -70,6 +70,11 @@ namespace MATH_NAMESPACE
// convert variance matrix to correlation matrix // convert variance matrix to correlation matrix
DMat varToCorr(const DMat &var); DMat varToCorr(const DMat &var);
DMat corrToVar(const DMat &corr, const DVec &varDiag);
// matrix SVD dynamic range
double svdDynamicRange(const DMat &mat);
double svdDynamicRangeDb(const DMat &mat);
// Constants // Constants
constexpr double pi = 3.1415926535897932384626433832795028841970; constexpr double pi = 3.1415926535897932384626433832795028841970;