Francis于1961-1962年利用矩阵的QR分解建立了计算矩阵特征值的QR方法,是计算中小型矩阵全部特征值的最有效方法之一。

  • 本篇的主线是第一部分介绍QR分解,第二部分介绍从QR分解引出的特征值QR迭代算法,第三部分讨论QR迭代法的收敛性,第四部分引用UTEP-Math 5330中基于Householder变换的QR分解实现,第五部分做总结以及更多讨论。

文章目录

  • QR分解.
  • QR迭代算法.
  • 收敛性.
  • 【Reference】UTEP-Math 5330.
  • Summary.

QR分解.

  • 引理】设 x⃗=(x1,x2,⋯,xi,⋯,xj,⋯,xn)T\vec x=(x_1,x_2,\cdots,x_i,\cdots,x_j,\cdots,x_n)^Tx=(x1​,x2​,⋯,xi​,⋯,xj​,⋯,xn​)T,其中 xi⋅xj≠0x_i·x_j\neq0xi​⋅xj​​=0,则存在一个Givens变换矩阵 PijP_{ij}Pij​ 使得Pijx⃗=(y1,y2,⋯,yi,⋯,yj,⋯,yn)TP_{ij}\vec x=(y_1,y_2,\cdots,y_i,\cdots,y_j,\cdots,y_n)^TPij​x=(y1​,y2​,⋯,yi​,⋯,yj​,⋯,yn​)T其中yi=xi2+xj2y_i=\sqrt{x_i^2+x_j^2}yi​=xi2​+xj2​​yj=0y_j=0yj​=0
  • 上述Givens矩阵 PijP_{ij}Pij​ 中P[i,i]=cos⁡θ,P[i,j]=sin⁡θP[i,i]=\cos\theta~,~P[i,j]=\sin\thetaP[i,i]=cosθ , P[i,j]=sinθP[j,i]=−sin⁡θ,P[j,j]=cos⁡θP[j,i]=-\sin\theta~,~P_[j,j]=\cos\thetaP[j,i]=−sinθ , P[​j,j]=cosθcos⁡θ=xixi2+xj2,sin⁡θ=xjxi2+xj2\cos\theta=\frac{x_i}{\sqrt{x_i^2+x_j^2}}~,~\sin\theta=\frac{x_j}{\sqrt{x_i^2+x_j^2}}cosθ=xi2​+xj2​​xi​​ , sinθ=xi2​+xj2​​xj​​
  • 实际操作时,可以通过对 x⃗\vec xx 的规范化操作来避免数值溢出。

  • 定理】对于 nnn 阶非奇异矩阵 AAA 而言,可以分解为正交阵 QQQ 和上三角阵 RRR 的乘积,即 A=QR.A=QR.A=QR. 该分解是唯一的,当矩阵 RRR 中的元素满足∀i∈[1,n],R[i,i]>0\forall~i\in[1,n],R[i,i]>0∀ i∈[1,n],R[i,i]>0

  • 定理】对于 nnn 阶非奇异矩阵 AAA 而言,存在一系列平面旋转变换矩阵 Pk∣k=1,2,⋯,n−1P_k|k=1,2,\cdots,n-1Pk​∣k=1,2,⋯,n−1,使得 Pn−1⋯P2P1A=RP_{n-1}\cdots P_2P_1A=RPn−1​⋯P2​P1​A=R其中 RRR 是上三角阵且 rii>0,i=1,2,⋯,n.r_{ii}>0,i=1,2,\cdots,n.rii​>0,i=1,2,⋯,n.
  • 证明】由于 AAA 非奇异,所以不可能存在全零列,因此对于第一列,可以做出一系列平面旋转变换 P1=∏P1kP_1=\prod P_{1k}P1​=∏P1k​使得第一列约化为 (r11,0,⋯,0)T(r_{11},0,\cdots,0)^T(r11​,0,⋯,0)T,同理对于后面的第 mmm列,可以做一系列平面旋转变换 PkP_kPk​ 使得该列约化为 (r1m,r2m,⋯,rmm,0,⋯,0)T(r_{1m},r_{2m},\cdots,r_{mm},0,\cdots,0)^T(r1m​,r2m​,⋯,rmm​,0,⋯,0)T,最终得到上三角阵,并引入对角阵 D={±1,±1,⋯,±1}D=\{\pm1,\pm1,\cdots,\pm1\}D={±1,±1,⋯,±1} 使得主对角元全正。
  • 显然如果令 QT=∏i=1n−1PiQ^T=\prod^{n-1}_{i=1}P_iQT=i=1∏n−1​Pi​那么QTA=RQ^TA=RQTA=R因为 QQQ 是正交阵,所以 QT=Q−1Q^T=Q^{-1}QT=Q−1,所以有A=(QT)−1R=QRA=\Big(Q^T\Big)^{-1}R=QRA=(QT)−1R=QR
  • 具体地如何进行QR分解,得到正交阵 QQQ 和上三角阵 RRR,主流的有三种方案:Schmidt正交化、Givens变换和Householder变换,在第四部分对前两者有简介。

