子程序qrfac(m,n,a,lda,pivot,ipvt,lipvt,rdiag,acnorm,wa)整数m,n,lda,lipvt整数ipvt(lipvt)逻辑中枢双精度a(lda,n)、rdiag(n)、acnormal(n)和wa(n)c(c)**********c(c)c子程序qrfacc(c)c此子例程对列使用householder转换c旋转(可选)以计算c m乘n矩阵a,即qrfac确定正交c矩阵q、置换矩阵p和上梯形c矩阵r,具有大小不增加的对角元素,c使得a*p=q*rc列k,k=1,2,。。。,min(m,n)的形式为c(c)成本c i-(1/u(k))*u*uc(c)c,其中u在第一个k-1位置为零。的形式c这种变换和先旋转的方法c出现在相应的linpack子例程中。c(c)c子程序语句是c(c)c子程序qrfac(m,n,a,lda,pivot,ipvt,lipvt,rdiag,acnorm,wa)c(c)c其中c(c)c m是设置为数字的正整数输入变量a行的c。c(c)c n是设置为数字的正整数输入变量a列的c。c(c)ca是一个m乘n的数组。输入a包含的矩阵计算qr因子分解的c。关于输出c a的严格上梯形部分包含严格c r的上部梯形部分和下部梯形部分a的c部分包含q的因子形式(非平凡上述u向量的c个元素)。c(c)c lda是一个不小于m的正整数输入变量c指定数组a的前导维数。c(c)c pivot是一个逻辑输入变量。如果pivot设置为true,c,然后执行列旋转。如果pivot设置为false,c则不进行柱旋转。c(c)c ipvt是长度为lipvt的整数输出数组。智能产品虚拟化c定义了置换矩阵p,使得a*p=q*r。p的c列j是单位矩阵的列ipvt(j)。c如果pivot为false,则不引用ipvt。c(c)c lipvt是一个正整数输入变量。如果pivot为false,那么lipvt可能小到1。如果pivot为true,则c lipvt必须至少为n。c(c)c rdiag是长度为n的输出数组,其中包含c r的对角元素。c(c)c acnorm是长度为n的输出数组,其中包含c输入矩阵a相应列的范数。c如果不需要此信息,则acnorm可以符合c和rdiag。c(c)c wa是长度为n的工作数组。如果pivot为false,则wac可以与rdiag相吻合。c(c)c子程序调用c(c)c minpack提供。。。dpmpar,enorm公司c(c)c fortran提供。。。dmax1,dsqrt,最小值0c(c)c阿贡国家实验室。minpack项目。1980年3月。c伯顿·s·加博、肯尼思·希尔斯特罗姆、乔治·j·摩尔c(c)c(c)**********整数i,j,jp1,k,kmax,minmn双精度ajnorm,epsmch,one,p05,sum,temp,zero双精度dpmpar,enorm数据一,p05,零/1.0d0,5.0d-2,0.0d0/c(c)c epsmch是机器精度。c(c)epsmch=dpmpar(1)c(c)c计算初始列范数并初始化几个数组。c(c)do 10 j=1,nacnorm(j)=烯醇(m,a(1,j))rdiag(j)=acnorm(j)wa(j)=rdiag(j)如果(枢轴)ipvt(j)=j10继续c(c)c通过householder转换将a减少到r。c(c)最小值=最小值0(m,n)do 110 j=1,最小值如果(.非.枢轴)转至40c(c)c将最大标准列置于枢轴位置。c(c)kmax=jdo 20 k=j,nif(rdiag(k).gt.rdiag(kmax))kmax=k20继续如果(kmax.eq.j)转到40做30 i=1,m温度=a(i,j)a(i,j)=a(i,kmax)a(i,kmax)=温度30继续rdiag(kmax)=rdiag(j)wa(kmax)=wa(j)k=ipvt(j)ipvt(j)=ipvt(kmax)ipvt(kmax)=k40继续c(c)c计算householder变换以减少c第j列a到第j单位向量的倍数。c(c)ajnorm=烯醇(m-j+1,a(j,j))如果(ajnormar.eq.zero)转到100如果(a(j,j).lt.zero)ajnorm=-ajnormdo 50 i=j,ma(i,j)=a(i、j)/ajnorm50继续a(j,j)=a(j、j)+一c(c)c将转换应用于其余列c、更新规范。c(c)jp1=j+1如果(n.lt.jp1)转到100do 90 k=jp1,n总和=零do 60 i=j,m总和=总和+a(i,j)*a(i、k)60继续温度=总和/a(j,j)do 70 i=j,ma(i,k)=a(i、k)-温度*a(i和j)70继续如果(.not.pivot.或.rdiag(k).eq.zero),则转到80温度=a(j,k)/rdiag(k)rdiag(k)=rdiag(k)*dsqrt(dmax1(零,一个温度**2))如果(p05*(rdiag(k)/wa(k))**2.gt.epsmch)转到80rdiag(k)=烯醇(m-j,a(jp1,k))wa(k)=rdiag(k)80继续90继续100继续rdiag(j)=-ajnorm110继续返回c(c)c子程序qrfac的最后一张卡。c(c)结束