矩阵和数组操作
Matlab中文含义就是矩阵实验室的意思,轻松灵活的处理矩阵式Matlab语言的特色。
概念:
数组:与其它编程语言一样,定义是:相同数据类型元素的集合。
矩阵:数学中早已定义。不再赘述,matlab中处理最多的是二维矩阵
矩阵的创建:
1直接输入
在命令行窗口中定义 A=[1,2,3;4,5,6;7,8,9] 分好是换行,逗号是本行 回车后如下图:
2函数法生成特殊的矩阵
(1)零矩阵:zeros(n) :生成n*n的零矩阵
zeros(n,m): 生成n*m的零矩阵
如下图:
(2)单位矩阵:eye(n): 生成n*n的单位矩阵(对角线元素为1 其余元素为0)
eye(n,m): 生成n*m的单位阵
如下图:
(3)魔方矩阵(行、列、对角线元素和相同):magic()用法和以上函数一样
(4)对角矩阵(对角线上的矩阵非0):dig(1:5) :生成对角线元素为1,2,3,4,5 的5*5矩阵 如下图:
(5)上三角矩阵(对角线以下的元素为0): triu()
(6)下三角元素(对角线元素以上为0): tril()
代码:
>> a=[1,2,3;4,5,6;7,8,9]
a =
1 2 3
4 5 6
7 8 9
>> a=zeros(3,2)
a =
0 0
0 0
0 0
>> a=eye(4)
a =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
>> a=magic(3)
a =
8 1 6
3 5 7
4 9 2
>> a=diag([1:5])
a =
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
0 0 0 0 5
>> b=magic(3)
a=triu(b)
b =
8 1 6
3 5 7
4 9 2
a =
8 1 6
0 5 7
0 0 2
>> b=magic(3)
a=tril(b)
b =
8 1 6
3 5 7
4 9 2
a =
8 0 0
3 5 0
4 9 2
3 矩阵的基本操作
显示矩阵:直接在命令中输入矩阵名称回车即可,或者使用函数disp(矩阵名字) 也可以
矩阵判空:isempty(A) 为空返回1 不空返回0
isequal(A ,B) 判断矩阵A和矩阵B是否相等(矩阵相等当且仅当矩阵行列一样,并且对应元素都相等)
size(A) 获取矩阵行数和列数
length(A) 获取矩阵的长度(行数和列数中的最大值)
numel(A) 获取A矩阵中元素个数之和
ndims(A) 获取A矩阵的维度(注意是维度不是列数)
代码:
>> a=magic(4);
>> a=magic(4);
dsip(a)
未定义与 'double' 类型的输入参数相对应的函数 'dsip'。
是不是想输入:
>> a=magic(4);
disp(a)
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>> b=magic(4);
disp(isequal(A,B))
未定义函数或变量 'A'。
是不是想输入:
>> b=magic(4);
disp(isequal(a,b))
1
>> [m,n]=size(a)
m =
4
n =
4
>> disp(length(a))
4
>> numel(a)
ans =
16
>> ndims(a)
ans =
2
4 访问矩阵元素
圆括号访问:A(3,4) 访问矩阵第三行第四列的元素
A(3) 访问矩阵中按列排列的第3个元素(按列排列也成线性编码,就是第一列排完,再排第二列。。。。依次)
注意:访问矩阵元素在matlab中使用的是圆括号。而在其他高级编程语言中却使用的是方括号[] ,在matlab中方括号[]用到矩阵或者数组定义的使用。
冒号运算符:
冒号运算符很强大,使用频率也很高。A(:,1) 访问矩阵A第一列的所有元素。 A(1,:) 访问矩阵A的第一行的所有元素
A(:,n) 访问矩阵A的第n列元素
A(:,:) 访问矩阵A的所有元素
diag(A) 访问矩阵A的对角线元素
diag(A,k) 访问矩阵A的第K条对角线元素(主对角线为第0条)、
end A(1,2:end) 访问矩阵A的第一行的第二列到最后一列的元素
A(end,end) 访问矩阵A的最后一个元素
find() 查找矩阵中满足一定条件的元素
index=find(A) 查找矩阵A中非零的元素,并返回矩阵中非零元素的线性索引(按列排列)
[m,n]=find(A==1) 查找矩阵A中等于1的元素的行列下标 行给m 列给n
[m,n]=find(A==1,k) 查找矩阵A等于1的元素的行列下标,返回前K个满足要求的元素的下标
连接矩阵:
[A,B] 水平方向上连接两个矩阵
[A;B] A在上,B在下,垂直方向上连接矩阵
矩阵求逆: A’ 即是矩阵A的逆矩阵
改变矩阵大小(假若A是3*3的矩阵):A(:,4)=1 向矩阵A中添加第四列元素,并赋值为1 ,A变成3*4的矩阵。
A(4,1)=1 :第四行第一列为1,剩余的矩阵A的第四行元素为0
矩阵大小重排:reshape(A ,m,n) 用于重新排列矩阵A,返回大小m*n的矩阵,前提是A的行列乘积=m*n
repmat() 复制矩阵函数 B=repmat(A,m,n) 将A当做一个整体单元,复制成大小为m*n的矩阵
B=unique(A) 去除矩阵A中重复的元素,将不重复的元素从小到大排列传给B,B以向量形式接受
代码:
>> a=magic(5)
a =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
>> a(1,2)
ans =
24
>> a(:,1)
ans =
17
23
4
10
11
>> diag(a)
ans =
17
5
13
21
9
>> diag(a)
ans =
17
5
13
21
9
>> diag(a,1)
ans =
24
7
20
3
>> a(1,end)
ans =
15
>> a(:,end)
ans =
15
16
22
3
9
>> a(2,2:end)
ans =
5 7 14 16
>> a(end,end)
ans =
9
>> index=find(a)
index =
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
>> find(a>10)
ans =
1
2
5
6
9
10
13
14
15
17
18
19
21
22
23
>> [m,n]=find(a==1)
m =
1
n =
3
>> a=[1,2,3;4,5,6]
a =
1 2 3
4 5 6
>> b=[7,8,9;1,2,3]
b =
7 8 9
1 2 3
>> [a,b]
ans =
1 2 3 7 8 9
4 5 6 1 2 3
>> [a;b]
ans =
1 2 3
4 5 6
7 8 9
1 2 3
>> a=magic(3)
a =
8 1 6
3 5 7
4 9 2
>> a'
ans =
8 3 4
1 5 9
6 7 2
>> a(4,1)=2
a =
8 1 6
3 5 7
4 9 2
2 0 0
>> a(:,4)=1
a =
8 1 6 1
3 5 7 1
4 9 2 1
2 0 0 1
>> a=[1:12]
a =
1 2 3 4 5 6 7 8 9 10 11 12
>> reshape(a,3,4)
ans =
1 4 7 10
2 5 8 11
3 6 9 12
>> a=[1,2;3,4]
a =
1 2
3 4
>> repmat(a,2,2)
ans =
1 2 1 2
3 4 3 4
1 2 1 2
3 4 3 4
>> a=repmat(a,2,2)
a =
1 2 1 2
3 4 3 4
1 2 1 2
3 4 3 4
>> a=unique(a)
a =
1
2
3
4
矩阵加减乘除乘方运算
A+B 矩阵加(要求A,B有相同的行列数)
A-B 矩阵减(要求A,B有相同的行列数)
A+1(标量) 矩阵加标量 等价于矩阵的每一个元素都加上标量
A*B 矩阵的乘法 前提是矩阵A的列数等于矩阵B的行数
A.*B A点乘B A矩阵的元素乘上B矩阵对应位置的元素(前提是矩阵行列数一样)
A*标量 矩阵A中的每一个元素都乘以标量
A/B 右除 计算Bx=A
AB 左除 计算Ax=B
(区分左除还是右除很简单,就是看除号往那边倒,哪边就是除数)同样左除和右除也在数值的计算中,如1/2 12
A^2 矩阵乘方运算,A*A
A.^2 矩阵的点乘方运算 矩阵A中每一个元素的平方
det(A) 求矩阵A的行列式
inv(A) 求矩阵A的逆
rank(A) 求矩阵A的秩
[v,d]=eig(A) 求矩阵A的特征值和特征向量, V是矩阵,每一列对应一个特征向量,d是特征向量对应的特征值。
C=A>B 判断A中的元素是否大于B中的元素,返回一个大小一样的矩阵,在其对应的位置上赋值,1表示大于,0表示不大于。
C=A<B 原理和上述一样
C=find(A>k) 将矩阵A中大于k的元素按照线性编码传入C中。
数组和向量的一些运算和矩阵的运算基本一致,向量就是一个一维的数组,而数组运算无非就比矩阵运算多了个关系和逻辑运算。在matlab中我们使用最多的就是向量和矩阵
代码:
>> a=[1,2,3;4,5,6]
a =
1 2 3
4 5 6
>> b=[1,1,1;8,10,12]
b =
1 1 1
8 10 12
>> a+b
ans =
2 3 4
12 15 18
>> a-b
ans =
0 1 2
-4 -5 -6
>> a./b
ans =
1.0000 2.0000 3.0000
0.5000 0.5000 0.5000
>> a/b
ans =
-3.0000 0.5000
-0.0000 0.5000
>> a
ans =
3.0000 4.0000 5.0000
0 0 0
-0.6667 -1.0000 -1.3333
>> a.
ans =
1.0000 0.5000 0.3333
2.0000 2.0000 2.0000
>> a^2
错误使用 ^
输入必须为标量和方阵。
要按元素进行 POWER 计算,请改用 POWER (.^)。
>> a=[1,2,3;4,5,6;7,8,9]
a =
1 2 3
4 5 6
7 8 9
>> a^2
ans =
30 36 42
66 81 96
102 126 150
>> a.^2
ans =
1 4 9
16 25 36
49 64 81
>> det(a)
ans =
6.6613e-16
>> a=ones(3)
a =
1 1 1
1 1 1
1 1 1
>> det(a)
ans =
0
>> inv(a)
警告: 矩阵为奇异工作精度。
ans =
Inf Inf Inf
Inf Inf Inf
Inf Inf Inf
>> a=dig(3)
未定义与 'double' 类型的输入参数相对应的函数 'dig'。
是不是想输入:
>> a=diag(3)
a =
3
>> a=eye(3)
a =
1 0 0
0 1 0
0 0 1
>> det(a)
ans =
1
>> inv(a)
ans =
1 0 0
0 1 0
0 0 1
>> rank(a)
ans =
3
>> [v,d]=eig(a)
v =
1 0 0
0 1 0
0 0 1
d =
1 0 0
0 1 0
0 0 1
>> a=[1,2,3;3,2,1;4,5,6]
a =
1 2 3
3 2 1
4 5 6
>> b=magic(3)
b =
8 1 6
3 5 7
4 9 2
>> c=a>b
c =
0 1 0
0 0 0
0 0 1
>> a<b
ans =
1 0 1
0 1 1
0 1 0
>> a==b
ans =
0 0 0
1 0 0
1 0 0
>> a=[1,2,3;4,5,6]
a =
1 2 3
4 5 6
>> find(a)
ans =
1
2
3
4
5
6
>> v=find(a)
v =
1
2
3
4
5
6
>> v=find(a)
v =
1
2
3
4
5
6
>> v=find(a>2)
v =
2
4
5
6
>> a=3
a =
3
>> ~a
ans =
0
>>