QR迭代算法.

  • 设 AAA 是 nnn 阶非奇异阵,记 A1=AA_1=AA1​=A,对其进行QR分解得到 A1=Q1R1A_1=Q_1R_1A1​=Q1​R1​按照如下公式进行迭代:Ak+1=RkQk=QkTAkQk=Qk+1Rk+1(*)A_{k+1}=R_kQ_k=Q_k^TA_kQ_k=Q_{k+1}R_{k+1}\tag{*}Ak+1​=Rk​Qk​=QkT​Ak​Qk​=Qk+1​Rk+1​(*)
  • 上述利用矩阵QR分解和递推式 (∗)(*)(∗) 构造矩阵序列 {Ak}\{A_k\}{Ak​} 的过程即为QR算法

  • Ak+1=QkTAkQkA_{k+1}=Q^T_{k}A_kQ_kAk+1​=QkT​Ak​Qk​
  • Ak+1=(Q1Q2⋯Qk)TA1(Q1Q2⋯Qk)A_{k+1}=(Q_1Q_2\cdots Q_k)^TA_1(Q_1Q_2\cdots Q_k)Ak+1​=(Q1​Q2​⋯Qk​)TA1​(Q1​Q2​⋯Qk​)
  • 若记 Qk~=∏i=1kQi,Rk~=∏i=k1Ri\tilde{Q_k}=\prod^k_{i=1}Q_i~,~\tilde{R_k}=\prod^1_{i=k}R_iQk​~​=i=1∏k​Qi​ , Rk​~​=i=k∏1​Ri​那么矩阵 AkA^kAk 的QR分解式为 Ak=Qk~Rk~A^k=\tilde{Q_k}\tilde{R_k}Ak=Qk​~​Rk​~​
  • 证明】数学归纳法
    ①当 k=1k=1k=1 时显然有 A=Q1R1=Q1~R1~A=Q_1R_1=\tilde{Q_1}\tilde{R_1}A=Q1​R1​=Q1​~​R1​~​
    ②设 Ak−1A^{k-1}Ak−1 分解式为 Ak−1=Qk−1~Rk−1~A^{k-1}=\tilde{Q_{k-1}}\tilde{R_{k-1}}Ak−1=Qk−1​~​Rk−1​~​
    ③那么 Qk~Rk~=Q1Q2⋯Qk−1(QkRk)Rk−1⋯R2R1=Q1Q2⋯Qk−1AkRk−1⋯R2R1=Qk−1~AkRk−1~=Qk−1~(Qk−1~)TAQk−1~Rk−1~=AAk−1=Ak\begin{aligned}\tilde{Q_k}\tilde{R_k} &=Q_1Q_2\cdots Q_{k-1}(Q_kR_k)R_{k-1}\cdots R_2R_1\\ &=Q_1Q_2\cdots Q_{k-1}A_kR_{k-1}\cdots R_2R_1\\ &=\tilde{Q_{k-1}}A_k\tilde{R_{k-1}}\\ &=\tilde{Q_{k-1}}\Big(\tilde{Q_{k-1}}\Big)^TA\tilde{Q_{k-1}}\tilde{R_{k-1}}\\ &=AA^{k-1}\\ &=A^k \end{aligned}Qk​~​Rk​~​​=Q1​Q2​⋯Qk−1​(Qk​Rk​)Rk−1​⋯R2​R1​=Q1​Q2​⋯Qk−1​Ak​Rk−1​⋯R2​R1​=Qk−1​~​Ak​Rk−1​~​=Qk−1​~​(Qk−1​~​)TAQk−1​~​Rk−1​~​=AAk−1=Ak​

