【矩阵论】Chapter 6—矩阵分解知识点总结复习(附Python实现)

文章目录

    • 1 满秩分解(Full-Rank Factorization)
    • 2 三角分解(Triangular Factorization)
    • 3 正交三角分解(QR Factorization)
    • 4 奇异值分解(SVD)

1 满秩分解(Full-Rank Factorization)

  • 满秩分解定理

    m × n m\times n m×n矩阵 A A A的秩为 r > 0 r>0 r>0,则存在 m × r m\times r m×r矩阵 B B B(列满秩矩阵)和 r × n r\times n r×n矩阵 C C C(行满秩矩阵)使得
    A = B C A=BC A=BC
    并且 r a n k ( B ) = r a n k ( C ) = r rank(B)=rank(C)=r rank(B)=rank(C)=r

    满秩分解不唯一

    定理:设 A A A m × n m\times n m×n矩阵,且 r a n k ( A ) = r rank(A)=r rank(A)=r,存在 m m m阶可逆矩阵 P P P n n n阶可逆矩阵 Q Q Q,使得 A = P [ I r 0 0 0 ] Q A=P\begin{bmatrix}I_r & 0 \\ 0 & 0\end{bmatrix}Q A=P[Ir000]Q

    证明满秩分解定理:

    ∵ [ I r 0 0 0 ] = [ I r 0 ] [ I r 0 ] \because \begin{bmatrix}I_r & 0 \\ 0 & 0\end{bmatrix}=\begin{bmatrix}I_r \\ 0\end{bmatrix}\begin{bmatrix}I_r & 0\end{bmatrix} [Ir000]=[Ir0][Ir0]

    ∴ A = P [ I r 0 ] [ I r 0 ] Q \therefore A=P\begin{bmatrix}I_r \\ 0\end{bmatrix}\begin{bmatrix}I_r & 0\end{bmatrix}Q A=P[Ir0][Ir0]Q

    则令 P [ I r 0 ] = B P\begin{bmatrix}I_r \\ 0\end{bmatrix}=B P[Ir0]=B [ I r 0 ] Q = C \begin{bmatrix}I_r & 0\end{bmatrix}Q=C [Ir0]Q=C,可得到 A = B C A=BC A=BC

    ∵ \because P , C P,C P,C是可逆矩阵, B B B r r r个列是 P P P的前 r r r列; C C C r r r个行是 Q Q Q的前 r r r

    ∴ \therefore r a n k ( B ) = r a n k ( C ) = r rank(B)=rank(C)=r rank(B)=rank(C)=r

  • 满秩分解步骤

    1. A A A m × n m\times n m×n矩阵,首先求 r a n k ( A ) rank(A) rank(A)
    2. A A A j 1 , j 2 , . . . j r j_1,j_2,...j_r j1,j2,...jr列构成 B m × r B_{m\times r} Bm×r
    3. A A AHermite标准型(即行最简行矩阵) H H H的前 r r r行构成矩阵 C r × n C_{r\times n} Cr×n
    4. A = B C A=BC A=BC就是矩阵 A A A的一个满秩分解
  • Python求解满秩分解

    import numpy as np
    from sympy import Matrix'''
    Full-Rank Factorization
    @params: A Matrix
    @return: F, G Matrix
    '''
    def full_rank(A):r = A.rank()A_arr1 = np.array(A.tolist())# 求解A的最简行阶梯矩阵,要转换成list,再转换成arrayA_rref = np.array(A.rref()[0].tolist())k = [] # 存储被选中的列向量的下标# 遍历A_rref的行for i in range(A_rref.shape[0]):# 遍历A_rref的列for j in range(A_rref.shape[1]):# 遇到1就说明找到了A矩阵的列向量的下标# 这些下标的列向量组成F矩阵,然后再找下一行if A_rref[i][j] == 1:k.append(j)break# 通过选中的列下标,构建F矩阵       B = Matrix(A_arr1[:,k])# G就是取行最简行矩阵A的前r行构成的矩阵C = Matrix(A_rref[:r])return B, Cif __name__ == "__main__":# 表示矩阵AA = np.array([[1, 1, 0], [0, 1, 1], [-1, 0, 0], [1, 1, 1]])A = Matrix(A)B, C = full_rank(A)print("B:", B)print("C:", C)
    

2 三角分解(Triangular Factorization)

  • L U LU LU分解定义

    如果有一个矩阵 A A A,我们能表示下三角矩阵 L L L和上三角矩阵 U U U的乘积,称为 A A A的三角分解或 L U LU LU分解。

    img

    更进一步,我们希望下三角矩阵的对角元素都为 1 1 1

    img

  • L U LU LU分解定理

    A A A是== n n n阶非奇异矩阵==,则存在唯一的单位下三角矩阵 L L L和上三角矩阵 U U U使得 A = L U A=LU A=LU的充分必要条件是 A A A的所有顺序主子式均非零(这一条件保证了对角线元素非零),即 Δ k ≠ 0 ( k = 1 , . . . , n − 1 ) \Delta_k\neq 0(k=1,...,n-1) Δk=0(k=1,...,n1)

  • L U LU LU分解步骤

    A A A n × n n\times n n×n矩阵

    1. 进行初等行变换(注意:不涉及行交换的初等变换),从第 1 1 1行开始,到第 n n n行结束。将第 i i i行第 i i i列以下的元素全部消为 0 0 0
    2. 这样操作后得到的矩阵即为 U U U
    3. 构造对角线元素全为 1 1 1的单位下三角矩阵 L L L L L L的剩余元素通过构建方程组的形式来求解。
  • Python求解 L U LU LU分解

  • L U LU LU分解的实际意义

    • 解线性方程组

      假设我们有一个线性方程组 A x = b Ax=b Ax=b,其中 A A A是一个非奇异矩阵,而 b b b是一个列向量。通过 L U LU LU分解,我们可以将方程组转化为两个简化的方程组 L y = b Ly=b Ly=b U x = y Ux=y Ux=y,其中 L L L是下三角矩阵, U U U是上三角矩阵。这两个方程组分别易于求解。

      具体:

      首先,通过前代法(forward substitution)解 L y = b Ly=b Ly=b,然后通过回代法(backward substitution)解 U x = y Ux=y Ux=y。这样,我们就得到了方程组的解。

  • L D U LDU LDU分解定理

    A A A是== n n n阶非奇异矩阵==,则存在唯一的单位下三角矩阵 L L L,对角矩阵 D = d i a g ( d 1 , d 2 , . . . , d n ) D=diag(d_1,d_2,...,d_n) D=diag(d1,d2,...,dn)和上三角矩阵 U U U使得 A = L D U A=LDU A=LDU的充分必要条件是 A A A的所有顺序主子式均非零(这一条件保证了对角线元素非零),即 Δ k ≠ 0 ( k = 1 , . . . , n − 1 ) \Delta_k\neq 0(k=1,...,n-1) Δk=0(k=1,...,n1)并且 d 1 = a 11 , d k = Δ k Δ k + 1 , k = 2 , . . . , n d_1=a_{11},d_k=\frac{\Delta _k}{\Delta_{k+1}},k=2,...,n d1=a11,dk=Δk+1Δk,k=2,...,n

  • L D U LDU LDU分解步骤

    A A A n × n n\times n n×n矩阵

    1. 先求 L U LU LU分解
    2. U U U的对角线元素提出来构成对角矩阵 D D D
    3. U U U中的元素 u i j u_{ij} uij除以 d i d_i di,其中 d i d_i di表示第 i i i个对角元素。这样操作得到变换后的 U U U
  • Python求解 L D U LDU LDU分解

    import numpy as np
    from sympy import Matrix
    import pprintEPSILON = 1e-8def is_zero(x):return abs(x) < EPSILONdef LU(A):# 断言A必须是非奇异方阵Aassert A.rows == A.cols, "Matrix A must be a square matrix"assert A.det() != 0, "Matrix A must be a nonsingular matrix"n = A.rowsU = A# 构建出U矩阵# 将U转换成list,再转换成arrayU = np.array(U.tolist())# 遍历U的每一行利用高斯消元法for i in range(n):# 判断U[i][i]是否为0assert not is_zero(U[i][i]), "主元为0,无法进行LU分解"# 对i+1行到n行进行消元for j in range(i + 1, n):# 计算消元因子factor = U[j][i] / U[i][i]# 对第j行进行消元for k in range(i, n):U[j][k] -= factor * U[i][k]# 消元后的矩阵U则是最终U矩阵U = Matrix(U)# 根据LU = A,得到L矩阵L = A * U.inv()return L, Udef LDU(A):L, U = LU(A)D = Matrix(np.diag(np.diag(U)))U = D.inv() * Ureturn L, D, Uif __name__ == '__main__':A = np.array([[2, 3, 4], [1, 1, 9], [1, 2, -6]])A = Matrix(A)'''# test LU分解L, U = LU(A)pprint.pprint("L:")pprint.pprint(L)pprint.pprint("U:")pprint.pprint(U)'''# test LDU分解L, D, U = LDU(A)pprint.pprint("L:")pprint.pprint(L)pprint.pprint("D:")pprint.pprint(D)pprint.pprint("U:")pprint.pprint(U)
    
  • P L U PLU PLU分解

    PLU 分解是将矩阵 A A A分解成一个置换矩阵 P P P、单位下三角矩阵 L L L和上三角矩阵 U U U的乘积,即
    A = P L U A=PLU A=PLU
    之前 L U LU LU分解中限制了行交换,如果不可避免的必须进行行互换,我们就需要进行 P L U PLU PLU分解。

    实际上只需要把 A = L U A = LU A=LU变成 P − 1 A = P − 1 P L U P^{-1}A = P^{-1}PLU P1A=P1PLU就可以了,实际上所有的 A = L U A = LU A=LU都可以写成 P − 1 A = L U P^{-1}A = LU P1A=LU的形式,由于左乘置换矩阵 P − 1 P^{-1} P1是在交换行的顺序,所以由 P − 1 A = P − 1 P L U P^{-1}A = P^{-1}PLU P1A=P1PLU推得适当的交换 A A A的行的顺序,即可将 A A A L U LU LU 分解。当 A A A没有行互换时, P P P就是单位矩阵。

    事实上,所有的方阵都可以写成 P L U PLU PLU 分解的形式,事实上, P L U PLU PLU 分解有很高的数值稳定性,因此实用上是很好用的工具。

    有时为了计算上的方便,会同时间换行与列的顺序,此时会将 A A A 分解成
    A = P L U Q A=PLUQ A=PLUQ
    其中 P P P L L L U U U 同上, Q Q Q 是一个置换矩阵。

