add the possiblity to sort eigenvalues/vectors according to their absolute values
This commit is contained in:
parent
fe59b6ad4d
commit
8a8eb6fb65
|
@ -169,23 +169,37 @@ namespace vcg
|
||||||
/*!
|
/*!
|
||||||
* Given the eigenvectors and the eigenvalues as output from JacobiRotate, sorts the eigenvalues
|
* Given the eigenvectors and the eigenvalues as output from JacobiRotate, sorts the eigenvalues
|
||||||
* into descending order, and rearranges the columns of v correspondinlgy.
|
* into descending order, and rearranges the columns of v correspondinlgy.
|
||||||
/param eigenvalues
|
* \param eigenvalues
|
||||||
/param eigenvector (in columns)
|
* \param eigenvector (in columns)
|
||||||
|
* \param absComparison sort according to the absolute values of the eigenvalues.
|
||||||
*/
|
*/
|
||||||
template < typename MATRIX_TYPE, typename POINT_TYPE >
|
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());
|
assert(eigenvectors.ColumnsNumber()==eigenvectors.RowsNumber());
|
||||||
int dimension = eigenvectors.ColumnsNumber();
|
int dimension = eigenvectors.ColumnsNumber();
|
||||||
int i, j, k;
|
int i, j, k;
|
||||||
float p;
|
float p,q;
|
||||||
for (i=0; i<dimension-1; i++)
|
for (i=0; i<dimension-1; i++)
|
||||||
{
|
{
|
||||||
p = eigenvalues[ k=i ];
|
if (absComparison)
|
||||||
|
{
|
||||||
for (j=i+1; j<dimension; j++)
|
p = fabs(eigenvalues[k=i]);
|
||||||
if (eigenvalues[j] >= p)
|
for (j=i+1; j<dimension; j++)
|
||||||
p = eigenvalues[ k=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)
|
if (k != i)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue