[ https://issues.apache.org/jira/browse/MATH-416?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12909140#action_12909140 ]
Dimitri Pourbaix commented on MATH-416: --------------------------------------- Returning V such that det(V) is always +1 would please you but would cost some substantial computation in general, which would make mad users for whom speed is an issue. A compromise could consist in a second accessor to V (and to Vt too I guess) which would guarantee that the determinant is +1. Would it be OK for you? > EigenDecompositionImpl.getV() returns eigen matrix with indeterminate > determinant > --------------------------------------------------------------------------------- > > Key: MATH-416 > URL: https://issues.apache.org/jira/browse/MATH-416 > Project: Commons Math > Issue Type: Improvement > Affects Versions: 2.1 > Environment: Mac OS X 10.6.4 > Reporter: Tom Milac > Assignee: Dimitri Pourbaix > > A call to EigenDecompositionImpl.getV() returns a RealMatrix the columns of > which are the eigenvectors of the matrix with which EigenDecompositionImpl is > constructed. Because EigenDecompositionImpl works only with real, symmetric > matrices, the eigenvectors (columns) returned are orthogonal. In addition, > the eigenvectors are normalized to have 2-norm = 1. Unfortunately, for 3x3 > input matrices, the determinant of the eigenvector matrix is indeterminate, > sometimes +1 and other times -1. The -1 output can be > 'repaired' simply by multiplying the matrix by -1. Example code is included > below. > Because the columns are eigenvectors, the result with either determinant is > correct. However, in the case that the matrix returned is to be interpreted > as specifying a coordinate system, the principal axes of a body in my case, > the +1 result specifies a right-handed coordinate for the principal > coordinate system of the body, and the -1 result specifies a left-handed > coordinate system. Once discovered, this indeterminacy is easy to deal with, > but nevertheless an inconvenience. > I believe it would improve EigenDecompositionImpl.getV() to return an > eigenvector matrix with a consistent determinant = +1. > Tom Milac > --------------------------------------------------------- > import org.apache.commons.math.geometry.NotARotationMatrixException; > import org.apache.commons.math.geometry.Rotation; > import org.apache.commons.math.linear.Array2DRowRealMatrix; > import org.apache.commons.math.linear.EigenDecompositionImpl; > import org.apache.commons.math.linear.InvalidMatrixException; > import org.apache.commons.math.linear.LUDecompositionImpl; > import org.apache.commons.math.linear.RealMatrix; > /** > * > * @author Tom Milac > */ > public class BugReport { > /** > * Moment of inertia tensor #1. > */ > public static final double[][] MOI1 = > {{128.52722633757742, -29.11849805467669, 8.577081342861376}, > {-29.11849805467669, 521.3276639228706, 35.512665035385666}, > {8.577081342861376, 35.512665035385666, 490.2479495932442}}; > /** > * Moment of inertia tensor #2. > */ > public static final double[][] MOI2 = > {{440.09350934414175, 44.23154125186637, -9.41455073681743}, > {44.23154125186637, 387.1291457565648, -38.07596950448303}, > {-9.41455073681743, -38.07596950448303, 762.0451513430822}}; > /** > * Constructor. > */ > public BugReport() { > } > /** > * Main. > */ > public static void main(String[] args) { > // Compute the principal axes (eigenvectors) of the #1 moment > // of inertia tensor. > RealMatrix moi1 = new Array2DRowRealMatrix(MOI1); > RealMatrix axes1 = null; > EigenDecompositionImpl eigenDecompositionImpl = null; > try { > eigenDecompositionImpl = new EigenDecompositionImpl(moi1, 0.0d); > axes1 = eigenDecompositionImpl.getV(); > } catch (InvalidMatrixException ex) { > System.err.println("MOI1: InvalidMatrixException thrown."); > System.err.println("Exiting ..."); > System.exit(-1); > } > // Compute the principal axes (eigenvectors) of the #2 moment > // of inertia tensor. > RealMatrix moi2 = new Array2DRowRealMatrix(MOI2); > RealMatrix axes2 = null; > try { > eigenDecompositionImpl = new EigenDecompositionImpl(moi2, 0.0d); > axes2 = eigenDecompositionImpl.getV(); > } catch (InvalidMatrixException ex) { > System.err.println("MOI2: InvalidMatrixException thrown."); > System.err.println("Exiting ..."); > System.exit(-1); > } > // Determinant of axes 1 eigenvector matrix = -1. If the matrix > // is interpreted as a Rotation, throws and Exception. > System.out.print("Determinant of the #1 moment of inertia tensor = "); > System.out.println(new LUDecompositionImpl(axes1).getDeterminant()); > try { > Rotation axes1_rotation = new Rotation(axes1.getData(), 1.0E-7); > } catch (NotARotationMatrixException ex) { > System.out.println("NotARotationMatrixException thrown for > 'axes1'."); > } > System.out.println(); > // Determinant of axes 2 eigenvector matrix = +1. > System.out.print("Determinant of the #2 moment of inertia tensor = "); > System.out.println(new LUDecompositionImpl(axes2).getDeterminant()); > try { > Rotation axes2_rotation = new Rotation(axes2.getData(), 1.0E-7); > } catch (NotARotationMatrixException ex) { > System.out.println("NotARotationMatrixException thrown for > 'axes2'."); > } > } > } -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.