3 正交三角分解(QR Factorization)

  • Q R QR QR分解定理

    A A A m × n m\times n m×n实(复)矩阵, m ≥ n m\ge n mn且其 n n n个列向量线性无关,则存在 m m m阶正交(酉)矩阵 Q Q Q n 阶 n阶 n非奇异实(复)上三角矩阵 R R R使得
    A = Q [ R 0 ] A=Q\begin{bmatrix}R \\ 0\end{bmatrix} A=Q[R0]

  • Q R QR QR分解步骤

    A A A 3 × 3 3\times 3 3×3矩阵,即 A = ( α 1 , α 2 , α 3 ) A=(\alpha_1, \alpha_2,\alpha_3) A=(α1,α2,α3)。则:

    1. 正交化: β 1 = α 1 \beta_1=\alpha_1 β1=α1 β 2 = α 2 − k 21 β 1 \beta_2=\alpha_2-k_{21}\beta_1 β2=α2k21β1 β 3 = α 3 − k 31 β 1 − k 32 β 2 \beta_3=\alpha_3-k_{31}\beta_1-k_{32}\beta_2 β3=α3k31β1k32β2,其中 k 21 = < α 2 , β 1 > < β 1 , β 1 > k_{21}=\frac{<\alpha_2,\beta_1>}{<\beta_1,\beta_1>} k21=<β1,β1><α2,β1> k 31 = < α 3 , β 1 > < β 1 , β 1 > k_{31}=\frac{<\alpha_3,\beta_1>}{<\beta_1,\beta_1>} k31=<β1,β1><α3,β1> k 31 = < α 3 , β 2 > < β 2 , β 2 > k_{31}=\frac{<\alpha_3,\beta_2>}{<\beta_2,\beta_2>} k31=<β2,β2><α3,β2>

    2. 单位化得到矩阵 Q Q Q Q = ( β 1 ∣ ∣ β 1 ∣ ∣ , β 2 ∣ ∣ β 2 ∣ ∣ , β 3 ∣ ∣ β 3 ∣ ∣ ) Q=(\frac{\beta_1}{||\beta_1||},\frac{\beta_2}{||\beta_2||},\frac{\beta_3}{||\beta_3||}) Q=(∣∣β1∣∣β1,∣∣β2∣∣β2,∣∣β3∣∣β3)

    3. 计算得到矩阵 R R R
      ( ∣ ∣ β 1 ∣ ∣ ∣ ∣ β 2 ∣ ∣ ∣ ∣ β 3 ∣ ∣ ) ( 1 k 21 k 31 1 k 32 1 ) = ( ∣ ∣ β 1 ∣ ∣ ∣ ∣ β 1 ∣ ∣ × k 21 ∣ ∣ β 1 ∣ ∣ × k 31 ∣ ∣ β 2 ∣ ∣ ∣ ∣ β 2 ∣ ∣ × k 32 ∣ ∣ β 3 ∣ ∣ ) \begin{pmatrix} ||\beta _1|| & & \\ & ||\beta _2|| & \\ & &||\beta _3|| \end{pmatrix}\begin{pmatrix} 1 & k_{21} & k_{31} \\ & 1 & k_{32} \\ & & 1 \end{pmatrix}=\begin{pmatrix} ||\beta _1|| & ||\beta _1||\times k_{21} & ||\beta _1||\times k_{31}\\ & ||\beta _2|| & ||\beta _2||\times k_{32}\\ & & ||\beta _3|| \end{pmatrix} ∣∣β1∣∣∣∣β2∣∣∣∣β3∣∣ 1k211k31k321 = ∣∣β1∣∣∣∣β1∣∣×k21∣∣β2∣∣∣∣β1∣∣×k31∣∣β2∣∣×k32∣∣β3∣∣

    4. 这样, A = Q R A=QR A=QR

  • Python求解 Q R QR QR分解

    常规计算:

    import numpy as np
    import sympy
    from sympy import Matrix
    from sympy import *
    import pprint#正交三角分解(QR)
    a = [[1, 1, -1],[-1, 1, 1],[1, 1, -1],[1, 1, 1]]# a = [[1,1,-1],
    #                   [1,0,0],
    #                   [0,1,0],
    #                   [0,0,1]]
    A_mat = Matrix(a)#α向量组成的矩阵A
    # A_gs= GramSchmidt(A_mat)
    A_arr = np.array(A_mat)
    L = []
    for i in range(A_mat.shape[1]):L.append(A_mat[:,i])
    #求Q
    A_gs = GramSchmidt(L)#α的施密特正交化得到β
    A_gs_norm = GramSchmidt(L,True)#β的单位化得到vA = []for i in range(A_mat.shape[1]):for j in range(A_mat.shape[0]):A.append(A_gs_norm[i][j])#把数排成一行A_arr = np.array(A)
    A_arr = A_arr.reshape((A_mat.shape[0],A_mat.shape[1]),order = 'F')#用reshape重新排列(‘F’为竖着写)
    #得到最后的Q
    Q = Matrix(A_arr)#求RC = []
    for i in range(A_mat.shape[1]):for j in range(A_mat.shape[1]):if i > j:C.append(0)elif i == j:t = np.array(A_gs[i])m = np.dot(t.T,t)C.append(sympy.sqrt(m[0][0]))else:t = np.array(A_mat[:,j])x = np.array(A_gs_norm[i])n = np.dot(t.T,x)
    #             print(n)C.append(n[0][0])
    # C_final为R          
    C_arr = np.array(C)
    # print(C_arr)
    C_arr = C_arr.reshape((A_mat.shape[1],A_mat.shape[1]))
    R = Matrix(C_arr)pprint.pprint("Q:")
    pprint.pprint(Q)
    pprint.pprint("R:")
    pprint.pprint(R)
    

    调用库函数

    # 求矩阵A的QR分解,保留根号
    Q_, R_ = A_mat.QRdecomposition()
    pprint.pprint("Q_:")
    pprint.pprint(Q_)
    pprint.pprint("R_:")
    pprint.pprint(R_)
    assert Q_ == Q, "Q_ != Q"
    assert R_ == R, "R_ != R"
    

