Пример #1
0
        /// <summary>
        /// Получение псевдоинверстной матрицы
        /// </summary>
        /// <returns></returns>
        public Matrix PInverse()
        {
            SVD    svd = SingularValueDecomposition();
            Matrix V   = new Matrix(M, N);
            int    _n  = Math.Min(M, svd.V.N);
            int    _m  = Math.Min(N, svd.V.M);

            for (int i = 0; i < _n; i++)
            {
                for (int j = 0; j < _m; j++)
                {
                    V[i, j] = svd.V[i, j];
                }
            }
            double[] s = svd.S.Diag();
            Matrix   S = new Matrix(1, svd.S.N);          //Вектор строка

            _m = Math.Min(S.M, s.Length);
            for (int i = 0; i < _m; i++)           //Массив в вектор строку
            {
                S[0, i] = 1 / s[i];
            }
            Matrix VS             = V.multiply(S);
            Matrix matrixPInverse = VS * svd.U.transposing();

            return(matrixPInverse);
        }
Пример #2
0
        public SVD SingularValueDecomposition()
        {
            SingularValueDecomposition svd = new SingularValueDecomposition(toDouble());
            Matrix U  = new Matrix(svd.U);      // Матрица U[N,N]
            Matrix S  = new Matrix(N, M);       // Матрица S[N,M]
            Matrix s  = new Matrix(svd.S);
            int    _n = Math.Min(S.N, s.N);
            int    _m = Math.Min(S.M, s.M);

            for (int i = 0; i < _n; i++)
            {
                for (int j = 0; j < _m; j++)
                {
                    S[i, j] = s[i, j];
                }
            }
            Matrix V         = new Matrix(svd.V); // Матрица V[M,M]
            SVD    svdMatrix = new SVD(U, S, V);  //Загоняем во вспомогательный класс

            return(svdMatrix);                    //Возвращаем
        }