矩阵(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 分别是矩阵中的每个元素。
更正式地表述:
当矩阵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。
单位矩阵的定义如下:
例如,一个 3 阶单位矩阵是这样的:
1I3 = | 1 0 0 |
2 | 0 1 0 |
3 | 0 0 1 |
在MATLAB中,向量是一个一维数组,可以包含数值或其他数据类型的元素。定义和创建向量有多种方法:
直接输入法:
1rowVec = [1, 2, 3, 4, 5]; % 这是一个行向量
;
)而不是逗号来创建列向量。 1colVec = [1; 2; 3; 4; 5]; % 这是一个列向量
范围生成法:
:
)运算符可以快速生成一个等差序列的向量。 1seqVec = 1:5; % 生成从1到5的行向量
2seqColVec = [1:5]'; % 生成从1到5的列向量
循环构造法:
1N = 5;
2vec = []; % 初始化为空向量
3for i = 1:N
4 vec = [vec, i]; % 或者使用 vec(end+1) = i; 来扩展向量
5end
MATLAB中的向量默认是列优先存储的,也就是说,即使没有明确指定方向,创建一个不包含分号的单行向量也是以列向量的形式存储在内存中。不过,在显示时,MATLAB会根据上下文自动调整输出格式,使得向量看起来像是行向量或列向量。
用公式表示为:如果向量 v = [v1, v2, ..., vn]
,则其模长(欧几里得范数)为:
1||v||_2 = \sqrt{v_1^2 + v_2^2 + ... + v_n^2}
注:只有同型矩阵才可以进行加减
矩阵加法: 假设有两个同为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中
矩阵减法: 类似地,进行矩阵减法:
1D = A - B; % 计算矩阵A和B的差,并将结果存储到D中
在MATLAB中,数(标量)与矩阵的乘法有两种情况:
标量乘以矩阵:将一个标量乘到矩阵的所有元素上。例如,假设有一个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];
矩阵乘以标量:同理,也可以将矩阵乘以一个标量,结果与上述相同。
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
就是:
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函数创建。下面我们一一来进行介绍:
向量元素需要用中括号“[ ]”括起来,元素之间用空格、逗号、分号或按回车键(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中,我们可以直接使用命令[ ]创建空的向量。
[]
两种用法,区别在于是否给定第三个输入参数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不需要指定步长,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(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) = [] %会报错,矩阵超出索引范围
若有侵权,请联系作者