MATLAB矩阵的操作(第一部分)

矩阵的基本知识

矩阵概念

矩阵(Matrix)在数学中是一个由复数或实数组成的矩形阵列,其元素按照行和列排列。矩阵的定义可以形式化地描述为:

一个 m 行 n 列的矩阵是一个有序的数表,其中包含 m*n 个数,可以表示为: A = [a_{ij}] 或 A = (a_{ij}){m×n}, 这里的 a{ij} 是位于矩阵第 i 行第 j 列的元素,1 ≤ i ≤ m, 1 ≤ j ≤ n。

对于一个具体的 m×n 矩阵 A,例如:

1A =
2| a11  a12  ...  a1n |
3| a21  a22  ...  a2n |
4|   .     .    .     . |
5|   .     .    .     . |
6| am1  am2  ...  amn |

其中,a11、a12,...,amn 分别是矩阵中的每个元素。

更正式地表述: 

  • 如果一个矩阵有 m 行和 n 列,则称它为一个 m × n 矩阵。
  • 当 m = n 时,矩阵 A 称为方阵(Square Matrix),特别地,n阶方阵写作 A_n 或 A^n。
  • 若矩阵的元素都是实数,则称该矩阵为实矩阵;若元素均为复数,则称为复矩阵。

同型矩阵

当矩阵A,B的行数和列数都相同时,我们称A,B为同型矩阵。

转置矩阵

转置矩阵(Transpose of a Matrix)是将原矩阵的行和列互换位置得到的新矩阵。对于一个 m×n 的矩阵 A,其转置矩阵记作 Aᵀ 或 AT,是一个 n×m 的矩阵,其中 Aᵀ 的第 i 行、第 j 列的元素等于原矩阵 A 的第 j 行、第 i 列的元素。

具体来说,如果 A 是一个二维数组:

1A = | a11  a12  ... a1n |
2    | a21  a22  ... a2n |
3    |  .    .   ...  .  |
4    | am1  am2  ... amn |

则 A 的转置矩阵 Aᵀ 将会是:

1Aᵀ = | a11  a21  ... am1 |
2     | a12  a22  ... am2 |
3     |  .    .   ...  .  |
4     | a1n  a2n  ... amn |

数学上表示为:如果 A(i,j) 是原矩阵中位于第 i 行第 j 列的元素,则转置矩阵中的相应元素是 Aᵀ(j,i)。

单位矩阵

单位矩阵(Identity Matrix)是一种特殊的方阵,它在数学和线性代数中扮演着至关重要的角色。单位矩阵通常用 I 或 E 表示,并带有下标来表示其阶数,例如对于一个 n 阶单位矩阵,记为 In 或 En。

单位矩阵的定义如下:

  1. 它是一个 n×n 的方阵。
  2. 主对角线(从左上角到右下角)上的所有元素均为 1。
  3. 其他位置(即非主对角线上的元素)全为 0。

例如,一个 3 阶单位矩阵是这样的:

1I3 = | 1 0 0 |
2     | 0 1 0 |
3     | 0 0 1 |

向量的定义

在MATLAB中,向量是一个一维数组,可以包含数值或其他数据类型的元素。定义和创建向量有多种方法:

  1. 直接输入法

    • 行向量(列数为1):通过将元素用逗号或空格分隔,并放在方括号内来创建行向量。
      1rowVec = [1, 2, 3, 4, 5]; % 这是一个行向量
    • 列向量(行数为1):通过在元素之间使用分号(;)而不是逗号来创建列向量。
      1colVec = [1; 2; 3; 4; 5]; % 这是一个列向量
  2. 范围生成法

    • 使用冒号(:)运算符可以快速生成一个等差序列的向量。
      1seqVec = 1:5; % 生成从1到5的行向量
      2seqColVec = [1:5]'; % 生成从1到5的列向量
  3. 循环构造法

    • 当需要动态地构建向量时,可以使用循环结构。
      1N = 5;
      2vec = []; % 初始化为空向量
      3for i = 1:N
      4    vec = [vec, i]; % 或者使用 vec(end+1) = i; 来扩展向量
      5end