4 奇异值分解(SVD)

  • S V D SVD SVD定理

    A A A m × n m\times n m×n矩阵,且 r a n k ( A ) = r rank(A)=r rank(A)=r,则存在 m m m阶酉矩阵 U U U n n n阶酉矩阵 V V V使得
    A = U [ Σ 0 0 0 ] V H A=U\begin{bmatrix}\Sigma & 0\\ 0 & 0 \end{bmatrix}V^H A=U[Σ000]VH
    其中 Σ = d i a g ( σ 1 , . . . , σ r ) \Sigma=diag(\sigma_1,...,\sigma_r) Σ=diag(σ1,...,σr),且 σ 1 ≥ . . . ≥ σ r > 0 \sigma_1\geq ...\geq \sigma_r>0 σ1...σr>0

    σ \sigma σ A A A的奇异值,具体含义这里不在叙述,但需要记住的是 σ 2 \sigma^2 σ2 A H A A^HA AHA的特征值,也是 A A H AA^H AAH的特征值,且:

    1. A H A A^HA AHA A A H AA^H AAH的特征值均为非负数
    2. A H A A^HA AHA A A H AA^H AAH的非零特征值相同,并且非零特征值的个数(重特征值按重数计算)等于 r a n k ( A ) rank(A) rank(A)

    所以我们求 Σ \Sigma Σ就转换成求这两个矩阵其中一个的特征值。

  • S V D SVD SVD分解步骤

    1. A H A A^HA AHA n n n个特征值,即计算 ∣ λ I − A H A ∣ = 0 |\lambda I-A^HA|=0 λIAHA=0。得到特征值: λ 1 , . . . , λ r , λ r + 1 = 0 , . . . , λ n = 0 \lambda_1,...,\lambda_r,\lambda_{r+1}=0,...,\lambda_n=0 λ1,...,λr,λr+1=0,...,λn=0,其中 r = r a n k ( A ) r=rank(A) r=rank(A)

    2. r r r个奇异值(即非零特征值开根号)从大到小排列组成对角矩阵,再添加额外的 0 0 0构成 Σ m × n \Sigma_{m\times n} Σm×n矩阵。
      Σ m × n = ( λ 1 . . . 0 0 0 0 λ 2 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . λ r . . . 0 . . . 0 0 0 ) \Sigma_{m\times n}=\begin{pmatrix} \sqrt[]{\lambda _1} & ... & 0&0&0 \\ 0& \sqrt[]{ \lambda _2} & 0 &0&0\\ ...& ... & ... &...&...\\ ...& ... & ... &\sqrt[]{\lambda_r}&...\\ 0& ... & 0 &0&0 \end{pmatrix} Σm×n= λ1 0......0...λ2 .........00......000...λr 000......0

    3. 求特征值: λ 1 , . . . , λ r , λ r + 1 = 0 , . . . , λ n = 0 \lambda_1,...,\lambda_r,\lambda_{r+1}=0,...,\lambda_n=0 λ1,...,λr,λr+1=0,...,λn=0对应的特征向量 ξ 1 , . . . , ξ n \xi_1,...,\xi_n ξ1,...,ξn:当 λ = λ 1 \lambda=\lambda_1 λ=λ1时, ( λ I − A H A ) × ξ 1 = 0 (\lambda I-A^HA)\times \xi_1=0 (λIAHA)×ξ1=0,解得 ξ 1 \xi_1 ξ1,同理,计算其余特征向量。

    4. 因为 ξ 1 , . . . , ξ n \xi_1,...,\xi_n ξ1,...,ξn相互正交,我们还需要进行单位化,得到 v 1 , . . . , v n v_1,...,v_n v1,...,vn,即 v 1 = ξ 1 ∣ ∣ ξ 1 ∣ ∣ , . . . , v n = ξ n ∣ ∣ ξ n ∣ ∣ v_1=\frac{\xi_1}{||\xi_1||},...,v_n=\frac{\xi_n}{||\xi_n||} v1=∣∣ξ1∣∣ξ1,...,vn=∣∣ξn∣∣ξn。则 V = ( v 1 , . . . , v n ) V=(v_1,...,v_n) V=(v1,...,vn)

    5. 根据 A = U m × m Σ m × n V n × n H A=U_{m\times m}\Sigma_{m\times n}V_{n\times n}^H A=Um×mΣm×nVn×nH,可得 U 1 = A V n × n Σ r × n − 1 U_1=AV_{n\times n}\Sigma_{r\times n}^{-1} U1=AVn×nΣr×n1(注意, σ \sigma σ此时为 Σ m × n \Sigma_{m\times n} Σm×n的前 r r r行),易知 U 1 U_1 U1 m × r m\times r m×r的矩阵,我们还需要扩充 U 2 U_2 U2,其为 m × ( m − r ) m\times (m-r) m×(mr)矩阵。

    6. U 1 H U 2 = 0 U_1^HU_2=0 U1HU2=0,取 U 2 U_2 U2,必须要单位化 U 2 U_2 U2,这样 U = [ U 1 : U 2 ] U=[U_1:U_2] U=[U1:U2]

    7. A = U m × m [ Σ 0 0 0 ] m × n V n × n H A=U_{m\times m}\begin{bmatrix}\Sigma & 0\\ 0 & 0 \end{bmatrix}_{m\times n}V_{n\times n}^H A=Um×m[Σ000]m×nVn×nH

  • Python求解奇异值分解

    import numpy as np
    from sympy import Matrix
    import pprintA = np.array([[1,0],[0,1],[1,1]])
    # 求A的奇异值分解
    U, sigma, VT = np.linalg.svd(A)
    print ("U:", U)
    print ("sigma:", sigma)
    print ("VT:", VT)
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/212153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react.js源码二

