我正在尝试编写一个获取mxn矩阵并且QR分解它的程序。
尚未完成,但我遇到了问题。 我尝试使用维基百科http://en.wikipedia.org/wiki/QR_decomposition
中显示的示例运行我的程序A=[12,-51,4;6,167,-68;-4,24,-41]
他们称之为Q1,Q2 ......我打电话给Qtemp。每当我计算Qtemp时,我打印它以便看到我得到与维基百科相同的结果。我做Q1,但是对于Q2,我不这样做。
他们的Q2和我的价值相同,但标志不同。他们有一个+我有一个 - ,他们有一个 - ,我有一个+。
这是我的代码:
Q=eye(m);
R=A;
for i=1:min(m-1,n)
ei=zeros(n,1);
ei(i,1)=1;
x=A(:,i);
for j=1:i-1
x(j,1)=0;
end
u=x-norm(x)*ei;
v=u/norm(u);
Qtemp=eye(m)-2*(v*v');
A=Qtemp*A;
disp(Qtemp);
end
我真的只是复制了他们的算法并将其翻译成代码,但第二个Qtemp的输出仍然不好。
答案 0 :(得分:1)
看起来你并没有减少每次迭代时块的大小。所有内容似乎都是相同m
和n
(您未在代码中定义)的函数。查看他们定义A'的行on the Wikipedia page并使用它来构建Q 2 (只是低三分之二)。下面是我的一些代码,适用于执行可能有帮助的3乘3矩阵的QR分解。请特别注意,第二个块仅适用于A(:,2)
和q(2:3,:)
:
function [q,r]=qr3(A)
u = A(:,1);
u(1) = u(1)-(1-2*(u(1)<0))*norm(u); % Flip < to > to match sign convention of qr
u = u/norm(u);
u(~isfinite(u)) = sqrt(3)/3;
q = -2*(u*u');
q([1 5 9]) = q([1 5 9])+1;
u = q(2:3,:)*A(:,2);
u(1) = u(1)-(1-2*(u(1)<0))*norm(u); % Flip < to > to match sign convention of qr
u = u/norm(u);
u(~isfinite(u)) = sqrt(2)/2;
q(:,2:3) = q(:,2:3)*[1-2*u(1)^2 -2*u(1)*u(2);
-2*u(1)*u(2) 1-2*u(2)^2];
r = triu(q'*A);
上面的代码和维基百科上详述的方法使用了Matlab的qr
函数的不同符号约定。请参阅我在代码中的注释,了解如何翻转符号。