MATLAB中的向量默认是列优先存储的,也就是说,即使没有明确指定方向,创建一个不包含分号的单行向量也是以列向量的形式存储在内存中。不过,在显示时,MATLAB会根据上下文自动调整输出格式,使得向量看起来像是行向量或列向量。

向量的模的求法

  1. 计算每个元素的平方。
  2. 将这些平方值相加。
  3. 对结果取平方根。

用公式表示为:如果向量 v = [v1, v2, ..., vn],则其模长(欧几里得范数)为:

1||v||_2 = \sqrt{v_1^2 + v_2^2 + ... + v_n^2}

矩阵的加减法

注:只有同型矩阵才可以进行加减

  1. 矩阵加法: 假设有两个同为m×n维的矩阵A和B,要将它们相加,直接在MATLAB命令行或者脚本文件中写入:

    1A = [1 2; 3 4]; % 这是一个2x2的示例矩阵A
    2B = [5 6; 7 8]; % 这是一个与A相同维度的2x2的示例矩阵B
    3C = A + B; % 计算矩阵A和B的和,并将结果存储到C中
  2. 矩阵减法: 类似地,进行矩阵减法:

    1D = A - B; % 计算矩阵A和B的差,并将结果存储到D中

数与矩阵的乘法

在MATLAB中,数(标量)与矩阵的乘法有两种情况:

  1. 标量乘以矩阵:将一个标量乘到矩阵的所有元素上。例如,假设有一个2x2的矩阵A和一个标量s:

    1A = [1 2; 3 4]; % 这是一个2x2的示例矩阵
    2s = 2;          % 这是一个标量
    3
    4B = s * A;     % 计算标量s与矩阵A的乘积,并将结果存储到B中

    在这个例子中,B将是:

    1B = [2*1 2*2; 
    2     2*3 2*4] = [2 4; 6 8];
  2. 矩阵乘以标量:同理,也可以将矩阵乘以一个标量,结果与上述相同。

    1C = A * s;    % 计算矩阵A与标量s的乘积,并将结果存储到C中

    此时,C也将是

    1C = [2 4; 6 8];

矩阵与矩阵的乘法

在MATLAB中,矩阵与矩阵的乘法遵循特定的规则:前一个矩阵(左侧矩阵)的列数必须等于后一个矩阵(右侧矩阵)的行数。下面给出一个矩阵乘法的例子:

1% 定义两个矩阵 A 和 B
2A = [1 2; 3 4]; % 这是一个2x2的矩阵
3B = [5 6; 7 8]; % 这是一个2x2的矩阵
4
5% 注意:由于矩阵A和B都是2x2的,它们不能直接进行矩阵乘法,因为不符合矩阵乘法的维度要求。
6
7% 为了演示矩阵乘法,我们重新定义一个适合于矩阵乘法的矩阵C:
8C = [1 2; 3 4; 5 6]; % 这是一个3x2的矩阵
9
10D = [7 8 9; 10 11 12]; % 这是一个2x3的矩阵
11
12% 矩阵C和D可以相乘,因为C有2列,而D有2行。
13E = C * D; 
14
15% 输出结果
16disp(E);

计算结果矩阵E中的每个元素是通过将矩阵C的每一行与矩阵D的每一列对应元素进行逐个相乘并求和得到的。例如:

  • E(1,1) = C(1,1)D(1,1) + C(1,2)D(2,1) = 17 + 210 = 27
  • E(1,2) = C(1,1)D(1,2) + C(1,2)D(2,2) = 18 + 211 = 26
  • E(1,3) = C(1,1)D(1,3) + C(1,2)D(2,3) = 19 + 212 = 33
  • ...
  • E(3,3) = C(3,1)D(1,3) + C(3,2)D(2,3) = 59 + 612 = 117

