向量与矩阵
MATLAB中有很大一部分的内容都是用来解决线性代数问题!
1.向量
向量(vector)一维数值数组。
MATLAB允许创建列向量和行向量,列向量通过在方括号内把数值用分号(;)隔开来创建,对元素的个数没有限制,例如创建一个含有3个元素的向量,我们写成:
1
2
3
4
5
6>>a=[2;3;4] a= 2 3 4
列向量的基本操作是通过引用创建时使用变量名来进行的,若我们要把一个列向量
乘上一盒数,这就叫做数量的乘法,假设我们要创建一个新的向量,它的元素是我们创建的向量a的元素的三倍,我们可以先定义一个数量(注意命令行末的分号禁止了输出)
1
2
3
4
5
6
7
8>>c=3; 下一步,我们就像a是另一个变量一样进行计算 >>b=c*a b= 6 3 12
若要创建一个行向量,我们任然是把一组数值用方括号括起来,不过这次使用的分隔符是空格(space)或逗号(,)例如:
1
2
3
4
5
6
7
8>>v=[1 6 9] v= 1 6 9 或者试用逗号,例如 >>w=[3,4,5] w= 3 4 5
转置
我们用单引号(‘)代表转置操作,把列向量转化行向量的例子为:
1
2
3
4
5
6>>a=[8;2;8]; >>y=a' y= 8 2 8 加上一个(’)就代表转置,同理可以吧列向量转化为行向量
对向量进行四则运算
在执行加减法的操作的时候,两个向量之间必须类型相同,长度相同。并且直接引用变量名就可以执行操作。
从已存的变量创建大向量
MATLAB允许吧向量集合合并在一起创建新的向量,设m和n是已经存在的两个变量,各自带有a和b个元素,我们创建第三个变量w,它的前m个元素来自m,后n个元素来自v,新创建的元素一共有a+b个元素,这时可以写成w=[m;n];同理若创建合并形式的行向量,中间只需用逗号隔开。
1
2
3
4
5
6
7
8
9
10
11
12
13>>A=[2;6;8]; >>B=[3;9;5]; >>D=[A;B] D= 2 3 5 6 8 9 >>D=[A,B] D=[2 3 5 6 8 9]
创建等差元素向量
有时需要创建带有等差元素的向量,差值q为一个实验,创建一个首元素为a;末元素为b的向量x的语法如下:
x=[a:q:b]
1
2
3
4>>x=[0:2:10] x= 0 2 4 6 8 10
注意在MATLAB中的向量的乘方必须在幂运算符前(^)前加上英文句号(.)
1
2y=x.^2
在创建等差数组的过程中,也可以适应负的递增量(即递减)。例如,我们创建一个从100到80,以5递减的过程
1
2
3
4u=[100:-5:80] u= 100 95 90 85 80
我们也可以使用linspace命令创建行向量,这向量含有a到b之间间隔相等(等差)的n个元素。linspace(a,b)创建了a、b之间含有100个等差元素的向量,而linspace(a,b,n)创建了a,b之间含有n个等差元素的向量。不管是哪种形式,MATLAB自动确定元素之间的增量。
MATLAB还允许创建n个对数值间隔相同的行向量。使用格式为:
logspace(a,b,n)
1
2
3
4
5
6
7
8>>logspace(1,2,5) ans= 10.0000 17.7828 31.6228 56.2341 100.0000 另一个例子 >>logspace(-1,1,6) ans= 0.1000 0.2512 0.6310 1.5849 3.9811 10.0000
特征化向量
①命令length返回向量中包含元素的个数,例如:
length命令既可以应用到行向量和列向量也能应用到矩阵
1
2
3
4
5
6
7
8
9>>A=[2;3;4;5;6;7]; >>length(A) ans= 5 >>B=[1;1]; >>length(B) ans= 2
②使用max或者min命令还可以找出向量中数值最大和最小的元素
1
2
3
4
5
6
7
8>>A=[2 3 4 5 6 7 8 9 10]; >>max(A) ans= 10 >>min(A) ans= 2
③向量的模
首先使用(.*)得到元素的平方,然后使用sum函数进行求和,最后对和使用sqrt进行开方
1
2
3
4
5
6
7
8
9
10
11
12
13
14>>a=[0;3;4]; >>a.*a ans= 0 9 16 >>b=sum(a.*a) b= 25 向量的模就是这个得数的平方根: >> mag=sqrt(a) mag= 5
注意若变量中包含复数,计算向量的模的时候应该注意。要计算复数行向量的模,必须计算该向量的共轭复数向量。
④向量的绝对值、abs(向量)
1
2
3
4
5>>a=[-1,-4,8] b=abs(a) b= 1 4 8
向量的点乘和叉乘(数量积和向量积)
两个向量点乘可以使用dot(a,b)
点乘可以用来计算向量的模
1
2
3
4
5
6
7
8>>a=[0;3;4]; >>dot(a,a) ans= 25 mag=sqrt(a,a) mag= 5
对于带有复数元素的向量,dot也能正确计算
向量的另一个重要操作就是叉乘,这两个向量必须是三维的。例如
1
2
3
4
5>>A=[1,2,3];B=[2,3,4] >>C=cross(A,B) C= -1 2 -1
引用向量的元素,向量v的第i个元素可以用v(i)来引用,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18>>A=[12;14;25;6;67;78;5] >>A(2) ans= 14 >>A(5) ans= 19 若适应冒号——如v(:)——来引用向量,等于告诉MATLAB列出向量的所有元素: >>A(:) ans= 12 14 25 6 67 78 5
我们还可以选出向量中某一范围内的元素,本节中我们一直使用的向量A有7个元素,可以用A(4:7)选择出第4到第7个元素构成一个新的,含有4个向量;
1
2
3
4
5
6
7>>v=(4:7) v= 6 67 78 5
矩阵的基本操作
矩阵是两维数字数组,要在MATLAB中创建矩阵,输入的行各元素之间用空格或者逗号分隔,行末使用分号标记。
1
2
3
4
5
6
7
8
9
10
11>>A=[-1,6;7,11] A= -1 6 7 11 >>B=[2,0,1;-1,7,4;3,0,1] B= 2 0 1 -1 7 4 3 0 1
向量的很多操作可以延伸到矩阵的操作,所有的带有n个元素的列向量是一个有一列n行的矩阵,所有的带有n个元素的行向量是一个有一行n列的矩阵。例如,数量相乘可以通过引用矩阵的名称来进行
常用的矩阵操作如下:
数乘 | 数字*矩阵 |
加 or 减 | 两个 矩阵的行数和列数相等 |
转置 | 矩阵’ |
数组乘法.* | 实际上就是两个同型矩阵元素和元素的相乘 |
1
2
3
4
5
6>>A=[12 3;-1 6];B=[4 2;9 1]; >>C=A.*B C= 48 6 -9 6
end函数
它对于创建子数组的下标非常有用,当用到一个函数的下标时,end会返回下标最大值
矩阵相乘
①点乘,就是两个同型矩阵对应位置的元素进行相乘。(就是数组相乘)
②矩阵相乘,没有(.),是直接进行两个矩阵相乘
##注意事项
①把一个数字添加到一个数组上面(向量或矩阵)中,就是把数量值加到数组的每一个元素上面
1
2
3
4
5
6>>a=[1 2 3 5]; >>b=2 >>=a+b c= 3 4 5 7
②我们也可以在数组上进行左除或者右除,因此两组数字必须同型。
1
2
3
4
5>>a=[2 4 6 8];b=[2 2 3 1]; >>c=a ./ b c= 1 2 2 8
凡是我们能想到的数学操作,在MATLAB中都能通过数组实现
例如
求一个矩阵的平方
1
2
3
4
5
6>>B=[2 4;-1 6] >>B .^ 2 ans= 4 16 1 36
特殊类型的矩阵
单元矩阵就是一个对角线为非零元素但是其他元素为零的方形矩阵。创建一个n*n的单元矩阵就用 eye(n)
1
2
3
4
5
6
7
8创建一个4*4的单位阵 >>eye(4) ans= 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
零矩阵
要创建nn的零矩阵,输入zeros(n);另外可以输入zeros(m,n)创建mn的矩阵;
创建整个元素都为1的矩阵,只需要输入ones(n)或ones(m,n)即可分别创建nn和mn的矩阵。
引用矩阵元素
在MATLAB中,矩阵的单个元素或整列都能被引用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30>>A=[1 2 3;4 5 6;7 8 9] 我们可以使用A(m,n)选出第m行n列的元素,例如: >>A(2,3) ans= 6 要引用第i列的所有元素,我们输入A(:i)。例如,我们要选出第二列的所有元素 >>A(: , 2) ans= 2 5 8 要选出从第i列到第j列之间的所有元素,我们输入A(:,i:j)。下面的例子返回第2列和第3列的元素。 A(:,2:3) ans= 2 3 5 6 8 9 我们可以选出小块或子矩阵 仍然使用刚才的矩阵,选出第二行到第三行,第一列到第二列的矩阵。 >>A(2:3 , 1:2) ans= 4 5 7 8 同时可以使用这些引用改变矩阵的值,下面让我们把第一行和第一列元素的值改为-6 >>A[1,1]=-6 A= -6 2 3 4 5 6 7 8 9
若在MATLAB中创建新的数组。只需要在方括号[]里面留空就行,可以用它来删除矩阵的行或者列。例如删除A的第二行:
1
2
3
4
5
6>>A(2,:)=[] A= -8 2 3 7 8 9 本操作把3*3的矩阵变成了2*2的矩阵:
另外
1
2
3
4
5
6
7>>E=A([1,1,1,1],:) E= -6 2 3 -6 2 3 -6 2 3 -6 2 3
下面这个例子引用两次A的第一行创建新矩阵:
1
2
3
4
5
6F=A([1,2,1], :) F= -6 2 3 7 8 9 -6 2 3
行列式与线性系统求解
几个常用的命令
1.求解矩阵行列式 det(A)
2.求逆矩阵inv(A)
3.求解矩阵的秩rank(A)
注意,求解逆矩阵的时候,要先判断det(A)是否为0
4.求矩阵方程的解,一般用左除的方式
5.当方程组具有无穷的解的时候(即det(A))不是0
此时可以使用伪逆矩阵来解这个方程。pinv(A)
1
2
3
4
5
6
7
8
9
10>>A=[3 -2;6 -2] A= 3 -2 6 -2 >>det(A) ans= -6 ...... 此处省略命令的输入方式
有一种魔方矩阵(幻方)是一种 n 2 n^2 n2形式的矩阵,矩阵的元素从1到 n 2 n^2 n2之间,并且行列的式的行和等于列和,使用magic命令可以计算出来
1
2
3
4
5
6
7
8
9
10
11
12>>A=magic(8) A = 64 2 3 61 60 6 7 57 9 55 54 12 13 51 50 16 17 47 46 20 21 43 42 24 40 26 27 37 36 30 31 33 32 34 35 29 28 38 39 25 41 23 22 44 45 19 18 48 49 15 14 52 53 11 10 56 8 58 59 5 4 62 63 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15此时要化简阶梯型矩阵 需要命令 rref(magic(8)) ans = 1 0 0 1 1 0 0 1 0 1 0 3 4 -3 -4 7 0 0 1 -3 -4 4 5 -7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
矩阵的分解
MATLAB可以快速的对矩阵进行LU,OR或者SVD分解,
对矩阵进行LU分解写成:
[L,U]=lu(A)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16>> A=[-1 2 0;4 1 8;2 7 1]; >> [L,U]=lu(A) L = -0.2500 0.3462 1.0000 1.0000 0 0 0.5000 1.0000 0 U = 4.0000 1.0000 8.0000 0 6.5000 -3.0000 0 0 3.0385
另外我们还可以使用LU分解求线性方程组,假设A是某个方程组的系数矩阵
b=[12 -8 6]’
方程组的解可以通过两次左除得到
x=U(Lb)
1
2
3
4
5
6
7
8
9>> b=[12;-8;6]; >> x=U(Lb) x = -6.9367 2.5316 2.1519
练习题
最后
以上就是务实花卷最近收集整理的关于MATLAB基础学习(02)的全部内容,更多相关MATLAB基础学习(02)内容请搜索靠谱客的其他文章。
发表评论 取消回复