• 线性代数中涉及到的matlab命令-第二章:矩阵及其运算


    目录

    1,矩阵定义

    2,矩阵的运算

    3,方阵的行列式和伴随矩阵 

    4,矩阵的逆 

    5,克莱默法则 

    6,矩阵分块 


    1,矩阵定义

    矩阵与行列式的区别:

    (1)形式上行列式是数表加两个竖线,矩阵是数表加大括号或中括号;

    (2)行列式可计算得到一个值,矩阵不能;

    (3)两个行列式相加与两个矩阵相加不同;

    (4)行列式乘以一个数k,可将k乘到行列式任一行或任一列,矩阵乘以k,k与矩阵的每个元素相乘;

    (5)行列式是n*n的数表,矩阵可以是m*n的数表;

    行数和列数都为n的矩阵称为n阶矩阵,或叫n阶方阵;

    只有一行的矩阵称为行矩阵(也叫行向量)在Matlab中的表示方法:

    只有一列的矩阵称为列矩阵(也叫列向量)在Matlab中的表示方法:

    两个矩阵A、B的行数相同,并且列数也相同时,称它们是同型矩阵,如果他们的对应元素也相同,则A = B;

    使用size命令获得矩阵的行数和列数:

    1. clc;
    2. A = [2 4 6;
    3. 3 5 7];
    4. size(A)

    使用isequal判断两个矩阵是否相等:

    1. clc;
    2. A = [2 4 6;
    3. 3 5 7];
    4. B = [2 4 6;
    5. 3 5 7];
    6. isequal(A,B)

    单位矩阵:是一个方阵,主队角元素都为1,其他元素是0,一般用E表示

    矩阵A乘以单位矩阵E结果还是矩阵A,并且左乘或右乘单位矩阵E一样:

    1. clc;
    2. A = [1 2 3;
    3. 4 5 6;
    4. 7 8 9];
    5. E = eye(3);
    6. EA = E*A
    7. AE = A*E

    对角矩阵:是一个方阵,主对角元素不为0,其他元素均为0;

    1. clc;
    2. v = [1,2,3,4];
    3. A = diag(v)

    2,矩阵的运算

     矩阵的加法:

    1. clc;
    2. A = [1 1 1 1;
    3. 2 2 2 2;
    4. 3 3 3 3];
    5. B = [0 0 0 0;
    6. 1 1 1 1;
    7. 2 2 2 2];
    8. C = A + B

     数与矩阵相乘:

    1. clc;
    2. A = [1 1 1 1;
    3. 2 2 2 2;
    4. 3 3 3 3];
    5. k = 2;
    6. C = k*A

    矩阵相乘:一个矩阵的列与另一个矩阵的行相同时,两个矩阵才能相乘;

    1. clc;
    2. A = [1 1 1;
    3. 2 2 2];
    4. B = [1 1;
    5. 2 2;
    6. 3 3];
    7. C = A*B
    8. D = B*A

     

    可见矩阵A*B 不等于B*A;

     矩阵的幂:

    以下例子为四个城市之间开通的航线情况,0代表两个城市间没有航线,1代表开通有航线,建立城市间是否有航线的模型即一个4阶矩阵A,用表示从i城市到j城市的航线数量,对A求2次幂可以得到城市i有几条双向航线(A的2次幂矩阵的对角线元素),以及从城市i经过一次中转到城市j的单线航线数量。

    对单线航线矩阵A的2次幂的含义尽心解释: 

     

    对角矩阵的幂,对角线上元素按幂运算:

    1. clc;
    2. v = [1,2,3];
    3. A = diag(v)
    4. A^3

    矩阵的转置:

    1. clc;
    2. A = [1 1 1;
    3. 2 2 2];
    4. B = A'

     一个方阵和它的转置矩阵相加可以产生一个对称矩阵,以下程序可以产生一个对称阵:

    1. clc;
    2. A = rand(3);
    3. B = A';
    4. C= A+B

     

    3,方阵的行列式和伴随矩阵 

    1. clc;
    2. A = rand(3);
    3. a = det(A);
    4. b = det(A');
    5. abs(a-b) < eps
    1. clc;
    2. A = rand(3);
    3. B = rand(3);
    4. format short
    5. a = det(A*B);
    6. b = det(A)*det(B);
    7. abs(a-b) < eps
    1. clc;
    2. A = [1 2 3;
    3. 4 5 6;
    4. 7 8 9];
    5. k = 2;
    6. B = k*A;
    7. det(B) == (k^3)*det(A)

     

    1. clc;
    2. A = [1 4 7;
    3. 3 5 8;
    4. 2 6 8];
    5. A_adj = adjoint(A) %adjoint求A的伴随矩阵
    6. C = A*A_adj;
    7. D = A_adj*A;
    8. E = eye(3);
    9. EA = E*det(A);
    10. A13 = A;
    11. A21 = A;
    12. A13(1,:) = [];
    13. A13(:,3) = [];
    14. A21(2,:) = [];
    15. A21(:,1) = [];
    16. D_A13 = (-1)^(1+3)*det(A13) %A(1,3)的代数余子式
    17. D_A21 = (-1)^(2+1)*det(A21) %A(2,1)的代数余子式

     使用Matlab中的adjoint命令,A产生的伴随阵A_adj,A*A_adj = A_adj *A = E*det(A):

    4,矩阵的逆 

    只有方阵才有逆矩阵,矩阵可逆的充分必要条件是det(A)不等于0。

    Matlab中可以使用inv(A)或A^(-1)计算A的逆矩阵,也可以使用上图中定理2计算逆矩阵:

    1. clc;
    2. A = rand(3);
    3. B = inv(A)
    4. C = A^(-1);
    5. A_mul_B = A*B
    6. B_mul_A = B*A;
    7. A_adj = adjoint(A);
    8. 1/det(A)*A_adj %根据定理2计算逆矩阵

     同样使用定理2可以反向计算矩阵A的伴随阵:

    1. clc;
    2. A = rand(3);
    3. A_adj = adjoint(A)
    4. det(A)*inv(A) %定理2计算伴随阵

    5,克莱默法则 

    分别用逆矩阵、左除、克莱默法则计算下边例题,计算结果相同:

    1. clc;
    2. %以下程序用于求n元非齐次方程组的解, 方程组的形式为Ax = b,求x
    3. A = [1,1,1,1;
    4. 1,2,-1,4;
    5. 2,-3,-1,-5;
    6. 3,1,2,11]; %方程组系数矩阵
    7. b = [5;-2;-2;0]; %方程组右端常数矩阵
    8. A1 = A;
    9. A1(:,1) = b;
    10. A2 = A;
    11. A2(:,2) = b;
    12. A3 = A;
    13. A3(:,3) = b;
    14. A4 = A;
    15. A4(:,4) = b;
    16. if det(A) ~= 0 %判断方程组是否有解
    17. %%三种求方程组解的形式
    18. x = inv(A)*b %1,用逆矩阵的方式求方程组的解
    19. x = A\b %2,用左除的方式求方程组的解
    20. x1 = det(A1)/det(A) %3,用克莱默法则求方程组的解
    21. x2 = det(A2)/det(A)
    22. x3 = det(A3)/det(A)
    23. x4 = det(A4)/det(A)
    24. else
    25. disp("det(A) = 0,方程组无解");
    26. end

    6,矩阵分块 

    使用下边Matlab命令运算得到逆矩阵:

    1. clc;
    2. A = [3 0 0 ;
    3. 0 2 4 ;
    4. 0 3 1 ];
    5. C = mat2cell(A,[1,2],[1,2]); %mat2cell函数将原矩阵分块为四个cell,行数分别为12行,列数分别为1列和2
    6. C1 = C{1}; %将cell转化为矩阵
    7. C2 = C{2};
    8. C3 = C{3};
    9. C4 = C{4};
    10. inv_A = inv(A) %使用inv命令直接计算逆矩阵
    11. inv_C1 = inv(C1); %对分块后的非0矩阵求逆矩阵
    12. inv_C4 = inv(C4);
    13. inv_C = [inv_C1,C3;
    14. C2,inv_C4] %对原矩阵分块后对非0矩阵分别求逆矩阵后再组合在一起

    运行结果:

    矩阵分块后转置:

    1. clc;
    2. A = randi([0,10],3,4) %产生一个34列从0-10的随机数元素的矩阵
    3. A_T = A'
    4. C = mat2cell(A,[1,2],[2,2]); %mat2cell函数将原矩阵分块为四个cell,行数分别为12行,列数分别为2列和2
    5. C1 = C{1,1}; %将cell转化为矩阵
    6. C2 = C{1,2};
    7. C3 = C{2,1};
    8. C4 = C{2,2};
    9. C1 = C1';
    10. C2 = C2';
    11. C3 = C3';
    12. C4 = C4';
    13. C_T = [C1,C3;
    14. C2,C4]

     运行结果:

    分块矩阵相乘:

    1. clc;
    2. A = [3 0 0 2 5;
    3. 0 2 4 3 4;
    4. 0 3 1 2 6];
    5. B = [3 0 0; %矩阵A可以分块为B和C矩阵
    6. 0 2 4;
    7. 0 3 1];
    8. C = [2 5;
    9. 3 4;
    10. 2 6];
    11. D = randi([1,10],2,3);
    12. D*A
    13. D*B
    14. D*C

    运算结果:

     

     

  • 相关阅读:
    运行游戏“找不到XINPUTI_3.dll无法继续执行代码,总共有五种解决方案
    ubuntu中编译ncnn+vulkan
    上周热点回顾(3.27-4.2)
    优盘不认,无法识别的情况下,如何修复问题
    背包问题变式总结
    高效文件管理:自动生成文件夹及重命名的方法分享
    [附源码]java毕业设计书店网站论文
    Web学习day04
    数据分析学习路径(1.0版)
    二本蒟蒻的带牌退役感言(感谢两年来的acm经历)
  • 原文地址:https://blog.csdn.net/weixin_47207479/article/details/133711625