add the possiblity to sort eigenvalues/vectors according to their absolute values

This commit is contained in:
Paolo Cignoni 2008-10-24 17:21:53 +00:00
parent fe59b6ad4d
commit 8a8eb6fb65
1 changed files with 23 additions and 9 deletions

View File

@ -169,23 +169,37 @@ namespace vcg
/*!
* Given the eigenvectors and the eigenvalues as output from JacobiRotate, sorts the eigenvalues
* into descending order, and rearranges the columns of v correspondinlgy.
/param eigenvalues
/param eigenvector (in columns)
* \param eigenvalues
* \param eigenvector (in columns)
* \param absComparison sort according to the absolute values of the eigenvalues.
*/
template < typename MATRIX_TYPE, typename POINT_TYPE >
void SortEigenvaluesAndEigenvectors(POINT_TYPE &eigenvalues, MATRIX_TYPE &eigenvectors)
void SortEigenvaluesAndEigenvectors(POINT_TYPE &eigenvalues, MATRIX_TYPE &eigenvectors, bool absComparison = false)
{
assert(eigenvectors.ColumnsNumber()==eigenvectors.RowsNumber());
int dimension = eigenvectors.ColumnsNumber();
int i, j, k;
float p;
float p,q;
for (i=0; i<dimension-1; i++)
{
p = eigenvalues[ k=i ];
for (j=i+1; j<dimension; j++)
if (eigenvalues[j] >= p)
p = eigenvalues[ k=j ];
if (absComparison)
{
p = fabs(eigenvalues[k=i]);
for (j=i+1; j<dimension; j++)
if ((q=fabs(eigenvalues[j])) >= p)
{
p = q;
k = j;
}
p = eigenvalues[k];
}
else
{
p = eigenvalues[ k=i ];
for (j=i+1; j<dimension; j++)
if (eigenvalues[j] >= p)
p = eigenvalues[ k=j ];
}
if (k != i)
{