Accord.Math.Decompositions.QrDecomposition.Inverse C# (CSharp) Method

Inverse() public method

Least squares solution of A * X = I
public Inverse ( ) : ].double[
return ].double[
        public double[,] Inverse()
        {
            if (!FullRank)
                throw new InvalidOperationException("Matrix is rank deficient.");

            // Copy right hand side
            int m = qr.GetLength(0);
            int n = qr.GetLength(1);
            var X = new double[m,m];

            // Compute Y = transpose(Q)
            for (int k = n - 1; k >= 0; k--)
            {
                for (int i = 0; i < m; i++)
                    X[k, i] = 0.0;

                X[k, k] = 1.0;
                for (int j = k; j < n; j++)
                {
                    if (qr[k, k] != 0)
                    {
                        double s = 0.0;

                        for (int i = k; i < m; i++)
                            s += qr[i, k]*X[j, i];

                        s = -s/qr[k, k];

                        for (int i = k; i < m; i++)
                            X[j, i] += s*qr[i, k];
                    }
                }
            }

            // Solve R*X = Y;
            for (int k = n - 1; k >= 0; k--)
            {
                for (int j = 0; j < m; j++)
                    X[k, j] /= Rdiag[k];

                for (int i = 0; i < k; i++)
                    for (int j = 0; j < m; j++)
                        X[i, j] -= X[k, j]*qr[i, k];
            }

            return X;
        }
    }

Usage Example

        public void InverseTestNaN()
        {
            int n = 5;

            var I = Matrix.Identity(n);

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    double[,] value = Matrix.Magic(n);

                    value[i, j] = double.NaN;

                    var target = new QrDecomposition(value);
                    var solution = target.Solve(I);
                    var inverse = target.Inverse();

                    Assert.IsTrue(Matrix.IsEqual(solution, inverse));
                }
            }
        }
All Usage Examples Of Accord.Math.Decompositions.QrDecomposition::Inverse