给你一段matlab代码,你可以照笑迟芹着改成 c++
n = size(V,1)k = size(V,2)
U = zeros(n,k)
U(:,1) = V(:,1)/sqrt(V(:,1)'*V(:,1))
for i = 碰毕2:k
U(:,i) = V(:,i)
旦乎 for j = 1:i-1
U(:,i) = U(:,i) - ( U(:,i)'*U(:,j) )/( U(:,j)'*U(:,j) )*U(:,j)
end
U(:,i) = U(:,i)/sqrt(U(:,i)'*U(:,i))
end
function l = rqrtz(A,M)%QR算法求举衡升矩阵全部特征值正老
%已拦脊知矩阵:A
%迭代步数:M
%求得的矩阵特征值:l
A = hess(A)
for i=1:M
N = size(A)
n = N(1,1)
u = A(n,n)
[q,r]=qr(A-u*eye(n,n))
A = r*q+u*eye(n,n)
l = diag(A)
end
------------------------------------
A=[0 5 0 0 0 01 0 4 0 0 00 1 0 3 0 00 0 1 0 2 00 0 0 1 0 10 0 0 0 1 0]
A =
0 5 0 0 0 0
1 0 4 0 0 0
0 1 0 3 0 0
0 0 1 0 2 0
0 0 0 1 0 1
0 0 0 0 1 0
>>rqrtz(A,50)
ans =
-3.2030
3.2030
-1.8837
1.8837
-0.6167
0.6167
>>eig(A)
ans =
-3.3243
3.3243
-1.8892
-0.6167
1.8892
0.6167
% by dynamic of Matlab技术论坛% see also http://www.matlabsky.com
% contact me matlabsky@gmail.com
% 2010-02-28 13:28:30
%
哈哈 这个程序我真好前段时间写好的,原创的并有详细注释
http://www.matlabsky.net/viewthread.php?tid=4851&highlight=household
下面的程序需要调用一个household的子程序,你可以到上面的连接下载
function [Q,R]=qrhs(A)
% 基于Householder变换,将方阵A分解为A=QR,其中Q为正交改物猜矩阵,R为上三角阵
%
% 参数说明
% A:需要进行QR分解的方阵
% Q:分解得到的正交矩阵
% R:分解得到的上三角阵
%
% 实例说明
% A=[-12 3 33 1 -23 -2 7]
% [Q,R]=qr(A) % 调用MATLAB自带的QR分解函数进核型行验证
% [q,r]=qrhs(A) % 调用本函数进行QR分解
% q*r-A % 验证 A=QR
% q'*q % 验证q的正交性
% norm(q) % 验证q的标准化,即二范数等于1
%
% 线性代数基础知识
% 1.B=P*A*inv(P),称A与B相似,相似矩阵具有相同的特征值
% 2.Q*Q'=I,称Q为正交矩阵,正交矩阵的乘积仍为正交矩阵
%
% 注意:我蚂数们也可以基于Givens变换,对方阵A进行QR分解,但是相对繁琐些,参见http://www.matlabsky.com/thread-4850-1-1.html
%
% by dynamic of Matlab技术论坛
% see also http://www.matlabsky.com
% contact me matlabsky@gmail.com
% 2010-01-17 22:49:51
%
n=size(A,1)
R=A
Q=eye(n)
for i=1:n-1
x=R(i:n,i)
y=[1zeros(n-i,1)]
Ht=householder(x,y)
H=blkdiag(eye(i-1),Ht)
Q=Q*H
R=H*R
end
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)