Исправил функцию, теперь больше похоже на правду,
НО возникают проблемы со знаками. Вот исправленная функция:
function [ Q, R ] = houseTriangular( A )
% QR разложение матрицы A для поля вещественных
% и комплексных чисел
% Входные параметры: A - симметричная матрица
% Выходные параметры: Q - унитарная матрица
% R - верхняя треугольная матрица
[r, ~] = size(A);
Q = eye(r);
k = 0;
% для комплексной матрицы
if ~isreal(A)
for i = 1 : r - 1
alpha = norm(A(i:r,i));
e = zeros(1, r);
e(i) = 1;
u = A(:,i) - (alpha * e');
if k ~= 0 % для строк, начиная со второй
u(1:k) = 0;
end
v = u / norm(u);
H = eye(r) - ( 1 + conj(v' * A(:,i))/(v' * A(:,i))) * (v * v');
A = H * A;
Q = Q * H;
k = k + 1;
end
R = A;
end
Результат функции:
Цитата:
q =
-0.7981 - 0.3192i -0.0582 - 0.0176i 0.4551 - 0.2244i
0.1773 - 0.0200i 0.7877 - 0.4275i 0.2097 - 0.3478i
0.4496 + 0.1648i -0.4391 - 0.0173i 0.6770 - 0.3453i
r =
12.5300 - 0.0000i -3.9904 + 7.6616i
0.0000 - 0.0000i 10.7413 + 0.0000i
0.0000 - 0.0000i 0.0000 + 0.0000i
Встроенная функция матлаба:
Цитата:
q =
-0.7981 + 0.3192i -0.3036 - 0.2224i 0.3220 - 0.1260i
0.1596 - 0.0798i -0.7472 - 0.4151i -0.4190 + 0.2490i
0.4789 - 0.0000i -0.1779 - 0.3101i 0.8017 - 0.0085i
r =
12.5300 + 0.0000i -3.9904 + 7.6616i
0.0000 + 0.0000i -10.7413 + 0.0000i
0.0000 + 0.0000i 0.0000 + 0.0000i
Как видно, значения разнятся, хоть матрица Q и остается унитарной. Если умножить Q на R:
Цитата:
ans =
-10.0000 - 4.0000i 5.0059 - 5.0293i
2.2220 - 0.2504i 7.9066 - 3.1531i
5.6333 + 2.0654i -7.7732 + 2.6015i
Т.е.
. Разложение не работает. Проблема осталась, есть какие идеи по этому поводу?