Ортогонализация векторов

Пусть в n-мерном пространстве задано m < n векторов. Линейное многообразие этих векторов определяет некоторое подпространство. С точки зрения ортогонализации интересны следующие две задачи. Первая - найти ортогональный базис этого подпространства. Вторая - найти набор взаимно-ортогональных векторов ортогональных этому подпространству.

Следующий подход позволяет решить одновременно обе эти задачи. В цикле на каждом шаге выбираем один из векторов ( произвол 1 ) и отображаем его на одну из координатных осей ( произвол 2 ). Также применяем это отображение к остальным ещё невыбранным векторам и делаем у них нулевой выбранную координату. После этого выбранный вектор уже не используется, а цикл повторяется, пока не исчерпаем все ненулевые вектора. В результате получим набор векторов у которых все координаты кроме одной равны нулю. Теперь, если применить используемые отображения в обратном порядке к координатным осям получим n взаимно-ортогональных векторов. Часть из них ( те которые получены из выбранных осей ) будут являться базисом исходного подпростанства.
В этом описании есть два неопределённых момента: 1) какой вектор выбрать? 2) на какую ось отображать? Следующий алгоритм ( код H1 ) выбирает на i-ом шаге вектор с максимальной нормой и отображает его на i-ую ось.

nat orthogonalizationH1 ( nat nr, Matrix & mat );
Входными параметрами функции являются к-во заполненых строк матрицы и сама матрица. К-во столбцов матрицы соответствует размерности пространства, а к-во строк должно быть равно желаемому к-ву ортогональных векторов. Функция заполнит матрицу ортогональными векторами и вернёт к-во независимых исходных векторов ( т.е. это к-во первых строк матрицы будет базисом исходного подпространства, остальные строки матрицы ортогональны ему ). В случае, если возвращаемое значение равно нулю, то матрица не заполняется.

Описание класса Matrix находится здесь.

Исходники находятся в файле mathem.cpp.

Наверх
Hosted by uCoz