/// <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); }
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); //Возвращаем }