public Single3x3 Inverse() { if (IsNaN(this)) { return(NaN); } MatrixNxN M1 = new MatrixNxN(3); M1[0, 0] = XX; M1[0, 1] = XY; M1[0, 2] = XZ; M1[1, 0] = YX; M1[1, 1] = YY; M1[1, 2] = YZ; M1[2, 0] = ZX; M1[2, 1] = ZY; M1[2, 2] = ZZ; try { MatrixNxN M2 = M1.Inverse(); return(new Single3x3( (float)M2[0, 0], (float)M2[0, 1], (float)M2[0, 2], (float)M2[1, 0], (float)M2[1, 1], (float)M2[1, 2], (float)M2[2, 0], (float)M2[2, 1], (float)M2[2, 2] )); } catch (SingularMatrixException) { return(NaN); } }
public Double3x3 Inverse() { if (IsNaN(this)) { return(NaN); } MatrixNxN M1 = new MatrixNxN(3); M1.Values[0, 0] = XX; M1.Values[0, 1] = XY; M1.Values[0, 2] = XZ; M1.Values[1, 0] = YX; M1.Values[1, 1] = YY; M1.Values[1, 2] = YZ; M1.Values[2, 0] = ZX; M1.Values[2, 1] = ZY; M1.Values[2, 2] = ZZ; try { MatrixNxN M2 = M1.Inverse(); return(new Double3x3( M2.Values[0, 0], M2.Values[0, 1], M2.Values[0, 2], M2.Values[1, 0], M2.Values[1, 1], M2.Values[1, 2], M2.Values[2, 0], M2.Values[2, 1], M2.Values[2, 2] )); } catch (SingularMatrixException) { return(NaN); } }
public MatrixNxN ToMatrixNxN() { int n = Count1; int m = Count2; if (n != m) { throw // Matrix is not square new UnequalValueException(n, m, 125543); } MatrixNxN MatNxN = new MatrixNxN(n); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { MatNxN._values[i, j] = _values[i, j]; } } return(MatNxN); }
public LudCmp(MatrixNxN mtx) : base(mtx.Count1) { const double Tiny = 1E-10; int n = Count1; Ixx = new int[n]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { this[i, j] = mtx[i, j]; } } double[] vv = new double[n]; for (int i = 0; i < n; i++) { double vMax = 0d; for (int j = 0; j < n; j++) { double v = Abs(this[i, j]); if (v > vMax) { vMax = v; } } if (vMax == 0d) // Singular matrix { throw new SingularMatrixException(690034); } vv[i] = 1d / vMax; } D = 1d; int iMax = 0; for (int j = 0; j < n; j++) { for (int i = 0; i < j; i++) { double Sum = this[i, j]; for (int k = 0; k < i; k++) { Sum = Sum - this[i, k] * this[k, j]; } this[i, j] = Sum; } double big = 0d; iMax = j; for (int i = j; i < n; i++) { double Sum = this[i, j]; for (int k = 0; k <= j - 1; k++) { Sum = Sum - this[i, k] * this[k, j]; } this[i, j] = Sum; double dum = vv[i] * Abs(Sum); if (dum >= big) { big = dum; iMax = i; } } Ixx[j] = iMax; if (j != iMax) { for (int k = 0; k < n; k++) { double dum1 = this[iMax, k]; this[iMax, k] = this[j, k]; this[j, k] = dum1; } D = -D; double dum2 = vv[iMax]; vv[iMax] = vv[j]; vv[j] = dum2; } double dum3 = this[j, j]; if (Abs(dum3) < Tiny) { throw new SingularMatrixException(563278); } if (j != n) { dum3 = 1.0 / dum3; for (int i = j + 1; i < n; i++) { this[i, j] = this[i, j] * dum3; } } } }