Попытка реализовать алгоритм декомпозиции QR - PullRequest
0 голосов
/ 29 мая 2019

В настоящее время я пытаюсь реализовать алгоритм декомпозиции QR с C #.Тем не менее, я изо всех сил, потому что я не понимаю, как точно рассчитать значения матриц Q и R за пределами первого столбца.

У меня отличное понимание QR-разложения в математике, но передача этого в C #, кажется, очень беспокоит меня.

Может ли кто-нибудь помочь направить меня в правильном направлении?Я предполагаю, что есть какой-то общий подход, который мне не хватает, но я действительно хочу понять, как задействовать и исправить это, так как я пытаюсь создать небольшую библиотеку, реализующую все вычисления в матрице, но столкнувшуюся здесь с трудом.

Следующий код показывает, что я реализовал до сих пор, и в моих тестовых примерах возвращаются правильные результаты в первой строке R и в первой строке Q.

    public static Tuple<Matrix, Matrix> GramSchmidt(this Matrix a) {
        var nCols = a.N_Cols;
        var mRows = a.M_Rows;
        Matrix Q = new Matrix(mRows,mRows);
        Matrix R = new Matrix(mRows,nCols);

        for (int col = 0; col < nCols; col++) {
            for (int row = 0; row < mRows; row++) {
                tmp = VectorNorm(a.Column(col));
                R[col, col] = VectorNorm(a.Column(col));
                Q[row, col] = (1 / VectorNorm(a.Column(col))) * a[row,col];
            }
        }
        return new Tuple<Matrix, Matrix>(Q,R);
    }

У меня есть следующая функциядля расчета VectorNorm:

    public static double VectorNorm(this Vector v) {                                           
        var size = v.Size;
        double res = 0;

        for (int i = 0; i < size; i++) {
            res += (Math.Pow(v[i],2)); // add all vector elements
        }
        return Math.Sqrt(res); // returns product of elements squared
    }
...