MATLAB的矩阵运算
本人今天主要学习的内容是:
1.矩阵运算的基本规则
2.从矩阵中提取数据
3.利用矩阵变量进行数值计算
4.创建和使用特殊矩阵
1.矩阵的定义
1)直接定义矩阵有两种定义方式均可
>> C = [1,2,3;3,4,5;4,5,6]
C =
1 2 3
3 4 5
4 5 6
>> C = [1,2,3
3,4,5
4,5,6]
C =
1 2 3
3 4 5
4 5 6
2)如果一行有太多的元素需要跨行去写,则省略号表示本行未完,转入下一行
>> A = [1,2,3,...
3,4,5]
A =
1 2 3 3 4 5
3)可以用已经定义的矩阵来定义其他矩阵
>> B = [1,2];
>> S = [3,B]
S =
3 1 2
>> T = [30,10,20;S]
T =
30 10 20
3 1 2
4)可以通过圆括号加标号来修改矩阵元素的值
>> S(1) = 0
S =
0 1 2
5)可以通过圆括号加标号来增加矩阵元素
>> S(4) = 5
S =
0 1 2 5
>> S(8) = 8
S =
0 1 2 5 0 0 0 8
2.冒号的使用
1)可以使用冒号定义等差矩阵,使用两个参数或者三个参数。两个参数的默认步长为1,三个参数的步长为第2个参数
>> H = 1:8
H =
1 2 3 4 5 6 7 8
>> time = 0.0:0.5:2.0
time =
0 0.5000 1.0000 1.5000 2.0000
2)提取数据功能。个人以为类似于Python中的list的切片功能,只不过这里是矩阵而不是数组。
定义矩阵:
>> M = [1,2,3,4,5;
2,3,4,5,6;
3,4,5,6,7]
M =
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
提取第一列:
>> x = M(:,1)
x =
1
2
3
提取第四列:
>> y = M(:,4)
y =
4
5
6
提取第一行
>> z = M(1,:)
z =
1 2 3 4 5
提取第二行和第三行:
>> w = M(2:3,:)
w =
2 3 4 5 6
3 4 5 6 7
提取第2行和第3行中第4列和第5列的元素:
>> w = M(2:3,4:5)
w =
5 6
6 7
使用M(:)可以把原矩阵转换成一个长的列矢量,注意,原矩阵并没有改变其存储方式,仅仅是表示形式而已:
>> M(:)
ans =
1
2
3
2
3
4
3
4
5
4
5
6
5
6
7
>> M
M =
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
提取单个元素,既可以用行下标和列下标来提取,也可以直接使用序号来提取。序号是指从M(:)中的第几个元素。如下例中两种方法是等价的
>> M(2,3)
ans =
4
>> M(8)
ans =
4
3.特殊矩阵
1)全零矩阵zeros
>> zeros(3)
ans =
0 0 0
0 0 0
0 0 0
>> zeros(3,2)
ans =
0 0
0 0
0 0
>>
2)全1矩阵ones
>> ones(3)
ans =
1 1 1
1 1 1
1 1 1
>> ones(3,2)
ans =
1 1
1 1
1 1
>>
【注】全0矩阵和全1矩阵常用作占位矩阵,用于程序的循环结构,这样可以提高运行速度
>> ones(1,5)
ans =
1 1 1 1 1
>> b = ans * pi
b =
3.1416 3.1416 3.1416 3.1416 3.1416
>> zeros(1,5)
ans =
0 0 0 0 0
>> b = ans + pi
b =
3.1416 3.1416 3.1416 3.1416 3.1416
>>
3)对角矩阵
用函数diag
可以提取矩阵主对角线上的元素
>> A = [1,2,3;3,4,5;1,2,3]
A =
1 2 3
3 4 5
1 2 3
>> diag(A)
ans =
1
4
3
用diag使用两个参数可以提取非主对角线上的元素,正数代表主对角线上方,负数代表主对角线下方。
>> A
A =
1 2 3
3 4 5
1 2 3
>> diag(A,1)
ans =
2
5
>> diag(A,-1)
ans =
3
2
>>
若输入的是矢量而不是矩阵,则函数diag会把矢量作为对角线元素而生成一个新的矩阵,并将矩阵的其他元素置零
>> B = [1,2,3];
>> diag(B)
ans =
1 0 0
0 2 0
0 0 3
>>
通过定义第二个参数,可以把矢量中的元素定义成矩阵中的任何一个对角线
>> diag(B,1)
ans =
0 1 0 0
0 0 2 0
0 0 0 3
0 0 0 0
4)魔方矩阵
函数 | 用法 |
---|---|
fliplr | 对矩阵的列进行左右对称翻转 |
flipud | 对矩阵的行进行上下对称翻转 |
magic(m) | 创建一个m*m的魔方矩阵 |
魔方矩阵时一种很有趣但是没有实际用途的特殊矩阵,在魔方矩阵中,所有的行列已经对角线元素之和均相等
>> A = magic(4)
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>> sum(A) %按列求和
ans =
34 34 34 34
>> sum(A') %转置后按列求和
ans =
34 34 34 34
>> sum(diag(A)) %对角线元素求和
ans =
34
>> fliplr(A) %对矩阵的列进行左右对称翻转
ans =
13 3 2 16
8 10 11 5
12 6 7 9
1 15 14 4
>> sum(diag(A)) %对角线元素的和
ans =
34
>>
MATLAB中可以产生任何大于2*2的魔方矩阵,魔方矩阵的解不是唯一的,也可能有其他的解。