尝试实现QR分解算法

时间:2019-05-29 15:01:25

标签: c# qr-decomposition

我目前正在尝试使用C#实现QR分解算法。但是,由于我并没有真正理解如何准确计算第一列以外的Q和R矩阵的值,所以我很努力。

我对数学中的QR分解有很好的了解,但是将其转换为C#似乎给我带来很大麻烦。

有人可以帮我指出正确的方向吗?我猜想我缺少一些通用的方法,但是我真的想了解如何使用和解决此问题,因为我试图构建一个实现所有Matrix计算的小型库,但是在这里遇到了困难。

以下代码显示了我到目前为止已经实现的内容,在我的测试案例中,它们在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
    }

0 个答案:

没有答案