В настоящее время я пытаюсь реализовать алгоритм декомпозиции 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
}