所以,整个结果矩阵E就是:

1E = [27 30 33;
2     61 68 75;
3     95 106 117];

在这个例子中,由于矩阵C是3x2的,矩阵D是2x3的,所以可以进行矩阵乘法,并得到一个3x3的结果矩阵E。实际计算时,每一个元素e_ij都是通过将矩阵C的第i行与矩阵D的第j列对应元素按顺序逐个相乘然后求和得到的。

但是,如果尝试用原来的矩阵A和B进行矩阵乘法,由于它们都是2x2的矩阵,无法满足矩阵乘法的条件,MATLAB会抛出错误,不允许这样的操作。

注:进行矩阵相乘时。必须满足:前一个矩阵(左矩阵)的列数必须等于后一个矩阵(右矩阵)的行数。也就是说,如果有一个 m×n 的矩阵 A 和一个 n×p 的矩阵 B,则它们可以相乘得到一个 m×p 的矩阵 C。

矩阵的逆

矩阵的逆(Matrix Inverse)是指对于一个方阵(即行数和列数相等的矩阵),如果存在另一个同样大小的矩阵,使得它们相乘的结果是单位矩阵,那么这个矩阵就被称为原矩阵的逆矩阵。

 特征值和特征向量

特征值(Eigenvalue): 给定一个 n 阶方阵 A,如果存在非零向量 v 和标量 λ,满足以下关系式:

Av = λv

则称 λ 是矩阵 A 的一个特征值(Eigenvalue),v 称为对应于特征值 λ 的特征向量(Eigenvector)。

换言之,特征值描述了在经过矩阵变换后,特定向量的方向不变但长度按一定比例伸缩的程度。这个特定的比例就是特征值。

特征向量(Eigenvector): 对于一个给定的特征值 λ,其对应的特征向量 v 是一个非零向量,在经过矩阵 A 的作用下,只会发生长度变化而不会改变方向。换句话说,特征向量是在矩阵乘法后仍然保持相同方向(尽管可能有大小变化)的向量。

总结来说,对于矩阵 A 和非零向量 v 以及实数 λ,当 Av = λv 成立时,λ 称为矩阵 A 的特征值,v 称为对应的特征向量。寻找特征值和特征向量的过程通常涉及解一组线性代数方程组。

MATLAB中的向量

在MATLAB中,向量可以被称为一维数组,矩阵可以被称为二维数组

创建方法

在MATLAB中,向量的创建方法主要有三种,分别是:直接输入法、冒号法和利用MATLAB函数创建。下面我们一一来进行介绍:

直接输入法


向量元素需要用中括号“[ ]”括起来,元素之间用空格、逗号、分号或按回车键(Enter键)分隔,就可以创建对应的向量。
若元素之间用空格(可以有多个空格)、逗号分隔,则创建的是行向量;
若用分号、回车键分隔,则创建的是列向量。(注意:这里的逗号和分号都是英文输入法下输入的,不能用中文的逗号或分号)
a = [1 3 5]
a = [1,3,5]
b = [1;3;5]
b = [1
    3
    5]

冒号法(最常用)


我们可以利用命令:A:step:B 来创建一个行向量。
其中,A是起始值,step是每次递增或递减的步长,B是终止值(不一定刚好停在这里)。若step等于1,则可以直接简写成A:B。
直接看上面的概念不够直观,下面我们举几个例子,大家根据例子来理解会很轻松。
1:2:7  % 每次增加2,直到最后到了7
1:2:8  % 每次增加2,到了7后,如果再增加2的话结果等于9,比8要大,所以到了7就停止了。
0:0.1:1  % 每次增加0.1
0:0.01:1   % 每次增加0.01
1:1:100  % 步长为1时可以省略     1:100
1:10:3   % 从1开始,增加10等于11,比3还要大,所以返回1
5:2:1  % A:step:B  若A > B且步长step > 0,则会返回空的向量
10:-1:6   % 步长为-1,因此会从10开始递减
10:-2:5  % 步长为-2,从10开始递减,到了6后,如果再减去2就等于4,比5还要小,所以到了6就停止了。
10:-100:5    % 步长为-100,因为10-100 = -90比5还要小,所以返回10
10:-10:50  % 若A < B且步长step < 0,则会返回空的向量。
1:0:2  % 若step = 0,则返回空的向量。
补充:
上表中,有三种情况都会导致MATLAB返回空的向量:空的1×0 double行向量。怎么理解这个返回结果呢?这个“1×0”指的是向量的维度,你可以理解为1行0列,即这个向量是空的,不存在元素。在MATLAB中,我们可以直接使用命令[ ]创建空的向量。
[]


