コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
ファイル: MatrixNxM.cs プロジェクト: widovd/NEUNET
        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);
        }
コード例 #4
0
ファイル: LudCmp.cs プロジェクト: widovd/NEUNET
        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;
                    }
                }
            }
        }