三、调度Scheduler scheduling(调度)是fiber reconciliation的一个过程&#xff0c;主要决定应该在何时做什么?在stack reconciler中&#xff0c;reconciliation是“一气呵成”&#xff0c;对于函数来说&#xff0c;这没什么问题&#xff0c;因为我们只想要函数的运行结果&…

什么是CDN?用了CDN一定会更快吗?

文章目录 前言CDN是什么?CDN的工作原理为什么要加个CNAME那么麻烦&#xff1f;怎么知道哪个服务器IP里调用方最近&#xff1f; 回源是什么回源是什么&#xff1f;那还有哪些情况会发生回源呢&#xff1f; 怎么判断是否发生回源用了CDN一定比不用的更快吗&#xff1f;什么情况下…

光伏电站全貌

光伏电站 简介 每一篇文章开篇我都会写一个内容简介&#xff0c;一来梳理自己的写作思路&#xff0c;二来方便读者整体了解文章写作意图和脉络。本篇是新能源方面的开篇之作&#xff0c;我选取了介绍光伏电站基础知识&#xff0c;首先我们要了解光伏电站基础分类&#xff0c;然…

Copilot的11个新功能,你不能错过!

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 文章目录 1. PowerPoint2. Excel3. One Note4. Word5. 必应聊天现在变为Copilot6. GPT-4为Copilot聊天提供动力7. Microsoft Teams8. Outlook9. Copilot Studio10.…

