数组+矩阵
意义
简化标量重复运算,可结合线性代数理解
数组->矩阵
>> v3 = [1,2;3,4;5,6]
v3 =
1 2
3 4
5 6
数组的创建
普通定义方法
%% 定义一个数组的不同方法
>> x1 = [1,2,3,4,5,6,7,8,9,10]; %用逗号隔开
>> x2 = [10 9 8 7 6 5 4 3 2 1]; %用空格隔开
>> x3 = 1:1:10; %(初始值,增加(可正可负),终止值)
linspace()函数
>> x4 = linspace(1,89,10)(起始值,终止值,元素个数);(平均分非常好)
>> x4 =
1 至 8 列
1.0000 10.7778 20.5556 30.3333 40.1111 49.8889 59.6667 69.4444
9 至 10 列
79.2222 89.0000
%%增量 = (末 - 初)/(元素数量-1)
logspace()函数:用于构造以十为底的指数
>> x3 = logspace(1,2,3)
x3 =
10.0000 31.6228 100.0000
复数数组的创建
>> x5 = x1+i*x2; %复数的数组,因为用空格隔开元素,所以复数不可出现空格;
>> x5
x5 =
1 至 4 列
1.0000 +10.0000i 2.0000 + 9.0000i 3.0000 + 8.0000i 4.0000 + 7.0000i
5 至 8 列
5.0000 + 6.0000i 6.0000 + 5.0000i 7.0000 + 4.0000i 8.0000 + 3.0000i
9 至 10 列
9.0000 + 2.0000i 10.0000 + 1.0000i
>>
数组编址
与c的区别,第一个元素对应编址 “1”,
可用如下方式访问数组元素:
>> x1(5)
ans =
5
>> x1(1:2:10) %访问1到10的所有奇数
ans =
1 3 5 7 9
>> x1(10:-2:3)
ans =
10 8 6 4
>> x2([2,4,3,1]) %[2,4,3,1]本身也是一个数组,访问该数组对应的地址上的元素
ans =
9 7 8 10
矩阵编址
>> v1(1,2) % 前为行后为列
ans =
2
用数组以及数组编址来构建数组
>> y1 = x1(2:3);
>> y2 = x2(10:-1:6);
>> y3 = [y1,y2];
>> y3
y3 =
2 3 1 2 3 4 5
数组方向
行向量与列向量
>> x1 = 1:10 %行向量
x1 =
1 2 3 4 5 6 7 8 9 10
>> x2 = [1;2;3] %列向量
x2 =
1
2
3
转置与点转置
>> x2' %列向量转置变成行向量
ans =
1 2 3
% 复数的转置与点转置
>> x1 = x4([1:3])
x1 =
1.0000 +10.0000i 2.0000 + 9.0000i 3.0000 + 8.0000i
>> x1'
ans =
1.0000 -10.0000i
2.0000 - 9.0000i
3.0000 - 8.0000i
>> x1.'
ans =
1.0000 +10.0000i
2.0000 + 9.0000i
3.0000 + 8.0000i
对于实数来说,‘ 与 .’ 是等价的
数组运算
标量-数组运算
标量与数组直接运算,遵循数学运算优先级,对数组相当于对元素直接运算
>> v3
v3 =
1 2
3 4
5 6
>> v3 - 1
ans =
0 1
2 3
4 5
>> v3*4 + 2
ans =
6 10
14 18
22 26
数组-数组运算(矩阵相关运算)
加法:对应元素相加
v4 =
2 3
4 5
6 7
>> v3
v3 =
1 2
3 4
5 6
>> v3 + v4 %对应元素相加
ans =
3 5
7 9
11 13
矩阵乘法:点乘与矩阵乘法
>> v3
v3 =
1 2
3 4
5 6
>> v4
v4 =
2 3
4 5
6 7
>> v3.*v4 %带点乘法,各元素相乘
ans =
2 6
12 20
30 42
>> v5 = v4'% 转置,使前列等于后行
v5 =
2 4 6
3 5 7
>> v4*v5%矩阵乘法
ans =
13 23 33
23 41 59
33 59 85
>>
矩阵除法 1 == 乘于逆矩阵(左除与右除)
>> v2*pinv(v1) %pinv()求奇异矩阵或长方阵的逆
ans =
-0.3333 0.3333
-0.6667 0.6667
>> v2/v1
ans =
-0.3333 0.3333
-0.6667 0.6667
>> v1\v2
ans =
0.0000 0.0000 0.0000
0 0 0
0.3333 0.3333 0.3333
>> v2\v1
警告: 秩亏,秩 = 1,tol = 1.489520e-15。
ans =
1.8000 2.4000 3.0000
0 0 0
0 0 0
>>
求幂运算:
%必须带点.^n,不带点会报错
>> v1.^2
ans =
1 4 9
16 25 36
数组(矩阵)操作2
元素赋值
v1 =
1 2 3
4 5 6
>> v1(1,2) = 0 % 单独对第一行第二列元素进行赋值
v1 =
1 0 3
4 5 6
>> v1(1,:) = 1 % 对第一行全部元素进行赋值 1
v1 =
1 1 1
4 5 6
>> v1(:,1) = 2 % 对第一列全部元素进行赋值 2
v1 =
2 1 1
2 5 6
改变矩阵大小
%添加
>> v1(4,5) = 3 % 当行列不够时自动添加
v1 =
2 1 1 0 0
2 5 6 0 0
0 0 0 0 0
0 0 0 0 3
%删除
>> v1
v1 =
2 5 6 0 0
0 0 0 0 3
>> p
p =
1 3
>> v1(:,p) = [] % 删除矩阵的第一三列
v1 =
5 0 0
0 0 3
>>
排列子块
%% 逆序
>> v1(4:-1:1,1:5) %元素逆序 == v1(4:-1:1,:)" : "表示取所有
ans =
0 0 0 0 3
0 0 0 0 0
2 5 6 0 0
2 1 1 0 0
>> v1(4:-1:1,5:-1:1)
ans =
3 0 0 0 0
0 0 0 0 0
0 0 6 5 2
0 0 1 1 2
提取子块
% 提取子块,然后构造数组
>> q = [v1 v2(:,2:3)]
q =
2 1 1 0 0 1 1
2 5 6 0 0 2 2
0 0 0 0 0 0 0
0 0 0 0 3 0 0
>> p = [v1;v2(2:3,:)] % 一样用分号隔开列
p =
2 1 1 0 0
2 5 6 0 0
0 0 0 0 0
0 0 0 0 3
2 2 2 0 0
0 0 0 0 0
% 用数组索引提取子块
v1 =
2 1 1 0 0
2 5 6 0 0
0 0 0 0 0
0 0 0 0 3
>> p = [1,3] % 用p作索引
p =
1 3
>> v1(p,p)
ans =
2 1
0 0
%依次提取每一列
>>o =
1 3
1 3
>> o(:)
ans =
1
1
3
3
总结
所有操作都离不开数组编址,不够自动补,删除可以用空序列
子序列查找
find()函数
%返回满足条件元素的行坐标列坐标
v1 =
1 3
1 3
>> find(v1>1)
ans =
3
4
>> [g,h] = find(v1>1)
g =%行数
1
2
h =%列数
2
2
用矩阵做索引,找出对应元素
>> X = find(v1>1)
X =
3
4
>> v1(X)
ans =
3
3
矩阵大小
whos函数,查看大小与类型
>> whos
Name Size Bytes Class Attributes
v1 2x2 32 double
v2 4x5 160 double
size函数查看行列数
%返回行列数
>> size(v1)
ans =
2 2
>> v1
v1 =
1 3
1 3
%返回行数
>> size(v1,1) % 返回第一个变量,为行数
ans =
2
length()查看max(row,column)
>> length(v2)
ans =
5
>> v2
v2 =
1 1 1 0 0
2 2 2 0 0
0 0 0 0 0
0 0 0 0 0
常见数组操作函数
函数 | 用途 |
---|---|
flipud() | 矩阵上下翻转 |
fliplr() | 矩阵左右翻转 |
rot90() | 矩阵逆时针旋转90度 |
reshape(x,m,n) | 对矩阵的元素进行重新排列 |
diag(X) | 提取矩阵X的对角元素,形成一个列向量 |
diag(v) | 用该向量构成一个对角矩阵 |
tril(X) | 提取矩阵的下三角矩阵 |
triu() | 提取矩阵的上三角矩阵 |
circshift(x,m) | 矩阵循环移位(最下一行移到最上面一行) |