利用MATLAB函数创建

linspace函数


两种用法,区别在于是否给定第三个输入参数n,如果我们不指定n,则MATLAB会默认n=100。
linspace(a,b): 该命令用来创建一个行向量,向量中的第一个元素为a,最后一个元素为b,形成总数为100个元素的线性间隔的向量
linspace (a,b,n): 该命令用来创建一个行向量,向量中的第一个元素为a,最后一个元素为b,形成总数为n个元素的线性间隔的向量
第一个数为1,最后一个数为100,整个向量构成了一个等差数列,由10个元素组成
linspace(1,100,10) =[1 12 23 34 45 56 67 78 89 100]
第一个数为0,最后一个数为2*pi
linspace(0,2*pi,10) 
linspace(1,10)   % 如果不指定第三个输入参数n,则默认生成100个元素的等差数列
linspace(100,1,10)   % 如果a>b,则步长是负数


linspace (a,b,n)和冒号法a:step:b生成向量的区别


linspace不需要指定步长,MATLAB会根据你给定的元素个数n自动计算出来;而使用冒号法可以自己指定步长。
linspace生成的向量的最后一个元素一定是b,而使用冒号法a:step:b生成的向量的最后元素不一定是b。
循环语句时,冒号法使用的频率最高;而在绘制函数图形时,使用linspace得到的x轴的范围要比冒号法稍微准确一点。例如:我们要绘制sin(x)在区间[0, 2]上的图形,x的范围是0到 2 ,我们使用linspace(0,2*pi)生成的向量的最后一个元素一定是 2 ;如果使用冒号法令x=0:0.1:2*pi,那么x向量的最后一个元素和 2 有一个微小的差异,当然,如果我们将step取得更小,例如取成0.01,那么这个差异几乎可以忽略。

logspace函数(了解即可),

两种常见的用法:
logspace(a,b):创建一个行向量,其第一个元素为10^a,最后一个元素为10^b,形成总数为50个元素的等比数列向量
logspace(a,b,n):创建一个行向量,其第一个元素为,最后一个元素为,形成总数为n个元素的等比数列向量。
logspace(1,2) % 默认50个元素,linspace函数默认是100个元素
logspace(1,2,10)  % 生成第一个数为10^1,最后一个数为10^2,包含10个元素的等比数列
logspace(1,3,5)  % 生成第一个元素为10^1,最后一个元素为10^3,包含5个元素的等比数列
logspace(log10(2),log10(1024),10)  % 第一个数为2,最后一个数为1024,10个元素组成的等比数列
logspace(2,1,5)  % 第一个数为10^2,最后一个数为10^1,5个元素组成的等比数列

向量元素引用

对向量元素的引用(即提取向量指定位置的值)有两种情形,分别是提取向量中的单个元素和提取向量中的多个元素。
向量分为行向量和列向量,它们在MATLAB中只有一个维度,因此我们可以利用向量中包含的元素个数来描述一个向量的大小。

在MATLAB中,向量的索引是从1开始的

在MATLAB中,可以使用length函数numel函数来计算向量中包含的元素个数。
a = [2 4 8 16 32 64 128 256 512 1024];
length(a) =10
numel(a)=10