磁盘存储器

目录 1.1 磁盘存储器1.2 磁盘的性能指标1.3 磁盘存储器(续)1.4 磁盘阵列 \quad \quad \quad 左南右北为0 左北右南为1 \quad \quad 1.1 磁盘存储器 \quad 磁盘的驱动器 \quad 磁盘的控制器 \quad 主机每次对磁盘进行读和写操作都是以扇区为单位的 现在比较流行的是SATA标准 \…

【kafka实践】12|如何实现exactly once

前面的章节中我们聊到如何避免保证消息丢失&#xff0c;没有印象的同学可以再看看&#xff0c;本节我们将展开如何实现kafka的一次精确。 首先我们需要明白两个概念“幂等”和“事物” 幂等 “幂等”这个词原是数学领域中的概念&#xff0c;指的是某些操作或函数能够被执行多…

基于SpringBoot 2+Layui实现的管理后台系统源码+数据库+安装使用说明

springboot-plus 一个基于SpringBoot 2 的管理后台系统,包含了用户管理&#xff0c;组织机构管理&#xff0c;角色管理&#xff0c;功能点管理&#xff0c;菜单管理&#xff0c;权限分配&#xff0c;数据权限分配&#xff0c;代码生成等功能 相比其他开源的后台系统&#xff0…

