Процесс Грама - Шмидта (ортогонализация матрицы)
Требуется написать программу (с использованием функций) для процесса Грама - Шмидта (только ортогонализацию) для матрицы A nxn. Результаты записываются в новую матрицу. Язык Си. Не могу никак понять, как организовать цикл для вычисления. Прикинул, что проще будет транспонировать исходную матрицу (работать со строками проще, чем со столбцами имхо). Но не могу додумать как действовать дальше. Мне хотя бы намёк, как всё грамотно организовать.
Ответы (1 шт):
Автор решения: return
→ Ссылка
#include <memory.h>
#include <malloc.h>
typedef double* matrix[];
typedef struct matrix_size {
unsigned long cc;
unsigned long rc;
} matrix_size;
typedef double* vector;
typedef unsigned long vector_size;
inline double scrmul(const vector a, const vector b, const vector_size size) {
double sum = 0.0;
for (vector_size i = 0; i < size; ++i)
sum += a[i] * b[i];
return sum;
}
inline void mulscr(const vector vec, const double scr, vector c, const vector_size size) {
for (vector_size i = 0; i < size; ++i)
c[i] = vec[i] * scr;
}
void proj(const vector a, const vector b, vector c, const vector_size size) {
mulscr(a, scrmul(a, b, size) / scrmul(b, b, size), c, size);
}
inline void vecadd(const vector a, const vector b, vector c, const vector_size size) {
for (vector_size i = 0; i < size; ++i)
c[i] = a[i] + b[i];
}
inline void vecneg(const vector a, vector b, const vector_size size) {
for (vector_size i = 0; i < size; ++i)
b[i] = -a[i];
}
void orthog(const matrix a, matrix b, const matrix_size* size) {
const vector_size vecSize = sizeof(double) * size->cc;
vector _proj = malloc(vecSize);
for (vector_size i = 0; i < size->rc; ++i) {
memcpy(b[i], a[i], vecSize);
for (vector_size j = 0; j < i; ++j) {
proj(a[i], b[j], _proj, size->cc);
vecneg(_proj, _proj, size->cc);
vecadd(b[i], _proj, b[i], size->cc);
}
}
free(_proj);
}
scr=scalarvec=vectormul=multiplyproj=projection/ toprojectcc=columnCountrc=rowCount