public static void EigenDecomposition(Matrix2x2f m, out float e1, out float e2) { // solve the characteristic polynomial float a = 1.0f; float b = -(m.m00 + m.m11); float c = m.m00 * m.m11 - m.m01 * m.m10; SolveQuadratic(a, b, c, out e1, out e2); }
/// <summary> /// Subtract two matrices. /// </summary> public static Matrix2x2f operator -(Matrix2x2f m1, Matrix2x2f m2) { Matrix2x2f kSum = new Matrix2x2f(); kSum.m00 = m1.m00 - m2.m00; kSum.m10 = m1.m10 - m2.m10; kSum.m01 = m1.m01 - m2.m01; kSum.m11 = m1.m11 - m2.m11; return(kSum); }
public static Matrix2x2f QRDecomposition(Matrix2x2f m) { Vector2f a = m.GetColumn(0).Normalized; Matrix2x2f q = new Matrix2x2f(); q.SetColumn(0, a); q.SetColumn(1, a.PerpendicularCCW); return(q); }
/// <summary> /// Are these matrices equal. /// </summary> public override bool Equals(object obj) { if (!(obj is Matrix2x2f)) { return(false); } Matrix2x2f mat = (Matrix2x2f)obj; return(this == mat); }
/// <summary> /// Multiply a matrix by a scalar. /// </summary> public static Matrix2x2f operator *(Matrix2x2f m, float s) { Matrix2x2f kProd = new Matrix2x2f(); kProd.m00 = m.m00 * s; kProd.m10 = m.m10 * s; kProd.m01 = m.m01 * s; kProd.m11 = m.m11 * s; return(kProd); }
/// <summary> /// Multiply two matrices. /// </summary> public static Matrix2x2f operator *(Matrix2x2f m1, Matrix2x2f m2) { Matrix2x2f kProd = new Matrix2x2f(); kProd.m00 = m1.m00 * m2.m00 + m1.m01 * m2.m10; kProd.m10 = m1.m10 * m2.m00 + m1.m11 * m2.m10; kProd.m01 = m1.m00 * m2.m01 + m1.m01 * m2.m11; kProd.m11 = m1.m10 * m2.m01 + m1.m11 * m2.m11; return(kProd); }
public static Matrix2x2f PolarDecomposition(Matrix2x2f m) { Matrix2x2f q = m + new Matrix2x2f(m.m11, -m.m10, -m.m01, m.m00); Vector2f c0 = q.GetColumn(0); Vector2f c1 = q.GetColumn(1); float s = c0.Magnitude; q.SetColumn(0, c0 / s); q.SetColumn(1, c1 / s); return(q); }
/// <summary> /// The Inverse of the matrix copied into mInv. /// Returns false if the matrix has no inverse. /// A matrix multipled by its inverse is the idenity. /// </summary> public bool TryInverse(ref Matrix2x2f mInv) { float det = Determinant; if (Math.Abs(det) <= 1e-06f) { return(false); } float invDet = 1.0f / det; mInv.m00 = m11 * invDet; mInv.m01 = -m01 * invDet; mInv.m10 = -m10 * invDet; mInv.m11 = m00 * invDet; return(true); }
/// <summary> /// Are these matrices equal. /// </summary> public bool EqualsWithError(Matrix2x2f m, float eps) { if (Math.Abs(m00 - m.m00) > eps) { return(false); } if (Math.Abs(m10 - m.m10) > eps) { return(false); } if (Math.Abs(m01 - m.m01) > eps) { return(false); } if (Math.Abs(m11 - m.m11) > eps) { return(false); } return(true); }
/// <summary> /// A matrix copied from the matrix m. /// </summary> public Matrix2x2f(Matrix2x2f m) { m00 = m.m00; m01 = m.m01; m10 = m.m10; m11 = m.m11; }
/// <summary> /// Are these matrices equal. /// </summary> public bool Equals(Matrix2x2f mat) { return(this == mat); }