MATLAB基础(二):变量与矩阵
MATLAB中的变量
预定义变量
预定义变量是系统本身定义的变量
ans表示默认赋值变量,若输入计算表达式而未将运算结果赋值,自动赋值给ans
i 和 j 表示虚数单位
pi代表圆周率
NaN代表非数值(在画图时,将某部分图形的坐标数据赋值为NaN即可裁掉该部分)
避免对预定义变量直接进行赋值
变量的管理
①在工作区中可以方便的修改、删除变量
②who命令与whos命令
>> clear
>> num=1:100;
>> index = num(3);
>> x = 3+5i
x =
3.0000 + 5.0000i
>> who
您的变量为:
index num x
>> whos
Name Size Bytes Class Attributes
index 1x1 8 double
num 1x100 800 double
x 1x1 16 double complex
内存变量文件
用于保存MATLAB工作区变量的文件,扩展名为.mat,是二进制文件
save命令:创建、保存内存变量文件
save 文件名 变量名 [变量名] …
load命令:加载内存变量文件
load 文件名
另 load命令 加载的变量如果与当前内存变量重名则会覆盖当前变量
MATLAB 矩阵的表示
MATLAB起源于矩阵运算,矩阵是最基本的数据对象,MATLAB的大部分运算或者命令都是在矩阵运算的意义下执行的
矩阵的建立
①直接建立
A = [1,2,3;4,5,6;7,8,9];
A = [1 2 3;4 5 6;7 8 9];
A =
1 2 3
4 5 6
7 8 9
②由已有矩阵建立
>> A = [A A A]
A =
1 2 3 1 2 3 1 2 3
4 5 6 4 5 6 4 5 6
7 8 9 7 8 9 7 8 9
③由运算结果得到矩阵
>> A = [1,2,3;4,5,6;7,8,9];
>> B = A;
>> C = A + B*i
C =
1.0000 + 1.0000i 2.0000 + 2.0000i 3.0000 + 3.0000i
4.0000 + 4.0000i 5.0000 + 5.0000i 6.0000 + 6.0000i
7.0000 + 7.0000i 8.0000 + 8.0000i 9.0000 + 9.0000i
向量的产生
①冒号表达式
冒号表达式可用来获取行向量(矩阵的特例)
格式:初始值[:步长]:终止值 步长缺省值为1
>> T = 0:1:5 或 T = 0:5
T =
0 1 2 3 4 5
② linspace函数
linspace(起始值,终止值 [,元素个数]) 元素总数缺省值为100
从起始值到终止值将数值等差均匀划分
>> T = linspace(1,2,10)
T =
1 至 3 列
1.000000000000000 1.111111111111111 1.222222222222222
4 至 6 列
1.333333333333333 1.444444444444444 1.555555555555556
7 至 9 列
1.666666666666667 1.777777777777778 1.888888888888889
10 列
2.000000000000000
由第5列从1.444…变为1.55…6可以看出 MATLAB是非常严格的
那么,元素个数与步长的关系呢?
步长 = 总长度 / 步长个数
步长 = (终止值 - 起始值)/(元素个数 - 1)
即 元素个数 = (终止值 - 起始值)/ 步长
以上两种方法产生的均是行向量
结构矩阵
结构矩阵即结构体数组 类型为struct
依次赋值 创建结构矩阵
>> stu(1).name = 'laji';stu(1).gender = 'boy';stu(1).mark = 100;
>> stu(2).name = 'kafm';stu(2).gender = 'boy';stu(2).mark = 90;
>> stu(3).name = 'kadm';stu(3).gender = 'boy';stu(3).mark = 90;
单元矩阵
结构矩阵虽然存储了类型不同的数据,实际上它的每个元素的类型还是相同的
而单元矩阵的元素就是由不同类型的数据组成的
单元矩阵类型为cell
建立单元矩阵和一般矩阵相似,只是单元矩阵元素需要用大括号括起来
m = {1,2.5,'c',{1,2}}
m =
1×4 cell 数组
{[1]} {[2.500000000000000]} {'c'} {1×2 cell}
>> nums(1).a=1;nums(1).b=2;
>> m(5)= {nums(1)}
m =
1×5 cell 数组
1 至 4 列
{[1]} {[2.500000000000000]} {'c'} {1×2 cell}
5 列
{1×1 struct}
>> m = {m;m}
m =
2×1 cell 数组
{1×5 cell}
{1×5 cell}
矩阵元素的引用方式
①通过下标引用
MATLAB列优先存储
A = [1,2,3;4,5,6];
A(1,2)为第一行第二列的元素 2
此时若执行语句 A(4,5) = 10
>> A(4,5)=10
A =
1 2 3 0 0
4 5 6 0 0
0 0 0 0 0
0 0 0 0 10
矩阵会自动扩充至4行5列,且未赋值元素初始化为0
②通过序号引用
A = [1,2,3;4,5,6];
则 A(1) 为1,A(2)为4,A(3)为2
序号与下标是一一对应的,A(i, j)的序号为(j-1)×m+i
MATLAB提供了下标与序号相互转换的函数
sub2ind函数 将给出的下标转换为序号
函数原型:sub2ind([矩阵行数,列数], I, J)
参数列表为 矩阵的行列向量,需要转换的行下标(矩阵),需要转换的列下标(矩阵)
A =
1 2 3 0 0
4 5 6 0 0
0 0 0 0 0
0 0 0 0 10
>> sub2ind(size(A),[1,2;2,3],[1,4;2,2])
ans =
1 14
6 7
ind2sub函数 将矩阵元素的序号转换为对应的下标
[I, J] = ind2sub([矩阵行数,列数], 序号)
使用冒号表达式获得子矩阵
A( 起始行 [:步长] : 终止行, 起始列 [:步长] : 终止列 )
获取从起始行到终止行,起始列到终止列范围内的子矩阵
end运算符, 表示某一维的最后一个下标
A(i, : ) //第i行
A( : , j) //第j列
A(i:i+m, k:k+m) //第i到i+m行 的 第k列到k+m列
A(i:i+m, 2:end ) //第i到i+m行 的 第2列到最后一列
A(1:2:5, : ) //取第1,3,5行
使用空矩阵删除矩阵的元素
空矩阵是指没有任何元素的矩阵
>>x=[]
将矩阵元素赋值为 [],即删除该元素
A =
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
>> A(:, 4:end)=[]
A =
1 2 3
6 7 8
11 12 13
>> A(end, end)=[]
空赋值只能具有一个非冒号索引。
>> A(1,1)=[]
空赋值只能具有一个非冒号索引。
>> A(1:1,1:1)=[]
空赋值只能具有一个非冒号索引。//只能整行、整列删除元素
改变矩阵的形状
reshape(A, m, n)
按照矩阵元素存储顺序(列优先),将原矩阵A重新排列为 m × n 的二维矩阵
>> re=1:12
re =
1 至 11 列
1 2 3 4 5 6 7 8 9 10 11
12 列
12
>> re = reshape(re,3,4)
re =
1 4 7 10
2 5 8 11
3 6 9 12
//明明列优先存储,re=1:12建立的还是行向量,。。。人格分裂
A( : )
将矩阵的每一列元素堆叠起来,组成一个列向量
等价于 reshape(A, numel(A), 1)
numel()返回矩阵的元素个数
re =
1 4 7 10
2 5 8 11
3 6 9 12
>> re(:)
ans =
1
2
3
4
5
6
7
8
9
10
11
12
//这下re=1:12解释为行向量 没那么别扭了
2019/4/16