zoukankan      html  css  js  c++  java
  • MATLAB矩阵运算(3)

    1.3.9  特征值问题的QZ分解

    函数  qz

    格式  [AA,BB,Q,Z,V] = qz(A,B)       %A、B为方阵,产生上三角阵AA和BB,正交矩阵Q、Z或其列变换形式,V为特征向量阵。且满足:Q*A*Z= AA 和Q*B*Z = BB。

    [AA,BB,Q,Z,V] = qz(A,B,flag)   %产生由flag决定的分解结果,flag取值为:'complex':表示复数分解(默认),取值为'real':表示实数分解。

    1.3.10  海森伯格形式的分解

    如果矩阵H的第一子对角线下元素都是0,则H为海森伯格(Hessenberg)矩阵。如果矩阵是对称矩阵,则它的海森伯格形式是对角三角阵。MATLAB可以通过相似变换将矩阵变换成这种形式。

    函数  hess

    格式  H = hess(A)      %返回矩阵A的海森伯格形式

    [P,H] = hess(A)   %P为酉矩阵,满足:A = PHP' 且P'P = eye(size(A))。

    例1-75 

    >> A=[-149 -50 -154;537 180 546;-27 -9 -25];

    >> [P,H]=hess(A)

    P =

       1.0000         0         0

            0   -0.9987    0.0502

            0    0.0502    0.9987

    H =

    -149.0000   42.2037 -156.3165

    -537.6783  152.5511 -554.9272

           0    0.0728    2.4489

    H的第一子对角元素是H(3,1)=0。

                                                                                                                               1.4  线性方程的组的求解

    我们将线性方程的求解分为两类:一类是方程组求唯一解或求特解,另一类是方程组求无穷解即通解。可以通过系数矩阵的秩来判断:

    若系数矩阵的秩r=n(n为方程组中未知变量的个数),则有唯一解;

    若系数矩阵的秩r<n,则可能有无穷解;

    线性方程组的无穷解 = 对应齐次方程组的通解+非齐次方程组的一个特解;其特解的求法属于解的第一类问题,通解部分属第二类问题。

    1.4.1  求线性方程组的唯一解或特解(第一类问题)

    这类问题的求法分为两类:一类主要用于解低阶稠密矩阵 —— 直接法;另一类是解大型稀疏矩阵 —— 迭代法。

    1.利用矩阵除法求线性方程组的特解(或一个解)

    方程:AX=b

    解法:X=A\b

    例1-76  求方程组 的解。

    解:

    >>A=[5  6  0  0  0

         1  5  6  0  0

         0  1  5  6  0   

         0  0  1  5  6

         0  0  0  1  5];

    B=[1 0 0 0 1]';

    R_A=rank(A)   %求秩

    X=A\B    %求解

    运行后结果如下

    R_A =

          5

    X =

        2.2662

       -1.7218

        1.0571

       -0.5940

        0.3188

    这就是方程组的解。

    或用函数rref求解:

    >> C=[A,B]   %由系数矩阵和常数列构成增广矩阵C

    >> R=rref(C)   %将C化成行最简行

    R =

        1.0000         0         0         0         0    2.2662

             0    1.0000         0         0         0   -1.7218

             0         0    1.0000         0         0    1.0571

             0         0         0    1.0000         0   -0.5940

             0         0         0         0    1.0000    0.3188

    则R的最后一列元素就是所求之解。

    例1-77  求方程组 的一个特解。

    解:

    >>A=[1 1 -3 -1;3 -1 -3 4;1 5 -9 -8];

    >>B=[1  4  0]';

    >>X=A\B   %由于系数矩阵不满秩,该解法可能存在误差。

    X =[ 0  0  -0.5333  0.6000]’(一个特解近似值)。

    若用rref求解,则比较精确:

    >> A=[1 1 -3 -1;3 -1 -3 4;1 5 -9 -8];

    B=[1  4  0]';

    >> C=[A,B];    %构成增广矩阵

    >> R=rref(C)

    R =

        1.0000         0   -1.5000    0.7500    1.2500

             0    1.0000   -1.5000   -1.7500   -0.2500

             0         0         0         0         0

    由此得解向量X=[1.2500  – 0.2500  0  0]’(一个特解)。

    2.利用矩阵的LU、QR和cholesky分解求方程组的解

    (1)LU分解:

    LU分解又称Gauss消去分解,可把任意方阵分解为下三角矩阵的基本变换形式(行交换)和上三角矩阵的乘积。即A=LU,L为下三角阵,U为上三角阵。

    则:A*X=b        变成L*U*X=b

    所以X=U\(L\b)   这样可以大大提高运算速度。

    命令  [L,U]=lu (A)

    例1-78  求方程组 的一个特解。

    解:

    >>A=[4 2 -1;3 -1 2;11 3 0];

    >>B=[2 10 8]';

    >>D=det(A)

    >>[L,U]=lu(A)

    >>X=U\(L\B)

    显示结果如下:

    D =

        0

    L =

        0.3636   -0.5000    1.0000

        0.2727    1.0000         0

        1.0000         0         0

    U =

       11.0000    3.0000         0

             0   -1.8182    2.0000

             0         0    0.0000

    Warning: Matrix is close to singular or badly scaled.

             Results may be inaccurate. RCOND = 2.018587e-017.

    > In D:\Matlab\pujun\lx0720.m at line 4

    X =

        1.0e+016 *

           -0.4053

            1.4862

            1.3511

    说明  结果中的警告是由于系数行列式为零产生的。可以通过A*X验证其正确性。

    (2)Cholesky分解

    若A为对称正定矩阵,则Cholesky分解可将矩阵A分解成上三角矩阵和其转置的乘积,即:   其中R为上三角阵。

    方程  A*X=b  变成 

    所以                       

    (3)QR分解

    对于任何长方矩阵A,都可以进行QR分解,其中Q为正交矩阵,R为上三角矩阵的初等变换形式,即:A=QR

    方程  A*X=b  变形成    QRX=b

    所以                    X=R\(Q\b)

    上例中  [Q, R]=qr(A)

    X=R\(Q\B)

    说明  这三种分解,在求解大型方程组时很有用。其优点是运算速度快、可以节省磁盘空间、节省内存。

    1.4.2  求线性齐次方程组的通解

    在Matlab中,函数null用来求解零空间,即满足A·X=0的解空间,实际上是求出解空间的一组基(基础解系)。

    格式  z = null         % z的列向量为方程组的正交规范基,满足 。

       % z的列向量是方程AX=0的有理基

    例1-79  求解方程组的通解:

    解:

    >>A=[1  2  2  1;2  1  -2  -2;1  -1  -4  -3];

    >>format  rat     %指定有理式格式输出

    >>B=null(A,'r')     %求解空间的有理基

    运行后显示结果如下:

    B =

           2           5/3

           -2          -4/3

           1            0

           0            1

    或通过行最简行得到基:

    >> B=rref(A)

    B =

        1.0000         0   -2.0000   -1.6667

             0    1.0000    2.0000    1.3333

             0         0         0         0

    即可写出其基础解系(与上面结果一致)。

    写出通解:

    syms  k1  k2

    X=k1*B(:,1)+k2*B(:,2)      %写出方程组的通解

    pretty(X)     %让通解表达式更加精美

    运行后结果如下:

    X =

    [  2*k1+5/3*k2]

    [ -2*k1-4/3*k2]

    [           k1]

    [           k2]

    % 下面是其简化形式

        [2k1 + 5/3k2 ]

        [              ]

        [-2k1 - 4/3k2]

        [              ]

        [      k1      ]

        [              ]

        [      k2      ]

    1.4.3  求非齐次线性方程组的通解

    非齐次线性方程组需要先判断方程组是否有解,若有解,再去求通解。

    因此,步骤为:

    第一步:判断AX=b是否有解,若有解则进行第二步

    第二步:求AX=b的一个特解

    第三步:求AX=0的通解

    第四步:AX=b的通解= AX=0的通解+AX=b的一个特解。

    例1-80  求解方程组

    解:在Matlab中建立M文件如下:

    A=[1  -2  3  -1;3  -1  5  -3;2  1  2  -2];

    b=[1  2  3]';

    B=[A b];

    n=4;

    R_A=rank(A)

    R_B=rank(B)

    format rat

    if R_A==R_B&R_A==n      %判断有唯一解

       X=A\b

    elseif R_A==R_B&R_A<n    %判断有无穷解

       X=A\b      %求特解

       C=null(A,'r')    %求AX=0的基础解系

    else X='equition no solve'     %判断无解

    end

    运行后结果显示:

    R_A =

          2     

    R_B =

          3     

    X =

    equition no solve

    说明  该方程组无解

    例1-81  求解方程组的通解:

    解法一:在Matlab编辑器中建立M文件如下:

    A=[1  1  -3  -1;3  -1  -3  4;1  5  -9  -8];

    b=[1 4 0]';

    B=[A b];

    n=4;

    R_A=rank(A)

    R_B=rank(B)

    format rat

    if R_A==R_B&R_A==n

       X=A\b

    elseif R_A==R_B&R_A<n

       X=A\b

       C=null(A,'r')

    else X='Equation has no solves'

    end

    运行后结果显示为:

    R_A =

          2

    R_B =

          2

    Warning: Rank deficient, rank = 2  tol =   8.8373e-015.

    > In D:\Matlab\pujun\lx0723.m at line 11

    X =

        0     

        0     

        -8/15   

        3/5    

    C =

        3/2         -3/4    

        3/2          7/4    

        1            0     

        0            1  

    所以原方程组的通解为X=k1 +k2 +

    解法二:用rref求解

    A=[1  1  -3  -1;3  -1  -3  4;1  5  -9  -8];

    b=[1 4 0]';

    B=[A b];

    C=rref(B)    %求增广矩阵的行最简形,可得最简同解方程组。

    运行后结果显示为:

    C =

        1        0      -3/2      3/4      5/4

        0        1      -3/2     -7/4     -1/4

        0        0        0        0         0 

    对应齐次方程组的基础解系为: ,   非齐次方程组的特解为: 所以,原方程组的通解为:X=k1 +k2 + 。

    1.4.4  线性方程组的LQ解法

    函数  symmlq

    格式  x = symmlq(A,b)   %求线性方程组AX=b的解X。A必须为n阶对称方阵,b为n元列向量。A可以是由afun定义并返回A*X的函数。如果收敛,将显示结果信息;如果收敛失败,将给出警告信息并显示相对残差norm(b-A*x)/norm(b)和计算终止的迭代次数。

    symmlq(A,b,tol)                %指定误差tol,默认值是1e-6。

    symmlq(A,b,tol,maxit)           %maxit指定最大迭代次数

    symmlq(A,b,tol,maxit,M)         %M为用于对称正定矩阵的预处理因子

    symmlq(A,b,tol,maxit,M1,M2)     %M=M1×M2

    symmlq(A,b,tol,maxit,M1,M2,x0)   %x0为初始估计值,默认值为0。

    [x,flag] = symmlq(A,b,…)   %flag的取值为:0表示在指定迭代次数之内按要求精度收敛;1表示在指定迭代次数内不收敛;2表示M为坏条件的预处理因子;3表示两次连续迭代完全相同;4表示标量参数太小或太大;5表示预处理因子不是对称正定的。

    [x,flag,relres] = symmlq(A,b,…)     % relres表示相对误差norm(b-A*x)/norm(b)

    [x,flag,relres,iter] = symmlq(A,b,…)  %iter表示计算x的迭代次数

    [x,flag,relres,iter,resvec] = symmlq(A,b,…)   %resvec表示每次迭代的残差:norm(b-A*x0)

    [x,flag,relres,iter,resvec,resveccg] = symmlq(A,b,…)   %resveccg表示每次迭代共轭梯度残差的范数

    1.4.5  双共轭梯度法解方程组

    函数  bicg

    格式  x = bicg(A,b)   %求线性方程组AX=b的解X。A必须为n阶方阵,b为n元列向量。A可以是由afun定义并返回A*X的函数。如果收敛,将显示结果信息;如果收敛失败,将给出警告信息并显示相对残差norm(b-A*x)/norm(b)和计算终止的迭代次数。

    bicg(A,b,tol)                 %指定误差tol,默认值是1e-6。

    bicg(A,b,tol,maxit)            %maxit指定最大迭代次数

    bicg(A,b,tol,maxit,M)          %M为用于对称正定矩阵的预处理因子

    bicg(A,b,tol,maxit,M1,M2)      %M=M1×M2

    bicg(A,b,tol,maxit,M1,M2,x0)    %x0为初始估计值,默认值为0。

    [x,flag] = bicg(A,b,…)   %flag的取值为:0表示在指定迭代次数之内按要求精度收敛;1表示在指定迭代次数内不收敛;2表示M为坏条件的预处理因子;3表示两次连续迭代完全相同;4表示标量参数太小或太大。

    [x,flag,relres] = bicg(A,b,…)       % relres表示相对误差norm(b-A*x)/norm(b)

    [x,flag,relres,iter] = bicg(A,b,…)    %iter表示计算x的迭代次数

    [x,flag,relres,iter,resvec] = bicg(A,b,…)     %resvec表示每次迭代的残差:norm(b-A*x0)

    例1-83  调用MATLAB6.0数据文件west0479。

    >> load west0479

    >> A=west0479;    %将数据取为系数矩阵A。

    >> b=sum (A,2);     %将A的各行求和,构成一列向量。

    >> X=A\b;         %用“\”求AX=b的解。

    >> norm(b-A*X)/norm(b)    %计算解的相对误差。

    ans =

      1.2454e-017

    >> [x,flag,relres,iter,resvec] = bicg(A,b)    %用bicg函数求解。

    x =  (全为0,由于太长,不显示出来)

    flag =

      1       %表示在默认迭代次数(20次)内不收敛。

    relres =        %相对残差relres = norm(b-A*x)/norm(b) =norm(b)/norm(b) = 1。

        1

    iter =          %表明解法不当,使得初始估计值0向量比后来所有迭代值都好。

        0

    resvec =  (略)               %每次迭代的残差。

    >> semilogy(0:20,resvec/norm(b),'-o')   %作每次迭代的相对残差图形,结果如下图。

    >> xlabel('iteration number')           %x轴为迭代次数。

    >> ylabel('relative residual')           %y轴为相对残差。

     

    图1-1  双共轭梯度法相对误差图

    1.4.6  稳定双共轭梯度方法解方程组

    函数  bicgstab

    格式  x =bicgstab(A,b)

    bicgstab(A,b,tol)

    bicgstab(A,b,tol,maxit)

    bicgstab(A,b,tol,maxit,M)

    bicgstab(A,b,tol,maxit,M1,M2)

    bicgstab(A,b,tol,maxit,M1,M2,x0)

    [x,flag] = bicgstab(A,b,…)

    [x,flag,relres] = bicgstab(A,b,…)

    [x,flag,relres,iter] = bicgstab(A,b,…)

    [x,flag,relres,iter,resvec] = bicgstab(A,b,…)

    稳定双共轭梯度法解方程组,调用方式和返回的结果形式和命令bicg一样。

    例1-84

    >>load west0479;

    >>A=west0479;

    >>b=sum(A,2);

    >>[x,flag]=bicgstab(A,b)

    显示结果是x的值全为0,flag=1。表示在默认误差和默认迭代次数(20次)下不收敛。

    若改为:

    >>[L1,U1] = luinc(A,1e-5);

    >>[x1,flag1] = bicgstab(A,b,1e-6,20,L1,U1)

    即指定误差,并用A的不完全LU分解因子L和U作为预处理因子M=L*U,其结果是x1的值全为0,flag=2表示预处理因子为坏条件的预处理因子。

    若改为

    >>[L2,U2]=luinc(A,1e-6);      %稀疏矩阵的不完全LU分解。

    >>[x2,flag2,relres2,iter2,resvec2]=bicgstab(A,b,1e-15,10,L2,U2)

     %指定最大迭代次数为10次,预处理因子M=L*U。

    >>semilogy(0:0.5:iter2,resvec2/norm(b),'-o')    %每次迭代的相对残差图形,见图1-2。

    图1-2  稳定双共轭梯度方法的相对误差图

    >>xlabel('iteration number')

    >>ylabel('relative residual')

    结果为

    x2=(其值全为1,略)

    flag2 =

           0         %表示收敛

    relres2 =

           2.8534e-016    %收敛时的相对误差

    iter2 =

         6        %计算终止时的迭代次数

    resvec2 =       %每次迭代的残差

    1.4.7  复共轭梯度平方法解方程组

    函数  cgs

    格式  x = cgs(A,b)

    cgs(A,b,tol)

    cgs(A,b,tol,maxit)

    cgs(A,b,tol,maxit,M)

    cgs(A,b,tol,maxit,M1,M2)

    cgs(A,b,tol,maxit,M1,M2,x0)

    [x,flag] = cgs(A,b,…)

    [x,flag,relres] = cgs(A,b,…)

    [x,flag,relres,iter] = cgs(A,b,…)

    [x,flag,relres,iter,resvec] = cgs(A,b,…)

    调用方式和返回的结果形式与命令bicg一样。

    1.4.8  共轭梯度的LSQR方法

    函数  lsqr

    格式  x = lsqr(A,b)

    lsqr(A,b,tol)

    lsqr(A,b,tol,maxit)

    lsqr(A,b,tol,maxit,M)

    lsqr(A,b,tol,maxit,M1,M2)

    lsqr(A,b,tol,maxit,M1,M2,x0)

    [x,flag] = lsqr(A,b,…)

    [x,flag,relres] = lsqr(A,b,…)

    [x,flag,relres,iter] = lsqr(A,b,…)

    [x,flag,relres,iter,resvec] = lsqr(A,b,…)

    调用方式和返回的结果形式与命令bicg一样。

    例1-85

    >>n = 100;

    >>on = ones(n,1);

    >>A = spdiags([-2*on 4*on -on],-1:1,n,n);   %产生一个对角矩阵

    >>b = sum(A,2);

    >>tol = 1e-8;    %指定精度

    >>maxit = 15;   %指定最大迭代次数

    >>M1 = spdiags([on/(-2) on],-1:0,n,n);

    >>M2 = spdiags([4*on -on],0:1,n,n);       %M1*M2=M,即产生预处理因子

    >>[x,flag,relres,iter,resvec] = lsqr(A,b,tol,maxit,M1,M2,[])

    结果显示

         x的值全为1

    flag =

         0      %表示收敛

    relres =

     3.5241e-009    %表示相对残差

    iter =

         12       %计算终止时的迭代次数

    1.4.9  广义最小残差法

    函数  qmres

    格式  x = gmres(A,b)

    gmres(A,b,restart)

    gmres(A,b,restart,tol)

    gmres(A,b,restart,tol,maxit)

    gmres(A,b,restart,tol,maxit,M)

    gmres(A,b,restart,tol,maxit,M1,M2)

    gmres(A,b,restart,tol,maxit,M1,M2,x0)

    [x,flag] = gmres(A,b,…)  

    [x,flag,relres] = gmres(A,b,…)

    [x,flag,relres,iter] = gmres(A,b,…)

    [x,flag,relres,iter,resvec] = gmres(A,b,…)

    除参数restart(缺省时为系数方阵A的阶数n)可以给出外,调用方式和返回的结果形式与命令bicg一样。

    例1-86

    >>load west0479;

    >>A = west0479;

    >>b = sum(A,2);

    >>[x,flag] = gmres(A,b,5)

    结果显示flag=1,表示在默认精度和默认迭代次数下不收敛。

    若最后一行改为

    >>[L1,U1] = luinc(A,1e-5);

    >>[x1,flag1] = gmres(A,b,5,1e-6,5,L1,U1)

    结果flag1=2,说明该方法失败,原因是U1的对角线上有0元素,构成坏条件的预处理因子。

    若改为:

    [L2,U2] = luinc(A,1e-6);

    tol = 1e-15;

    [x4,flag4,relres4,iter4,resvec4] = gmres(A,b,4,tol,5,L2,U2)

    [x6,flag6,relres6,iter6,resvec6] = gmres(A,b,6,tol,3,L2,U2)

    [x8,flag8,relres8,iter8,resvec8] = gmres(A,b,8,tol,3,L2,U2)

    结果flag4=0,flag6=0,flag8=0表示参数restart分别取为4,6,8时收敛。

    1.4.10  最小残差法解方程组

    函数  minres

    格式  x = minres(A,b)

    minres(A,b,tol)

    minres(A,b,tol,maxit)

    minres(A,b,tol.maxit,M)

    minres(A,b,tol,maxit,M1,M2)

    minres(A,b,tol,maxit,M1,M2,x0)

    [x,flag] = minres(A,b,…)

    [x,flag,relres] = minres(A,b,…)

    [x,flag,relres,iter] = minres(A,b,…)

    [x,flag,relres,iter,resvec] = minres(A,b,…)

    [x,flag,relres,iter,resvec,resveccg] = minres(A,b,…)

    这里A为对称矩阵,这种方法是寻找最小残差来求x。调用方式和返回的结果形式与命令bicg一样。

    例1-87

    >>n = 100; on = ones(n,1);

    >>A = spdiags([-2*on 4*on -2*on],-1:1,n,n);

    >>b = sum(A,2);

    >>tol = 1e-10;

    >>maxit = 50;

    >>M1 = spdiags(4*on,0,n,n);

    >> [x,flag,relres,iter,resvec,resveccg] = minres(A,b,tol,maxit,M1,[],[])

    结果显示:

    flag =

         0

    relres =

     4.6537e-014

    iter =

         49

    resvec =(略)

    resveccg =(略)

    1.4.11  预处理共轭梯度方法

    函数  pcg

    格式  x = pcg(A,b)

    pcg(A,b,tol)

    pcg(A,b,tol,maxit)

    pcg(A,b,tol,maxit,M)

    pcg(A,b,tol,maxit,M1,M2)

    pcg(A,b,tol,maxit,M1,M2,x0)

    pcg(A,b,tol,maxit,M1,M2,x0,p1,p2,…)

    [x,flag] = pcg(A,b,tol,maxit,M1,M2,x0,p1,p2,…)

    [x,flag,relres] = pcg(A,b,tol,maxit,M1,M2,x0,p1,p2,…)

    [x,flag,relres,iter] = pcg(A,b,tol,maxit,M1,M2,x0,p1,p2,…)

    [x,flag,relres,iter,resvec] = pcg(A,b,tol,maxit,M1,M2,x0,p1,p2,…)

    调用方式和返回的结果形式与命令bicg一样,这里A为对称正定矩阵。

    1.4.12  准最小残差法解方程组

    函数  qmr

    格式  x = qmr(A,b)

    qmr(A,b,tol)

    qmr(A,b,tol,maxit)

    qmr(A,b,tol,maxit,M)

    qmr(A,b,tol,maxit,M1,M2)

    qmr(A,b,tol,maxit,M1,M2,x0)

    qmr(afun,b,tol,maxit,m1fun,m2fun,x0,p1,p2,…)

    [x,flag] = qmr(A,b,…)

    [x,flag,relres] = qmr(A,b,…)

    [x,flag,relres,iter] = qmr(A,b,…)

    [x,flag,relres,iter,resvec] = qmr(A,b,…)

    调用方式和返回的结果形式与命令bicg一样,这里A为方阵。

    例1-88

    >>load west0479;

    >>A = west0479;

    >>b = sum(A,2);

    >>[x,flag] = qmr(A,b)

    结果显示flag=1,表示在缺省情况下不收敛

    若改为

    >>[L1,U1] = luinc(A,1e-5);

    >>[x1,flag1] = qmr(A,b,1e-6,20,L1,U1)

    结果显示 flag=2,表示是坏条件的预处理因子,不收敛。

    若改为

    >>[L2,U2] = luinc(A,1e-6);

    >>[x2,flag2,relres2,iter2,resvec2] = qmr(A,b,1e-15,10,L2,U2)

    >>semilogy(0:iter2,resvec2/norm(b),'-o')     %每次迭代的相对残差图形

    >>xlabel('iteration number')

    >>ylabel('relative residual')

    结果为

    x=(全为1,略)

    flag2 =

          0    %表示收敛

    relres2 =      %表示相对残差

     2.8715e-016   

    iter2 =           %计算终止时的迭代次数

          8

    resvec2 =          %每次迭代的残差

      1.0e+005 *

        7.0557

        7.1773

        3.4032

        1.7220

        0.0000

        0.0000

        0.0000

        0.0000

        0.0000

     

    图1-3  准最小残差法相对误差图

                                                                                                                                           1.5  特征值与二次型

    工程技术中的一些问题,如振动问题和稳定性问题,常归结为求一个方阵的特征值和特征向量。

    1.5.1  特征值与特征向量的求法

    设A为n阶方阵,如果数“ ”和n维列向量x使得关系式 成立,则称 为方阵A的特征值,非零向量x称为A对应于特征值“ ”的特征向量。

    详见1.3.5和1.3.6节:特征值分解问题。

    例1-89  求矩阵 的特征值和特征向量

    解:

    >>A=[-2  1  1;0  2  0;-4  1  3];

    >>[V,D]=eig(A)

    结果显示:

    V =

       -0.7071   -0.2425    0.3015

            0          0    0.9045

       -0.7071   -0.9701    0.3015

    D =

        -1     0     0

         0     2     0

         0     0     2

    即:特征值-1对应特征向量(-0.7071  0  -0.7071)T

    特征值2对应特征向量(-0.2425  0  -0.9701)T和(-0.3015  0.9045  -0.3015)T

    例1-90  求矩阵 的特征值和特征向量。

    解:

    >>A=[-1 1 0;-4 3 0;1 0 2];

    >>[V,D]=eig(A)

    结果显示为

    V =

        0        0.4082   -0.4082

        0        0.8165   -0.8165

        1.0000   -0.4082    0.4082

    D =

        2     0     0

        0     1     0

        0     0     1

    说明  当特征值为1 (二重根)时,对应特征向量都是k (0.4082  0.8165  -0.4082)T,k为任意常数。

    1.5.2  提高特征值的计算精度

    函数  balance

    格式  [T,B] = balance(A)   %求相似变换矩阵T和平衡矩阵B,满足 。

    B = balance(A)      %求平衡矩阵B

    1.5.3  复对角矩阵转化为实对角矩阵

    函数  cdf2rdf

    格式  [V,D] = cdf2rdf (v,d)   %将复对角阵d变为实对角阵D,在对角线上,用2×2实数块代替共轭复数对。

    例1-91

    >> A=[1 2 3;0 4 5;0 -5 4];

    >> [v,d]=eig(A)

    v =

       1.0000            -0.0191 - 0.4002i  -0.0191 + 0.4002i

            0                  0 - 0.6479i        0 + 0.6479i

            0             0.6479             0.6479         

    d =

       1.0000                  0                  0         

            0             4.0000 + 5.0000i        0         

            0                  0             4.0000 - 5.0000i

    >> [V,D]=cdf2rdf(v,d)

    V =

        1.0000   -0.0191   -0.4002

             0         0   -0.6479

             0    0.6479         0

    D =

        1.0000         0         0

             0    4.0000    5.0000

             0   -5.0000    4.0000

    1.5.4  正交基

    命令  orth

    格式  B=orth(A)   %将矩阵A正交规范化,B的列与A的列具有相同的空间,B的列向量是正交向量,且满足:B'*B = eye(rank(A))。

    例1-92  将矩阵 正交规范化。

    解:

    >>A=[4  0  0; 0  3  1; 0  1  3];

    >>B=orth(A)

    >>Q=B'*B

    则显示结果为

    P =

        1.0000         0         0

             0    0.7071   -0.7071

             0    0.7071    0.7071

    Q =

        1.0000         0         0

             0    1.0000         0

             0         0    1.0000

    1.5.5  二次型

    例1-93  求一个正交变换X=PY,把二次型

    化成标准形。

    解:先写出二次型的实对称矩阵

    在Matlab编辑器中建立M文件如下:

    A=[0 1 1 -1;1 0 -1 1;1 -1 0 1;-1 1 1 0];

    [P,D]=schur(A)

    syms y1 y2  y3 y4

    y=[y1;y2;y3;y4];

    X=vpa(P,2)*y         %vpa表示可变精度计算,这里取2位精度

    f=[y1 y2 y3 y4]*D*y

    运行后结果显示如下:

    P =

       780/989      780/3691       1/2       -390/1351 

       780/3691     780/989       -1/2        390/1351 

       780/1351    -780/1351      -1/2        390/1351 

          0            0           1/2       1170/1351 

    D =

          1            0            0            0     

          0            1            0            0     

          0            0           -3            0     

          0            0            0            1     

    X =

    [ .79*y1+.21*y2+.50*y3-.29*y4]

    [ .21*y1+.79*y2-.50*y3+.29*y4]

    [ .56*y1-.56*y2-.50*y3+.29*y4]

    [               .50*y3+.85*y4]

    f =

    y1^2+y2^2-3*y3^2+y4^2

    即    f =

                                                                                                                                           1.6  秩与线性相关性

    1.6.1  矩阵和向量组的秩以及向量组的线性相关性

    矩阵A的秩是矩阵A中最高阶非零子式的阶数;向量组的秩通常由该向量组构成的矩阵来计算。

    函数  rank

    格式  k = rank(A)       %返回矩阵A的行(或列)向量中线性无关个数

    k = rank(A,tol)    %tol为给定误差

    例1-94  求向量组 , , , , 的秩,并判断其线性相关性。

    >>A=[1 -2 2 3;-2 4 -1 3;-1 2 0 3;0 6 2 3;2 -6 3 4];

    >>k=rank(A)

    结果为

    k =

         3

    由于秩为3 < 向量个数,因此向量组线性相关。

    1.6.2  求行阶梯矩阵及向量组的基

    行阶梯使用初等行变换,矩阵的初等行变换有三条:

    1.交换两行  (第i、第j两行交换)

    2.第i行的K倍

    3.第i行的K倍加到第j行上去

    通过这三条变换可以将矩阵化成行最简形,从而找出列向量组的一个最大无关组,Matlab将矩阵化成行最简形的命令是rref或rrefmovie。

    函数  rref或rrefmovie

    格式  R = rref(A)         %用高斯—约当消元法和行主元法求A的行最简行矩阵R

    [R,jb] = rref(A)     %jb是一个向量,其含义为:r = length(jb)为A的秩;A(:, jb)为A的列向量基;jb中元素表示基向量所在的列。

    [R,jb] = rref(A,tol)   %tol为指定的精度

    rrefmovie(A)        %给出每一步化简的过程

    例1-95  求向量组a1=(1,-2,2,3),a2=(-2,4,-1,3),a3=(-1,2,0,3),a4=(0,6,2,3),a5=(2,-6,3,4)的一个最大无关组。

    >> a1=[1  -2  2  3]';

    >>a2=[-2  4  -1  3]';

    >>a3=[-1  2  0  3]';

    >>a4=[0  6  2  3]';

    >>a5=[2  -6  3  4]';

    A=[a1  a2  a3  a4  a5]

    A =

         1    -2    -1     0     2

        -2     4     2     6    -6

         2    -1     0     2     3

         3     3     3     3     4

    >> [R,jb]=rref(A)

    R =

        1.0000         0    0.3333         0    1.7778

             0    1.0000    0.6667         0   -0.1111

             0         0         0    1.0000   -0.3333

             0         0         0         0         0

    jb =

         1     2     4

    >> A(:,jb)

    ans =

         1    -2     0

        -2     4     6

         2    -1     2

         3     3     3

    即:a1  a2  a4为向量组的一个基。

                                                                                                                                                1.7  稀疏矩阵技术

    1.7.1  稀疏矩阵的创建

    函数  sparse

    格式  S = sparse(A)   %将矩阵A转化为稀疏矩阵形式,即由A的非零元素和下标构成稀疏矩阵S。若A本身为稀疏矩阵,则返回A本身。

    S = sparse(m,n)   %生成一个m×n的所有元素都是0的稀疏矩阵

    S = sparse(i,j,s)   %生成一个由长度相同的向量i,j和s定义的稀疏矩阵S,其中i,j是整数向量,定义稀疏矩阵的元素位置(i,j),s是一个标量或与i,j长度相同的向量,表示在(i,j)位置上的元素。

    S = sparse(i,j,s,m,n)         %生成一个m×n的稀疏矩阵,(i,j)对应位置元素为si,m = max(i)且n =max(j)。

    S = sparse(i,j,s,m,n,nzmax)    %生成一个m×n的含有nzmax个非零元素的稀疏矩阵S,nzmax的值必须大于或者等于向量i和j的长度。

    例1-96

    >> S=sparse(1:10,1:10,1:10)

    S =

       (1,1)        1

       (2,2)        2

       (3,3)        3

       (4,4)        4

       (5,5)        5

       (6,6)        6

       (7,7)        7

       (8,8)        8

       (9,9)        9

      (10,10)      10

    >> S=sparse(1:10,1:10,5)

    S =

       (1,1)        5

       (2,2)        5

       (3,3)        5

       (4,4)        5

       (5,5)        5

       (6,6)        5

       (7,7)        5

       (8,8)        5

       (9,9)        5

      (10,10)       5

    1.7.2  将稀疏矩阵转化为满矩阵

    函数  full

    格式  A=full(S)   %S为稀疏矩阵,A为满矩阵。

    例1-97

    >> S=sparse(1:5,1:5,4:8)

    S =

       (1,1)        4

       (2,2)        5

       (3,3)        6

       (4,4)        7

       (5,5)        8

    >> A=full(S)

    A =

         4     0     0     0     0

         0     5     0     0     0

         0     0     6     0     0

         0     0     0     7     0

         0     0     0     0     8

    1.7.3  稀疏矩阵非零元素的索引

    函数  find

    格式  k = find(x)   %按行检索X中非零元素的点,若没有非零元素,将返回空矩阵。

    [i,j] = find(X)    %检索X中非零元素的行标i和列标j

    [i,j,v] = find(X)   %检索X中非零元素的行标i和列标j以及对应的元素值v

    例1-98  上例中

    >> [i,j,v]=find(S)

    则显示为:

    I =[ 1  2    3   4    5]’

    j =[ 1  2    3   4    5]’

    v =[4  5    6   7    8]’

    1.7.4  外部数据转化为稀疏矩阵

    函数  spconvert

    格式  S=spconvert(D)   %D是只有3列或4列的矩阵

    说明:先运用load函数把外部数据(.mat文件或.dat文件)装载于MATLAB内存空间中的变量T;T数组的行维为nnz或nnz+1,列维为3(对实数而言)或列维为4(对复数而言);T数组的每一行(以[i,j,Sre,Sim]形式)指定一个稀疏矩阵元素。

    例1-99

    >> D=[1  2  3;2  5  4;3  4  6;3  6  7]

    D =

         1     2     3

         2     5     4

         3     4     6

         3     6     7

    >> S=spconvert(D)

    S =

       (1,2)        3

       (3,4)        6

       (2,5)        4

       (3,6)        7

    >> D=[1 2 3 4; 2 5 4 0;3 4 6 9;3 6 7 4];

    D =

         1     2     3     4

         2     5     4     0

         3     4     6     9

         3     6     7     4

    >> S=spconvert(D)

    S =

       (1,2)      3.0000 + 4.0000i

       (3,4)      6.0000 + 9.0000i

       (2,5)      4.0000         

       (3,6)      7.0000 + 4.0000i

    1.7.5  基本稀疏矩阵

    1.带状(对角)稀疏矩阵

    函数  spdiags

    格式  [B,d] = spdiags(A)    %从矩阵A中提取所有非零对角元素,这些元素保存在矩阵B中,向量d表示非零元素的对角线位置。

    B = spdiags(A,d)     %从A中提取由d指定的对角线元素,并存放在B中。

    A = spdiags(B,d,A)    %用B中的列替换A中由d指定的对角线元素,输出稀疏矩阵。

    A = spdiags(B,d,m,n)   %产生一个m×n稀疏矩阵A,其元素是B中的列元素放

    在由d指定的对角线位置上。

    例1-100

    >>A = [11   0   13    0

             0   22    0   24

             0    0   33    0

            41    0    0   44

            0    52    0    0

            0     0   63    0

            0     0    0   74];

    >>[B,d] = spdiags(A)

    B =

        41    11     0

        52    22     0

        63    33    13

        74    44    24

    d =

        -3      %表示B的第1列元素在A中主对角线下方第3条对角线上

         0      %表示B的第2列在A的主对角线上

         2      %表示B的第3列在A的主对角线上方第2条对角线上

    例1-101

    >> B=[1 2 3 4

          5 6 7 8

          9 10 11 12

          13 14 15 16];

    >> d=[-2 0 1 3];

    >> A=spdiags(B,d,4,4);

    >> full(A)

    ans =

         2     7     0    16

         0     6    11     0

         1     0    10    15

         0     5     0    14

    2.单位稀疏矩阵

    函数  speye

    格式  S = speye(m,n)   %生成m×n的单位稀疏矩阵

    S = speye(n)     %生成n×n的单位稀疏矩阵

    3.稀疏均匀分布随机矩阵

    函数  sprand

    格式  R = sprand(S)           %生成与S具有相同稀疏结构的均匀分布随机矩阵

    R = sprand(m,n,density)    %生成一个m×n的服从均匀分布的随机稀疏矩阵,非零元素的分布密度是density。

    R = sprand(m,n,density,rc)   %生成一个近似的条件数为1/rc、大小为m×n的均匀分布的随机稀疏矩阵。

    4.稀疏正态分布随机矩阵

    函数  sprandn

    格式  R = sprandn(S)            %生成与S具有相同稀疏结构的正态分布随机矩阵。

    R = sprandn(m,n,density)    %生成一个m×n的服从正态分布的随机稀疏矩阵,非零元素的分布密度是density。

    R = sprandn(m,n,density,rc)   %生成一个近似的条件数为1/rc、大小为m×n的均匀分布的随机稀疏矩阵。

    5.稀疏对称随机矩阵

    函数  sprandsym

    格式  R = sprandsym(S)   %生成稀疏对称随机矩阵,其下三角和对角线与S具有相同的结构,其元素服从均值为0、方差为1的标准正态分布。

    R = sprandsym(n,density)    %生成n×n的稀疏对称随机矩阵,矩阵元素服从正态分布,分布密度为density。

    R = sprandsym(n,density,rc)   %生成近似条件数为1/rc的稀疏对称随机矩阵

    R = sprandsym(n,density,rc,kind)   %生成一个正定矩阵,参数kind取值为kind=1表示矩阵由一正定对角矩阵经随机Jacobi旋转得到,其条件数正好为1/rc;kind=2表示矩阵为外积的换位和,其条件数近似等于1/rc;kind=3表示生成一个与矩阵S结构相同的稀疏随机矩阵,条件数近似为1/rc ,density被忽略。

    1.7.6  稀疏矩阵的运算

    1.稀疏矩阵非零元素的个数

    函数  nnz

    格式  n = nnz(X)    %返回矩阵X中非零元素的个数

    2.稀疏矩阵的非零元素

    函数  nonzeros

    格式  s = nonzeros(A)    %返回矩阵A中非零元素按列顺序构成的列向量

    例1-102

    >>A =[ 2     7     0    16

          0     6    11     0

          1     0    10    15

          0     5     0    14];

    >> s=nonzeros(A)

    结果为:

    s =[ 2  1  7  6  5  11  10  16  15  14]’

    3.稀疏矩阵非零元素的内存分配

    函数  nzmax

    格式  n = nzmax(S)    %返回非零元素分配的内存总数n

    4.稀疏矩阵的存贮空间

    函数  spalloc

    格式  S = spalloc(m,n,nzmax)   %产生一个m×n阶只有nzmax个非零元素的稀疏矩阵,这样可以有效减少存贮空间和提高运算速度。

    5.稀疏矩阵的非零元素应用

    函数  spfun

    格式  f = spfun('function',S)   %用S中非零元素对函数'function'求值,如果'function'不是对稀疏矩阵定义的,同样可以求值。

    例1-103  4阶稀疏矩阵对角矩阵

    S =

       (1,1)        1

       (2,2)        2

       (3,3)        3

       (4,4)        4

    f= spfun('exp',S)    %即指数e的非零元素方幂。

    结果为

    f =

       (1,1)       2.7183

       (2,2)       7.3891

       (3,3)      20.0855

       (4,4)      54.5982

    6.把稀疏矩阵的非零元素全换为1

    函数  spones

    格式  R = spones(S)    %将稀疏矩阵S中的非零元素全换为1

    1.7.7  画稀疏矩阵非零元素的分布图形

    函数  spy

    格式  spy(S)   %画出稀疏矩阵S中非零元素的分布图形。S也可以是满矩阵。

    spy(S,markersize)            % markersize为整数,指定点阵大小。

    spy(S,'LineSpec')            %'LineSpec'指定绘图标记和颜色

    spy(S,'LineSpec',markersize)   %参数与上面相同

    图1-4  稀疏矩阵非零元素的分布图形

    例1-104

    >> load west0479

    >> A=west0479;

    >> spy(A,'ro',3)

    结果如图1-4所示。

    1.7.8  矩阵变换

    1.列近似最小度排序

    函数  colamd

    格式  p = colamd(S)   %返回稀疏矩阵S的列的近似最小度排序向量p

    2.列最小度排序

    函数  colmmd

    格式  p = colmmd(S)   %返回稀疏矩阵S的列的最小度排序向量p,按p排列后的矩阵为S(: , p)。

    例1-105  比较稀疏矩阵S与排序后的矩阵S(: , p)

    >> load west0479;

    >> S=west0479;

    >> p=colmmd(S);

    >> subplot(2,2,1),spy(S)

    >> subplot(2,2,2),spy(S(:,p))

    >> subplot(2,2,3),spy(lu(S))

    >> subplot(2,2,4),spy(lu(S(:,p)))

     

    图1-5  稀疏矩阵的排序图

    3.非零元素的列变换

    函数  colperm

    格式  j = colperm(S)   %返回一个稀疏矩阵S的列变换的向量。列按非0元素升序排列。有时这是LU分解前有用的变换:LU(S(:,j))。如果S是一个对称矩阵,对行和列进行排序,有利于Cholesky分解:chol(S(j,j))

    4.Dulmage-Mendelsohn分解

    函数  dmperm

    格式  p = dmperm (A)     %返回A的行排列向量p,这样,如果A满列秩,就使得A(p,:)是具有非0对角线元素的方阵。

    [p,q,r] = dmperm(A)    %A为方阵,p为行排列向量,q为列排列向量,使得A(p,q)

    是上三角块形式,r为索引向量。

    [p,q,r,s] = dmperm(A)   %A不是方阵,p,q,r含义与前面相同,s也是索引向量。

    例1-106

    >> A=[11 0 13 0;41 0 0 44;0 22 0 24;0 0 63 0]

    A =

        11     0    13     0

        41     0     0    44

         0    22     0    24

         0     0    63     0

    >> [p,q,r]=dmperm(A)

    p =

         3     2     1     4

    q =

         2     4     1     3

    r =

         1     2     3     4     5

    >> A(p,q)

    ans =

        22    24     0     0

         0    44    41     0

         0     0    11    13

         0     0     0    63

    5.整数的随机排列

    函数  randperm

    格式  p = randperm (n)   %对正整数1,2,3,…,n的随机排列,可以用来创建随机变换矩阵。

    例1-107 

    >> p=randperm(6)

    p =

         3     4     6     5     1     2

    6.稀疏对称近似最小度排列

    函数  symamd

    格式  p = symamd(S)    %S为对称正定矩阵,返回排列向量p。

    7.稀疏逆Cuthill-McKee排序

    函数  symrcm

    格式  r = symrcm (S)   %返回S的对称逆Cuthill-McKee排序r,使S的非0元素集中在主对角线附近。

    8.稀疏对称最小度排列

    函数  symmmd

    格式  p = symmmd(S)   %返回S的对称最小度排列向量p,S为对称正定矩阵。

    例1-108

    >> B = bucky+4*speye(60);

    >>r = symrcm(B);

    >>p = symmmd(B);

    >>R = B(r,r);

    >>S = B(p,p);

    >>subplot(2,2,1), spy(R), title('B(r,r)')

    >>subplot(2,2,2), spy(S), title('B(s,s)')

    >>subplot(2,2,3), spy(chol(R)), title('chol(B(r,r))')

    >>subplot(2,2,4), spy(chol(S)), title('chol(B(s,s))')

     

    图1-6  稀疏对称最小度排列图

    1.7.9  稀疏矩阵的近似欧几里得范数和条件数

    命令  矩阵A条件数的1-范数估计值

    函数  condest

    格式  c = condest(A)       %计算方阵A的1-范数中条件数的下界值c

    [c,v] = condest(A)   %方阵A的1-范数中条件数的下界值c和向量v,使得 ,即:

    norm(A*v,1) = norm(A,1)*norm(v,1)/c。

    命令  2-范数估计值

    函数  normest

    格式  nrm = normest(S)          %返回矩阵S的2-范数的估计值,相对误差为10-6

    nrm = normest(S,tol)       %tol为指定的相对误差,而不用默认误差10-6

    [nrm,count] = normest(…)   %count为给出的计算范数迭代的次数

    其条件数的计算与前面1.2.12相同。

    1.7.10  稀疏矩阵的分解

    命令  不完全的LU分解

    函数  luinc

    格式  [L,U] = luinc(X,'0')       %X为稀疏方阵;L为下三角矩阵的置换形式;U为上三角矩阵;'0'是一种分解标准。

    [L,U,P] = luinc(X,'0')      %L为下三角阵,其主对角线元素为1;U为上三角阵,p为单位矩阵的置换形式。

    [L,U] = luinc(X,options)   %options取值为:droptol表示指定的舍入误差;milu表示改变分解以便于从上三角分解因子中抽取被去掉的列元素。ugiag为1表示用droptol值代替上三角因子中的对角线上的零元素,默认值为0。thresh为中心临界值。

    [L,U] = luinc(X,droptol)    %droptol表示指定不完全分解的舍入误差

    [L,U,P] = luinc(X,options)

    [L,U,P] = luinc(X,droptol)

    例1-109

    >> S=[11 0 13 0;41 0 0 44;0 22 0 24;0 0 63 0]

    S =

        11     0    13     0

        41     0     0    44

         0    22     0    24

         0     0    63     0

    >> S=sparse(S)

    S =

       (1,1)       11

       (2,1)       41

       (3,2)       22

       (1,3)       13

       (4,3)       63

       (2,4)       44

       (3,4)       24

    >> luinc(S,'0')

    ans =

       (1,1)      41.0000

       (4,1)       0.2683

       (2,2)      22.0000

       (3,3)      63.0000

       (4,3)       0.2063

       (1,4)      44.0000

       (2,4)      24.0000

    >> [L,U,p]=luinc(S,'0')

    L =

       (1,1)       1.0000

       (4,1)       0.2683

       (2,2)       1.0000

       (3,3)       1.0000

       (4,3)       0.2063

       (4,4)       1.0000

    U =

       (1,1)       41

       (2,2)       22

       (3,3)       63

       (1,4)       44

       (2,4)       24

    p =

       (4,1)        1

       (1,2)        1

       (2,3)        1

       (3,4)        1

    命令  稀疏矩阵的不完全Cholesky分解

    函数  cholinc

    格式  R = (X,droptol)      %稀疏矩阵X的不完全Cholesky分解,droptol为指定误差。

    R = cholinc(X,options)   %options取值为:droptol表示舍入误差;michol表示如果michol=1,则从对角线上抽取出被去掉的元素。rdiag表示用droptol值代替上三角分解因子中的对角线上的零元素。

    R = cholinc(X,'0')       %'0'是一种分解标准

    [R,p] = cholinc(X,'0')    %不产生任何出错信息,如果R存在,则p=0;如果R不存在,则p为正整数。

    R = cholinc(X,'inf')      %进行Cholesky无穷分解

    1.7.11  稀疏矩阵的特征值分解

    函数  eigs

    格式  d = eigs(A)          %求稀疏矩阵A的6个最大特征值d,d以向量形式存放。

    d = eigs(A,B)       %求稀疏矩阵的广义特征值问题。满足AV=BVD,其中D为特征值对角阵,V为特征向量矩阵,B必须是对称正定阵或Hermitian正定阵。

    d = eigs(A,k)        %返回k个最大特征值

    d = eigs(A,B,k)      %返回k个最大特征值

    d = eigs(A,k,sigma)   %sigma取值:'lm' 表示最大数量的特征值;'sm' 最小数量特征值;对实对称问题:'la'表示最大特征值;'sa'为最小特征值;对非对称和复数问题:'lr' 表示最大实部;'sr' 表示最小实部;'li' 表示最大虚部;'si'表示最小虚部。

    d = eigs(A,B,k,sigma)         %同上

    d = eigs(A,k,sigma,options)     % options为指定参数:参见eigs帮助文件。

    d = eigs(A,B,k,sigma,options)   %同上。以下的参数k、sigma、options相同。

    d = eigs(Afun,n)            %用函数Afun代替A,n为A的阶数,D为特征值。

    d = eigs(Afun,n,B)   

    d = eigs(Afun,n,k)

    d = eigs(Afun,n,B,k)

    d = eigs(Afun,n,k,sigma)

    d = eigs(Afun,n,B,k,sigma)

    d = eigs(Afun,n,k,sigma,options)

    d = eigs(Afun,n,B,k,sigma,options)

    [V,D] = eigs(A,…)   %D为6个最大特征值对角阵,V的列向量为对应特征向量。

    [V,D] = eigs(Afun,n,…)

    [V,D,flag] = eigs(A,…)   %flag表示特征值的收敛性,若flag=0,则所有特征值都收敛,否则,不是所有都收敛。

    [V,D,flag] = eigs(Afun,n,…)

    1.7.12  稀疏矩阵的线性方程组

    参见1.4节的方程组求解。

  • 相关阅读:
    springmvc的执行流程
    深入理解设计模式(五):抽象工厂模式
    深入理解设计模式(四):工厂方法模式
    深入理解设计模式(三):策略模式
    写给三十岁的自己
    asp.net引用System.Speech实现语音提示
    深入理解设计模式(序):常用的7大设计原则
    深入理解设计模式(二):简单工厂模式
    深入理解设计模式(一):单例模式
    解决基于IIS的.net core HttpWebRequest 连接特别慢
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2322560.html
Copyright © 2011-2022 走看看