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