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

posted @ 2019-04-16 21:20  kafm  阅读(759)  评论(0编辑  收藏  举报