单个元素引用


我们提取向量a中单个元素的方法很简单,只需要利用a(ind)命令,小括号中的ind就是你要提取的对应元素的索引。
注:创建向量用中括号,提取元素要用小括号
a = [2 4 8 16 32 64 128 256 512 1024];
a(1)=2    a(9)=512
% a(11)   % 索引超出数组元素的数目(10)。
a([]) % 如果是提取空向量的话,结果也为空。
% a(1.5)    % a(0)    % a(-1)    索引必须为正整数逻辑值

多个元素引用


利用向量的索引来同时提取多个位置的元素,这时候只需要将ind设置成一个向量,ind中放入我们想要提取的元素的索引,然后使用a(ind)命令即可。
a = [2 4 8 16 32 64 128 256 512 1024];
ind = [1 3 5 7 9];
a(ind)           %a(ind)=2 8 32 128 512 
% 也可以直接简写成:
a([1 3 5 7 9])
% 注意到:1:2:9 = [1 3 5 7 9]
a(1:2:9)  % 提取a中奇数位置的元素
% 提取a中偶数位置元素
a(2:2:10)
% 对于同一个位置的元素,我们也可以提取多次
a = [2 4 8 16 32 64 128 256 512 1024];
ind = [1 2 2 3 3 3];
a(ind)  % 熟悉的话可以直接写成a([1 2 2 3 3 3])


技巧

使用end索引
假如不知道向量a中有多少个元素,也不使用length函数或者numel函数来计算向量中元素的个数,那提取出a中奇数位置的元素可以用到一个特殊的关键字:end。它有很多种用法,在这里end可以用来替代向量的最后一个索引。
a = [2 4 8 16 32 64 128 256 512 1024];
% 访问a中第五个至最后一个元素,那么我们可以直接使用
a(5:end)
% 我们还可以对end进行计算,例如要访问a中第五个至倒数第三个元素
a(5:end-2)
% 这里有一个易错点,如果使用了end,就不能先将要取元素的索引赋值给ind,然后再调用

ind=5:end      a(ind)       wrong

a(5:end)   yes

% 提取a中奇数位置的元素
a(1:2:end)

问题

将一个向量倒序,例如原向量是[1 5 8 4],倒序后是[4 8 5 1]

a=[1 5 8 4]
b=a(end:-1:1)

元素的修改与删除

向量元素的修改


可以直接利用赋值的方法对引用位置的元素进行修改。
a = [2 4 8 16 32 64 128 256 512 1024];
a(1) = 4  % 第一个元素改成4
a([1,3]) = [50 60] % 第1个位置元素改成50;第3个位置元素改成60
% 赋值时,左右两侧的元素个数要相同
% a(1:3) = [5 6]   % 无法执行赋值,因为左侧和右侧的元素数目不同。

% 如果右边为常数,则将指定位置的元素全部变成这个常数
a(2:4) = 100  % 第2到4号位置的元素改成100
a(13) = 88 

向量元素的删除


如果我们将等号右侧改为空向量[],则可以删除对应位置的元素。
a(1) = [ ]  % 删除a的第一个元素
a(end-1:end) = [ ]  % 删除a中最后两个元素

思考题:下面哪些语句会报错?
a = [2 4 8 16 32 64 128 256 512 1024];
% a([1,3])
% a(1,3)   %提取第一行第三个的元素
% a([2,3])
% a(2,3)  %会报错

下面哪些语句会报错?
% a = [2 4 8 16 32];
% a([2,4]) = 5

% a = [2 4 8 16 32];
% a(8) = 10     %a=[2 4 8 16 32 0 0 10]

% a = [2 4 8 16 32];
% a(2,4) = 16   %a=[2 4 8 16 32

                                 0 0 0 16 0]

% a = [2 4 8 16 32];
% a(10) = []    %会报错,矩阵超出索引范围

若有侵权,请联系作者

你可能感兴趣的:(matlab)