收敛性.

  • 对于 nnn 阶非奇异阵 AAA,若 AAA 的特征值满足 ①∣λ1∣>∣λ2∣>⋯>∣λn∣①~|\lambda_1|>|\lambda_2|>\cdots>|\lambda_n|① ∣λ1​∣>∣λ2​∣>⋯>∣λn​∣;②A②~A② A 有标准型 A=XDX−1A=XDX^{-1}A=XDX−1,其中 D=diagλ1,λ2,⋯,λnD=diag{\lambda_1,\lambda_2,\cdots,\lambda_n}D=diagλ1​,λ2​,⋯,λn​,且 X−1X^{-1}X−1 有三角分解 X−1=LUX^{-1}=LUX−1=LU,则由QR算法产生的矩阵序列 {Ak}\{A_k\}{Ak​} 有下列极限:lim⁡k→∞Ak=R\lim_{k\rightarrow\infin}A_k=Rk→∞lim​Ak​=R 其中 RRR 为上三角阵,并且 rii=λi.r_{ii}=\lambda_i.rii​=λi​.
  • 证明】对于非奇异矩阵 AAA,存在可逆矩阵 XXX 使得 X−1AX=DX^{-1}AX=DX−1AX=D,即 A=XDX−1A=XDX^{-1}A=XDX−1,因此有Ak=XDkX−1(1)A^k=XD^kX^{-1}\tag{1}Ak=XDkX−1(1)条件中认为 X−1X^{-1}X−1 存在LU分解 X−1=LUX^{-1}=LUX−1=LU,因此 (1)(1)(1) 式可写为 Ak=XDkLU=X(DkLD−k)DkU(2)A^k=XD^kLU=X(D^kLD^{-k})D^{k}U\tag{2}Ak=XDkLU=X(DkLD−k)DkU(2)将 (2)(2)(2) 中 DkLD−kD^kLD^{-k}DkLD−k 做加性分解,得到DkLD−k=E+ΛkD^kLD^{-k}=E+\Lambda_kDkLD−k=E+Λk​其中 Λk\Lambda_kΛk​ 是一个下三角阵,且其主对角元 Λ[i,i]=0\Lambda[i,i]=0Λ[i,i]=0,非零元素表达式为Λ[i,j]=L[i,j]⋅(λiλj)k,i>j\Lambda[i,j]=L[i,j]·\Big(\frac{\lambda_i}{\lambda_j}\Big)^k~,~i>jΛ[i,j]=L[i,j]⋅(λj​λi​​)k , i>j由于特征值按绝对值降序排列,因此有下面的极限存在lim⁡k→∞Λ=0\lim_{k\rightarrow\infin}\Lambda=0k→∞lim​Λ=0这里的 000 代表零矩阵。由于矩阵 XXX 非奇异,对其进行QR分解,有X=QRX=QRX=QR至此 (2)(2)(2) 式可以写为Ak=QR(E+Λk)DkU=Q(E+RΛkR−1)RDkU(3)A^k=QR(E+\Lambda_k)D^{k}U=Q(E+R\Lambda_kR^{-1})RD^kU\tag{3}Ak=QR(E+Λk​)DkU=Q(E+RΛk​R−1)RDkU(3)当 k→∞k\rightarrow\infink→∞ 时,矩阵 R(E+Λk)R(E+\Lambda_k)R(E+Λk​) 可逆,从而 R(E+Λ)R−1=E+RΛkR−1R(E+\Lambda)R^{-1}=E+R\Lambda_kR^{-1}R(E+Λ)R−1=E+RΛk​R−1 可逆,对其进行QR分解,有E+RΛkR−1=Qk′Rk′E+R\Lambda_kR^{-1}=Q_k'R_k'E+RΛk​R−1=Qk′​Rk′​从而 (3)(3)(3) 式写为Ak=(QQk′)(Rk′RDkU)(4)A^k=(QQ_k')(R_k'RD^kU)\tag{4}Ak=(QQk′​)(Rk′​RDkU)(4)显然 (4)(4)(4) 式已经是 AAA 的QR分解,为确保唯一性,引入对角阵D∗=diag{±1,±1,⋯,±1}D^*=diag\{\pm1,\pm1,\cdots,\pm1\}D∗=diag{±1,±1,⋯,±1}将 (4)(4)(4) 写为Ak=(QQk′D∗)(D∗Rk′RDkU)(5)A^k=(QQ_k'D^*)(D^*R_k'RD^kU)\tag{5}Ak=(QQk′​D∗)(D∗Rk′​RDkU)(5)可得Qk~=QQk′D∗\tilde{Q_k}=QQ_k'D^*Qk​~​=QQk′​D∗Rk~=D∗Rk′RDkU\tilde{R_k}=D^*R_k'RD^kURk​~​=D∗Rk′​RDkU因此 Ak+1=(Q1Q2⋯Qk)TA1(Q1Q2⋯Qk)=(Qk~)TAQk~=D∗(Qk′)TQTAQQk′D∗(6)A_{k+1}=(Q_1Q_2\cdots Q_k)^TA_1(Q_1Q_2\cdots Q_k)=\Big(\tilde{Q_k}\Big)^TA\tilde{Q_k}=D^*\Big(Q_k'\Big)^TQ^TAQQ_k'D^*\tag{6}Ak+1​=(Q1​Q2​⋯Qk​)TA1​(Q1​Q2​⋯Qk​)=(Qk​~​)TAQk​~​=D∗(Qk′​)TQTAQQk′​D∗(6)因为 A=XDX−1,X=QRA=XDX^{-1},X=QRA=XDX−1,X=QR,所以 QTAQ=RDR−1Q^TAQ=RDR^{-1}QTAQ=RDR−1,因此 (6)(6)(6) 式可以写为Ak+1=D∗(Qk′)T(RDR−1)Qk′D∗(7)A_{k+1}=D^*\Big(Q_k'\Big)^T(RDR^{-1})Q_k'D^*\tag{7}Ak+1​=D∗(Qk′​)T(RDR−1)Qk′​D∗(7)记 R0=RDR−1,gk=Qk′D∗R_0=RDR^{-1},g_k=Q_k'D^*R0​=RDR−1,gk​=Qk′​D∗R0[i,i]=λiR_0[i,i]=\lambda_iR0​[i,i]=λi​所以 (7)(7)(7) 式可以写为Ak+1=gkTR0gk(8)A_{k+1}=g_k^TR_0g_k\tag{8}Ak+1​=gkT​R0​gk​(8)由于(E+Λk→E)⇒(R(E+Λ)R−1=E+RΛkR−1→E)\Big(E+\Lambda_k\rightarrow E\Big)\Rightarrow \Big(R(E+\Lambda)R^{-1}=E+R\Lambda_kR^{-1}\rightarrow E\Big)(E+Λk​→E)⇒(R(E+Λ)R−1=E+RΛk​R−1→E)所以 Qk′→EQ'_k\rightarrow EQk′​→E,所以gk→D∗=diag{±1,±1,⋯,±1}g_k\rightarrow D^*=diag\{\pm1,\pm1,\cdots,\pm1\}gk​→D∗=diag{±1,±1,⋯,±1}所以 k→∞k\rightarrow\infink→∞ 时,lim⁡Ak+1[i,i]=λi,i=1,2,⋯,n\lim A_{k+1}[i,i]=\lambda_i~,~i=1,2,\cdots,nlimAk+1​[i,i]=λi​ , i=1,2,⋯,n其收敛速度由 ∣∣Λk∣∣∞||\Lambda_k||_{\infin}∣∣Λk​∣∣∞​ 决定,有上限∣∣Λk∣∣∞≤C⋅max⁡j∈[1,n−1]∣λj+1λj∣k||\Lambda_k||_{\infin}≤C·\max_{j\in[1,n-1]}\Big|\frac{\lambda_{j+1}}{\lambda_j}\Big|^k∣∣Λk​∣∣∞​≤C⋅j∈[1,n−1]max​∣∣∣​λj​λj+1​​∣∣∣​k
  • 上述收敛速度定义式 rn=∣λn/λn−1∣r_n=|\lambda_n/\lambda_{n-1}|rn​=∣λn​/λn−1​∣ 与幂法中的收敛速度定义式相似度极高,当 rn≈1r_n\approx1rn​≈1 时收敛极慢,可以效仿幂法中采取原点位移策略,即对于矩阵 A−s⋅EA-s·EA−s⋅E 使用QR分解,那么收敛速度即为 rn∗=∣λn−sλn−1−s∣r_n^*=\Big|\frac{\lambda_n-s}{\lambda_{n-1}-s}\Big|rn∗​=∣∣∣​λn−1​−sλn​−s​∣∣∣​上述算法称为带原点位移的QR迭代算法

【Reference】UTEP-Math 5330.










  • 逻辑极度清晰,可惜我弄丢了上述Lecture Note的网址,关于Householder变换可以参考《Householder变换》。
  • 另外注意到Note中讨论了 a11=a112+a212+⋯+an12=0a_{11}=\sqrt{a_{11}^2+a_{21}^2+\cdots+a_{n1}^2}=0a11​=a112​+a212​+⋯+an12​​=0 的情况,不难发现上述等式成立意味着 ai1=0,i=1,2,⋯,na_{i1}=0,i=1,2,\cdots,nai1​=0,i=1,2,⋯,n,那么 AAA 是奇异矩阵,无法进行QR分解。
  • 第一个重点是 Algorithm3.1 的伪代码,一般情况下我们假定 AAA 是 nnn 阶非奇异阵,即 m=nm=nm=n,伪代码中 β\betaβ 是当次迭代列向量的模值,γ\gammaγ 是向量 vvv 的分母,后续计算出向量 vvv 以及对应的豪氏矩阵 Hv=E−2vvTH_v=E-2vv^THv​=E−2vvT与矩阵 AAA 进行左乘 A1=HvA0A_1=H_vA_0A1​=Hv​A0​,变量 QQQ 初值是 EmE_mEm​ 单位阵,迭代过程中对 HvH_vHv​ 左乘,所以最终停止时 Q=∏i=1n−1HiQ=\prod_{i=1}^{n-1}H_iQ=i=1∏n−1​Hi​即为QR分解中 A=QRA=QRA=QR 的 【QQQ】,而此时保存 AAA 的单元被 【RRR】所覆盖。
  • 11-13行代码作用是在矩阵本身已是上三角化时直接进行下一次迭代。这篇Note的一个特点是,开篇已经假定 AAA 是非奇异阵,但后续的分析和伪码又是针对 A∈Rm×nA\in R^{~m\times n}A∈R m×n 考虑的,个人猜测是出于算法健壮性。
  • Note的最后一部分给出了基于Householder变化进行QR分解复杂度分析:

  • 上半部分关于 AAA 阵迭代无需显式计算豪氏矩阵以及 QQQ 阵迭代的浮点运算 flops 挺靠谱的,后半部分关于整个算法的复杂度分析持保留态度,尤其是最后给出的 23r3\frac23r^332​r3,这里不妨认为 r=min⁡m=n(m,n)=nr=\min_{m=n}(m,n)=nr=m=nmin​(m,n)=n那么复杂度为 23r3\frac23r^332​r3,但这个已经出现 4p24p^24p2 项,求和后应为 43r3\frac43r^334​r3,个人倾向于这个答案,大致的 O(n3)O(n^3)O(n3) 是无疑的。
  • 给出结果为 43n3\frac43n^334​n3 的文献如下,来自UTexas(这俩名字应该是一个学校吧):


Summary.

  • 需要明确的是,第四部分内容是对于QR分解以及基于 Householder变换实现QR分解的,并不是用于求解矩阵全部特征值的QR迭代法。
  • 存疑】QR迭代法思路之一就是在迭代公式中使用Householder变换实现每一次迭代的QR分解,使用Householder变换进行QR分解的时间复杂度为 23n3\frac23n^332​n3,大约是第一部分构造性证明中使用Givens变换的 23\frac2332​ 倍。
  • 另一种QR迭代法的思路是首先使用Householder变换,将一般实矩阵(实对称矩阵)约化为上海森伯格矩阵(对称三对角矩阵),而后再进行QR迭代,这样做的优势在于可以使用对于稀疏矩阵较为高效的Givens变换阵(常数时间即可计算出)实现QR分解,而无需使用需要 n2n^2n2 才能计算出的豪斯荷尔德矩阵。

  • 亟待解决】直接使用Householder变换进行的QR分解时间复杂度,有文献表明是 43n3\frac43n^334​n3,也有文献认为是 23n3\frac23n^332​n3,个人倾向于前一种说法,理由在上面。
  • 另外的两种QR分解方法,格拉姆-施密特正交化GS(以及修正格拉姆-施密特正交化MGS)和吉文斯变换,其复杂度也为 O(n3)O(n^3)O(n3),有说法认为前者的常数因子为 111,后者为 43.\frac43.34​.
  • 使用豪斯荷尔德变换将实矩阵约化为上Hessenberg矩阵需要的乘法次数:53n3.\frac53n^3.35​n3.
  • 那么下图中的说法就不能成立:

【NA】基于QR分解的特征值迭代法相关推荐

  1. 基于QR分解迭代求解方阵特征值和特征向量

    基于QR分解迭代求解方阵特征值和特征向量 一.特征值与特征向量求解的难点 线性代数的知识告诉我们如果要求一个方阵的特征值,只需要求解如下的特征方程的根即可: f ( λ ) = ( λ − λ 1 ) ...

  2. Julia 矩阵QR分解和特征值

    Julia 矩阵QR分解和特征值 前言 1. 施密特正交 (1) 利用施密特正交求出正交矩阵Q (2) 求出上三角矩阵R (3) 改进的消减QR分解 2. 完全QR分解 3. 矩阵QR分解的作用 (1 ...

  3. 双步位移求解特征值matlab,数值分析——带双步位移的QR分解求特征值算法

    C语言实现数值分析中带双步位移的QR分解求特征值算法. 数 值 分 析(B) 大 作 业(二) 1.算法设计: ①矩阵的拟上三角化: 对实矩阵A进行相似变换化为拟上三角矩阵A(n 1),其变换矩阵采用 ...

  4. 人工智能里的数学修炼 | 矩阵的花样分解:特征值分解(EVD)、相似对角化、QR分解、Schur分解、奇异值分解(SVD)的概念纠缠与详解

    前言 在高等代数里,矩阵分解是一个十分基础与重要的内容,任何一个学校对于理工科的研究生教育都会开设相应的课程,如:矩阵分析.矩阵论.线性系统等.看了不少社区的问答.笔记和博客,在它们的基础上加入一些自 ...

  5. 数值分析中的QR分解及其代码实现

    QR分解 若 A∈Cm×k A ∈ C m × k A\in C^{m×k} 是一个列满秩的矩阵,rank(A) = k,则矩阵A 可以分解为 A=QR A = Q R A = QR , Q∈Cm×k ...

  6. 5.12 QR分解的阻尼倒数法和正则化方法区别

    5.12 QR分解的阻尼倒数法和正则化方法区别 基于QR分解的阻尼倒数法目的是改善矩阵 AAA 的病态,正则化方法目的也是改善矩阵 AAA 的病态.区别是阻尼倒数法能获得稀疏解,即最优解分量趋近 00 ...

  7. 斯密特正交化进行QR分解

    矩阵类: #include<iostream> #include <stdlib.h> #include <math.h> #define iter 60 //迭代 ...

  8. 基于Householder变换的QR分解

    01.function [Q,R]=qrhs(A)02.% 基于Householder变换,将<strong><span style="color:#993399;&quo ...

  9. 基于Givens变换的QR分解

    01.function [Q,R]=qrgv(A)02.% 基于Givens变换,将方阵A分解为A=QR,其中Q为正交矩阵,R为上三角阵03.%04.% 参数说明05.% A:需要进行QR分解的方阵0 ...

最新文章

  1. 一次 MySQL 千万级大表的优化过程
  2. Cordova:安卓启动页图片变形
  3. chrome动态ip python_用Python爬虫爬取动态网页,附带完整代码,有错误欢迎指出!...
  4. junit测试类叫什么名字_使用Junit测试名称
  5. java并行计算同步返回_Java大文本并行计算实现过程解析
  6. 作者:张思思(1985-),女,博士,中国科学院北京基因组研究所生命与健康大数据中心工程师...
  7. 利用ptrace和memfd_create混淆程序名和参数
  8. 牛客网暑期ACM多校训练营(第五场): F. take(期望+线段树)
  9. 企业级应用架构(二)三层架构之数据访问层的封装与抽象
  10. php 二进制 保存文件,PHP打开一个二进制文件,修改了内容如何再保存回去呢?...
  11. 大数据MongoDB之NoSQL的CAP定理和BASE原则是什么?
  12. android 不限速迅雷,迅雷不限速分享(手机+PC端打包) – 长期更新
  13. 黑马JAVA P136 斗地主游戏
  14. 解决:在ubuntu下安装R语言ks包时的error:configuration failed for package ‘rgl’
  15. Moebius for SQL Server集群
  16. POJ 1008 玛雅日历
  17. Unity 获取Android手机返回键Home按键信息
  18. godaddy plesk mysql 连接 2014_GoDaddy Plesk主机安装Discuz论坛需要注意的问题 | Godaddy美国主机中文指南...
  19. Java代理模式(Cglib)代理模式
  20. CTF_ctfshow_签退

热门文章

  1. 九联UNT413A-S905L3A-免拆U盘卡刷固件包-当贝纯净桌面-内有教程
  2. 炸弹人问题(简单版)
  3. C语言 数组插入 – 插入法排序(顺序版)
  4. 互联网迟到的80后 为什么中国出不了扎克伯格
  5. pytorch(4)Pytorch模型训练时从CPU与GPU之间的转换
  6. 初识Nginx及编译安装Nginx
  7. JsTreeの使用-yellowcong
  8. 一级计算机上机试题,计算机一级上机模拟题
  9. 3.TCP/IP协议,三次握手,四次挥手,UDP协议
  10. 计算机网络安全技术密码技术,计算机网络安全课件:密码技术与压缩技术.ppt...