Open
Description
Matrix.getDeterminant() might contain a typo.
In the function
public final double getDeterminant()
{
double result = 0.0;
// Columns 2, 3, 4.
result += this.m11 *
(this.m22 * (this.m33 * this.m44 - this.m43 * this.m34)
- this.m23 * (this.m32 * this.m44 - this.m42 * this.m34)
+ this.m24 * (this.m32 * this.m43 - this.m42 * this.m33));
// Columns 1, 3, 4.
result -= this.m12 *
(this.m21 * (this.m33 * this.m44 - this.m43 * this.m34)
- this.m23 * (this.m31 * this.m44 - this.m41 * this.m34)
+ this.m24 * (this.m31 * this.m43 - this.m41 * this.m33));
// Columns 1, 2, 4.
result += this.m13 *
(this.m21 * (this.m32 * this.m44 - this.m42 * this.m34)
- this.m22 * (this.m31 * this.m44 - this.m41 * this.m34)
+ this.m24 * (this.m31 * this.m42 - this.m41 * this.m32));
// Columns 1, 2, 3.
result -= this.m14 *
(this.m21 * (this.m32 * this.m43 - this.m42 - this.m33)
- this.m22 * (this.m31 * this.m43 - this.m41 * this.m33)
+ this.m23 * (this.m31 * this.m42 - this.m41 * this.m32));
return result;
}
The last line containing
// Columns 1, 2, 3.
result -= this.m14 *
(this.m21 * (this.m32 * this.m43 - this.m42 - this.m33)
- this.m22 * (this.m31 * this.m43 - this.m41 * this.m33)
+ this.m23 * (this.m31 * this.m42 - this.m41 * this.m32));
should probably read like the following:
// Columns 1, 2, 3.
result -= this.m14 *
(this.m21 * (this.m32 * this.m43 - this.m42 * this.m33)
- this.m22 * (this.m31 * this.m43 - this.m41 * this.m33)
+ this.m23 * (this.m31 * this.m42 - this.m41 * this.m32));
A problem causes by this is that the determinant of a Matrix is not equal to the determinant of the Matrix's transpose. This can be verified by, e.g., running the following
Matrix m1 = new Matrix( 1, 0, 0, 1,
1, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1);
System.out.println(m1.getDeterminant());
System.out.println(m1.getTranspose().getDeterminant());
Found with M. Moeller while debugging some related issues and noticing that the determinant differs from apache.commons.math
Metadata
Metadata
Assignees
Labels
No labels