我目前正在尝试使用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
}