vue 实现返回顶部功能-指定盒子滚动区域

vue 实现返回顶部功能-指定盒子滚动区域 html代码css代码返回顶部显示/隐藏返回标志 html代码 <a-icontype"vertical-align-top"class"top"name"back-top"click"backTop"v-if"btnFlag"/>css代码 .top {height: 35px;…

令牌桶算法理解学习(限流算法)

令牌桶算法是网络流量整形&#xff08;Traffic Shaping&#xff09;和速率限制&#xff08;Rate Limiting&#xff09;中最常使用的一种算法。典型情况下&#xff0c;令牌桶算法用来控制发送到网络上的数据的数目&#xff0c;并允许突发数据的发送。 用简单的话语来说就是限制…

Linux中的SNAT与DNAT实践

Linux中的SNAT与DNAT实践 1、SNAT的介绍1.1&#xff0c;SNAT概述1.2&#xff0c;SNAT源地址转换过程1.3&#xff0c;SNAT转换 2、DNAT的介绍2.1&#xff0c;DNAT概述2.2&#xff0c;DNAT转换前提条件2.3&#xff0c;DNAT的转换 3、防火墙规则的备份和还原4、tcpdump抓包工具的运…

腾讯再推互动微短剧,游戏的风吹向了短剧

当你看剧时不再拥有上帝视角&#xff0c;处在女主的位置上&#xff0c;你又会做出什么样的选择&#xff1f; 腾讯最新上线的短剧《摩玉玄奇2》在原版之外还推出了互动版&#xff0c;就给出了这样一个新玩法。 《摩玉玄奇2》原版是普通的后宫职场微短剧&#xff0c;互动版则是…

虚拟机VMware安装centos以及配置网络

目录 1、CentOS7的下载2、CentOS7的配置3、CentOS7的安装4、CentOS7的网络配置 4.1、自动获取IP4.2、固定获取IP 5、XShell连接CentO 准备工作&#xff1a;提前下载和安装好VMware。VMware的安装可以参考这一篇文章&#xff1a;VMware15的下载及安装教程。 1、CentOS7的下载 …

从零开始搭建企业管理系统(五):统一响应结果和全局异常处理

统一响应结果和全局异常处理 前言统一响应结果定义响应结构定义响应对象定义响应状态对象统一返回响应对象定义 Controller 拦截类 全局异常处理 前言 做个功能之前我们想一下为什么要做统一响应结果和全局异常处理呢&#xff1f; 这是因为我们的项目采用的是前后端分离开发&am…

LVGL | Demo实例使用说明

LVGL | Demo实例使用说明 时间&#xff1a;2023年12月10日21:51:17 文章目录 LVGL | Demo实例使用说明Demos for LVGLAdd the examples to your projectsDemosWidgetsMusic playerKeypad and encoderBenchmarkStress Contributing Demos for LVGL Add the examples to your p…

基于SSM的酒店管理旅店系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

【软件测试】年薪30万跟年薪15万的面试有些什么区别?

1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 参考答案&#xff1a; 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行&#xff0c;即是通常说的软件的可移植性。 兼容的类型&#xff0c;如果细分的话&#xff0c;有平台的兼容…

Numpy数组中数据的排序【sort(),argsort()与 lexsort()】 (第13讲)

Numpy数组中数据的排序【sort(),argsort()与 lexsort()】 (第13讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

【C++ 程序设计入门基础】- 第3节-循环结构02

目录 while 语句 案例 while 循环 输入一个整数 n &#xff0c;输出 1~n 的所有整数。 查看运行结果&#xff1a; while 语句结构解析 do while 语句 案例 do while 循环 输入一个整数n&#xff0c;输出1&#xff5e;n的所有整数。 查看运行结果 while、do while的区别 …

SpringSecurity6 | 登录成功后的JSON处理

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

Android:java.lang.SecurityException: Provider must not be exporte

java.lang.SecurityException: Provider must not be exporte 解决方案 首先在AndroidManifest.xml中添加provider android:authorities&#xff1a; 是用来标识provider的唯一标识&#xff0c;在同一部手机上一个"authority"串只能被一个app使用&#xff0c;冲突的话…