MATLAB 之 数值数据,矩阵的表示和变量及其操作

  • MATLAB 数据类型较为丰富既有数值型、字符串等基本数据类型又有结构Structure、单元Cell等复杂的数据类型。
  • 在 MATLAB 中没有专门的逻辑型数据而以数值 1 (非零表示真以数值 0 表示假。
  • MATLAB 各种数据类型都以矩阵形式存在所以矩阵是 MATLAB 最基本的数据对象形式。

一、数值数据

  • MATLAB 数值数据是最基本的一种数据类型有整型、浮点型和复数型。系统给每种数据类型分配不同个数字节的内存单元由此决定了数据的表示范围。

1. 数值数据类型的分类

1.1 整型

  • 整形数据是不带小数的数有带符号整数和无符号整数之分。下表列出了各种整型数据的取值范围和对应的转换函数。
类型取值范围转换函数类型取值范围转换函数
无符号 8 位整型0~28-1uint8无符号 16 位整型0~26-1uint16
无符号 32 位整型0~232-1uint32无符号 64 位整型0~264-1uint64
带符号 8 位整型-27~27-1int8带符号 16 位整型-215~215-1int16
带符号 32 位整型-231~231-1int32带符号 64 位整型-263~263-1int64
  • 例如
>> x=int8(129)

x =

  int8

   127

>> x=int16(129)

x =

  int16

   129

  • 带符号 8 位整型数据的最大值是 127int8 函数转换时只输出最大值因此129 在使用 int8 函数转化为带符号的 8 位整型时输出 127而转换为带符号 16 位整型仍是 129。

1.2 浮点型

  • 浮点型数据有单精度single和双精度double之分单精度型实数在内存中占用 4 个字节双精度型实数在内存中占用 8 个字节双精度型的数据精度更高。在 MATLAB 中数据默认为双精度型。
  • single 函数可以将其他类型的数据转换为单精度型double 函数可以将其他类型的数据转换为双精度型。

1.3 复型

  • 复型数据包括实部和虚部两个部分实部和虛部默认为双精度型。
  • 在 MATLAB 中虚数单位用 i 或 j 表示。例如6+5i 与 6+5j 表示的是同一个复数也可以写成 6+5 * i 或 6+5 * j 这里将 i 或 j 看作一个运算量参与表达式的运算。
  • 如果构成一个复数的实部或虚部不是常量则使用 complex 函数生成复数。例如complex(2,x) 生成一个复数其实部为 2虚部为 x。
  • 可以使用 real 函数求复数的实部imag 函数求复数的虚部abs 函数求复数的模angle 函数求复数的幅角conj 函数求复数的共轭复数。
  • 例如
>> x=3;
>> y=complex(2,x)  %转换为复数

y =

   2.0000 + 3.0000i

>> real(y)  %复数的实部

ans =

     2

>> conj(y)  %复数的共轭

ans =

   2.0000 - 3.0000i
   
>> imag(y)  %复数的虚部

ans =

     3

>> angle(y)  %复数的幅角

ans =

    0.9828

  • 也可以使用 class 函数获取某个数据的类型。例如
>> class(9)

ans =

    'double'

  • 该结果表明MATLAB 数值数据默认位双精度型。

2. 数据的输出格式

  • MATLAB 用十进制数表示一个常数具体可采用日常记数法和科学记数法两种表示方法。如 3.14159、 -9.359i、3+5i 是采用日常记数法表示的常数与通常的数学表示一样。
  • 又如 1.78029e2、6.732E2i、1234e-3-5i 是采用科学记数法表示的常数在这里用字母 e 或 E 表示以 10 为底的指数。
  • 在一般情况下MATLAB 内部每一个数据元素都是用双精度数来表示和存储的。数据输出时用户可以用 format 命令设置或改变数据输出格式。forma t命令的格式如下:
  format 格式符
  • 其中格式符决定数据的输出格式各种格式符及其含义如下表所示。
格式符含义
short输出小数点后 4 位最多不超过 7 位有效数字。对于大于 1000 的实数用 5 位有效数字的科学记数形式输出
long15 位有效数字形式输出
short e5 位有效数字的科学记数形式输出
long e15 位有效数字的科学记数形式输出
short g从 short 和 short e 中自动选择最佳输出方式
long g从 long 和 long e 中自动选择最佳输出方式
rat近似有理数表示
hex十六进制表示
+正数、负数、零分别用 +、-、空格表示
bank银行格式用元、角、分表示
compact输出变量之间没有空行
loose输出变量之间有空行
  • 这里需要注意的是format 命令只影响数据输出格式而不影响数据的计算和存储。
  • 如果输出矩阵的每个元素都是纯整数MATLAB 就用不加小数点的纯整数格式显示结果。
  • 只要矩阵中有一个元素不是纯整数MATLAB 将按当前的输出格式显示计算结果。
  • 如果 format 命令后面不加格式符则回到默认输出格式。默认的输出格式是 short 格式。
  • 假定输入以下命令
>> x=4/3
  • 那么在各种不同的格式符下的输出结果如下。
  • 1 短格式short1.3333。
  • 2 短格式 e 方式short e1.3333e+00。
  • 3 长格式long1.3333333333333。
  • 4 长格式 e 方式long e1.3333333333333e+00。
  • 5 银行格式bank1.33。
  • 6 十六进制格式hex3555555555555。
  • 7 + 格式++。
  • 注意hex 输出格式是把计算机内部表示的数据用十六进制数输出。对于整数不难理解但对于单精度或双精度浮点数MATLAB 默认的数据类型就涉及数据在计算机内部的表示形式。
  • 单精度浮点数在内存中占 32 个二进制位其中 1 位为数据的符号位以 0 代表正数1 代表负数8 位为指数部分23 位为尾数部分。
  • 指数部分表示 2 的多少次幂存储时加上 127也就是说 20 用 127即二进制数 111111表示。尾数部分是二进制小数其所占的 23 位是小数点后面的部分小数点前面还有一个隐含的 1 并不存储。
  • 双精度浮点数占 64 位二进制其中 1 位为符号位11 位指数位52 位尾数位其存储方式与单精度数类似。

在这里插入图片描述

>> format hex
>> single(-4.25)

ans =

  single

  c0880000

  • -4.25 可以转化为二进制数 -100.01也就是 -1.0001×100。
  • 这里是采用 hex 十六进制表达-4.25 的二进制表达方式位 1100 0000 1000 1000 0000 0000 0000 0000因此输出就是 C0880000。

二、矩阵的表示

  • 矩阵是 MATLAB 最基本的数据对象MATLAB 的大部分运算或命令都是在矩阵运算的意义下执行的。在 MATLAB 中不需要对矩阵的维数、大小和类型进行说明MATLAB 会根据我们所输入的内容自动进行配置。

1. 矩阵的建立

1.1 直接输入法建立矩阵

  • 最简单的建立矩阵的方法是从键盘直接输入矩阵的元素。具体方法是将矩阵的元素用中括号括起来按矩阵行的顺序输入各元素同一行的各元素之间用逗号或空格分隔不同行的元素之间用分号分隔。例如
>> A=[1,2,3;4,5,6;7,8,9]

A =

     1     2     3
     4     5     6
     7     8     9

  • 这样在 MATLAB 的工作空间中就建立了一个矩阵 A以后就可以直接使用矩阵 A。同时复数矩阵的建立方式和常规矩阵的建立方式相同。
>> B=[2+3i,5;3-5j,6j]

B =

   2.0000 + 3.0000i   5.0000 + 0.0000i
   3.0000 - 5.0000i   0.0000 + 6.0000i

1.2 已建好的矩阵建立更大的矩阵

  • 大矩阵可以通过小矩阵拼接而成。例如
>> A=[1,2,3;4,5,6;7,8,9];
>> B=[-1,-2,-3;-4,-5,-6;-7,-8,-9];
>> C=[A,B;B,A]

C =

     1     2     3    -1    -2    -3
     4     5     6    -4    -5    -6
     7     8     9    -7    -8    -9
    -1    -2    -3     1     2     3
    -4    -5    -6     4     5     6
    -7    -8    -9     7     8     9

  • 与直接建立矩阵一样我们还可以使用实部矩阵和虚部矩阵构成复数矩阵。例如
>> A=[1,2,3;4,5,6];
>> B=[6,7,8;9,10,11];
>> RI=A+B*i

RI =

   1.0000 + 6.0000i   2.0000 + 7.0000i   3.0000 + 8.0000i
   4.0000 + 9.0000i   5.0000 +10.0000i   6.0000 +11.0000i

  • 需要注意的是在这里 i 是单个数据B*i 表示一个矩阵与一个数相乘。

2. 冒号表达式

  • 在 MATLAB 中利用冒号表达式可以产生行向量一般格式如下
   e1:e2:e3
  • 其中e1 为初始值e2 为步长e3 为终止值。冒号表达式可以产生一个由 e1 开始到 e3 结束以步长 e2 自增的行向量。例如
>> A=0:1:5

A =

     0     1     2     3     4     5

  • 其中产生一个行向量 A从 0 开始增长到 5步长为 1各元素为 0、1、2、3、4、5。
  • 需要注意的是在冒号表达式中如果省略 e2 不写则步长默认为 1。例如A=0:5 和 A=0:1:5 等价。
  • 在 MATLAB 中还可以用 linspace 函数产生行向量其调用格式如下
   linspace(a,b,n)
  • 其中a 和 b 是生成向量的第一个和最后一个元素 n 是元素总数。当 n 省略时自动产生 100 个元素。显然linspace(a,b,n) 与 a:(b-a)/(n-1):b 等价。例如
>> x=linspace(0,pi,6)

x =

         0    0.6283    1.2566    1.8850    2.5133    3.1416

3. 矩阵元素的引用

3.1 矩阵元素的引用方式

  • 在很多情况下需要对矩阵的单个元素进行操作。矩阵元素可以通过下标Subscript来引用下标必须为正整数。例如A3,2表示 A 矩阵第 3 行第 2 列的元素如果要将该元素赋为 200则可以通过下面的命令来完成
>> A(3,2)=200

A =

     0     0
     0     0
     0   200

  • 这时将只改变该元素的值而不影响其他元素的值。如果给出的行下标或列下标大于原来矩阵的行数和列数则 MATLAB 将自动扩展原来的矩阵并将扩展后未赋值的矩阵元素置为 0。例如
>> A=[1,2,3;4,5,6];
>> A(3,4)=10

A =

     1     2     3     0
     4     5     6     0
     0     0     0    10

  • 也可以采用矩阵元素的序号Index来引用矩阵元素。矩阵元素的序号就是相应元素在内存中的排列顺序即线性索引号。
  • 在 MATLAB 中矩阵元素按列存储即首先存储矩阵的第一列元素然后存储第二列元素…一直到矩阵的最后一列元素。例如
>> A=[1,2,3;4,5,6]

A =

     1     2     3
     4     5     6

>> A(2)

ans =

     4

>> A(3)

ans =

     2

  • 矩阵 A 的第 3 号元素为 2即 A(1,2)。显然序号与下标是一一对应的以 mxn 矩阵 A 为例矩阵元素 A(i,j) 的序号为 (j-1)*m+i。
  • 矩阵元素的序号与下标可以利用 sub2indind2sub 函数实现相互转换。
  • sub2ind 函数将矩阵中指定元素的行、列下标转换成存储的序号其调用格式如下
   D=sub2ind(S,I,J)
  • 其中S 表示要转换的矩阵的行数和列数是行数和列数组成的向量通常用 size 函数获取I 是要转换矩阵的行下标J 是要转换矩阵的列下标。
  • I、J 的行列数必须相同。D 为对应下标元素的序号其行列数与 I、J 相同。例如
>> A=[1:3;4:6]

A =

     1     2     3
     4     5     6

>> D=sub2ind(size(A),[1,2;2,2],[1,1;3,2])

D =

     1     2
     6     4
 
  • 命令中的 size(A) 函数返回包含两个元素的向量分别是 A 矩阵的行数和列数。从执行结果可以看出A(1,1) 的序号为 1A(2,1) 的序号为 2A(2,3) 的序号为 6A(2,2) 的序号为 4。
  • ind2sub 函数用于把矩阵元素的序号转换成对应的下标其调用格式如下
   [I,J]=ind2sub(S,D)
  • 其中S 表示要转换的矩阵的行数和列数D 是序号返回值为序号所对应元素的行下标和列下标。例如
>> [I,J]=ind2sub([3,3],[1,3,5])

I =

     1     3     2


J =

     1     1     2

  • 命令执行结果表明3x3 矩阵的第 1、3、5 个元素的下标分别为 (1,1)、(3,1)、 (2,2)。
  • 有关求矩阵大小的函数还有 length(A)给出矩阵 A 最长维的长度ndims(A)给出矩阵 A 的维数numel(A)给出矩阵 A 元素的个数。

3.2 利用冒号表达式获得子矩阵

  • 子矩阵是指由矩阵中的一部分元素构成的矩阵。若用冒号表达式作为引用矩阵时的下标这时就可以获得一个子矩阵。也可以直接用单个的冒号来作为行下标或列下标它代表全部行或全部列。
  • 例如A(i,j) 表示 A 矩阵第 i 行、第 j 列的元素A(i,:) 表示 A 矩阵第 i 行的全部元素A(:,j) 表示 A 矩阵第 j 列的全部元素。同样A(i:i+m,k:k+m) 表示 A 矩阵第 i~i+m 行内且在第 k~k+m 列中的所有元素A(i:i+m,:) 表示 A 矩阵第 i~i+m 行的全部元素A(:,k:k+m) 表示 A 矩阵第 k~k+m 列的全部元素。例如
>> A=[1:5;6:10;11:15;16:20]

A =

     1     2     3     4     5
     6     7     8     9    10
    11    12    13    14    15
    16    17    18    19    20

>> A(1,:)  %取 A 第一行

ans =

     1     2     3     4     5

>> A(:,2:4)  %取 A 第二、三、四列

ans =

     2     3     4
     7     8     9
    12    13    14
    17    18    19

>>  A(2:3,4:5)  %取 A 第二、三行第四、五列

ans =

     9    10
    14    15

>> A(2:3,1:3:5)  %取 A 第二、三行第一、三、五列

ans =

     6     9
    11    14

  • 此外还可以利用一般向量和 end 运算符来表示矩阵下标从而获得子矩阵。end 表示某一维的末尾元素下标。例如
>>  A=[1:5;6:10;11:15;16:20]

A =

     1     2     3     4     5
     6     7     8     9    10
    11    12    13    14    15
    16    17    18    19    20

>> A(end,:)  %取 A 的最后一行

ans =

    16    17    18    19    20

>> A([1,4],3:end)  %取 A 第一、四两行中第三列到最后一列的元素

ans =

     3     4     5
    18    19    20

3.3 利用空矩阵删除矩阵的元素

  • 空矩阵是指没有任何元素的矩阵即在建立矩阵时中括号中为空。例如
>> x=[]

x =

     []

  • 将某些元素从举证中删除采用将其置为空矩阵的方法也是十分有效的。例如
>> A=[1,2,3,0,0;7,0,9,2,6;1,4,-1,1,8]

A =

     1     2     3     0     0
     7     0     9     2     6
     1     4    -1     1     8
 
>> A(:,[2,4])=[]  %删除 A 的第二列和第四列元素

A =

     1     3     0
     7     9     6
     1    -1     8

3.4 改变矩阵的形状

  • reshape(A,,m,n) 函数在矩阵总元素不变的前提下将矩阵 A 重新排成 m×n 的二维矩阵。例如
>> x=[23,45,65,34,65,34,98,45,78,65,43,76];  %产生有 12 个元素的行向量 x
>> y=reshape(x,3,4)  %利用向量 x 建立 3×4 的矩阵 y

y =

    23    34    98    65
    45    65    45    43
    65    34    78    76
    
>> z=reshape(y,2,6)  %针对上面建立的 y 矩阵建立 2×6 矩阵 z

z =

    23    65    65    98    78    43
    45    34    34    45    65    76

  • 这里需要注意的是reshape 函数只是改变原矩阵的行数和列数即改变其逻辑结构但并不改变原矩阵元素个数及其存储顺序。
  • A( : ) 将矩阵 A 的每一列元素堆叠起来成为一个列向量从而改变了矩阵的形状。例如
>> A=[-45,65,71;27,35,91]

A =

   -45    65    71
    27    35    91

>> B=A(:)

B =

   -45
    27
    65
    35
    71
    91
    
  • 在这里A( : ) 产生了一个 6×1 的矩阵等价于 reshape(A,6,1)。

三、变量及其操作

  • 计算机所处理的数据存放在内存单元中程序通过内存单元的地址来访问内存单元。
  • 在高级语言中无须直接给出内存单元的地址而只需给内存单元命名以后通过内存单元的名字来访问内存单元。
  • 命了名的内存单元就是变量在程序运行期间其内存单元中存放的数据可以根据需要随时改变。

1. 变量与赋值语句

  • 在 MATLAB 中变量名是以字母开头后接字母、数字或下画线的字符序列最多 63 个字符。例如myexamp12、 my_ examp12、 myexamp12_ 均为合法的变量名而 12myexamp、_myexamp12 为非法的变量名。
  • 在 MATLAB 中变量名区分字母的大小写。myexamp、MYexamp 和 MYEXAMP 表示 3 个不同的变量。这里需要注意的是MATLAB 提供的标准函数名以及命令名必须用小写字母。
  • MATLAB 赋值语句有以下两种格式
  • 1 变量=表达式。
  • 2 表达式。
  • 其中表达式是用运算符将有关运算量连接起来的式子其结果是一个矩阵。
  • 第一种形式的赋值语句执行时MATLAB 将右边表达式的值赋给左边的变量而第二种形式的赋值语句执行时将表达式的值赋给 MATLAB 的预定义变量 ans。
  • 一般地运算结果在命令行窗口中显示出来。如果在语句的最后加分号那么MATLAB 仅仅执行赋值操作不再显示运算的结果。如果运算的结果是一个很大的矩阵或根本不需要运算结果则可以在语句的最后加上分号。
  • 例如我们计算表达式 5 + cos ⁡ 47 ° 1 + ∣ x − y ∣ \frac{5+\cos 47°}{1+\left | x-y \right | } 1+xy5+cos47° 的值并将结果赋值给变量 z然后显示计算结果。其中 x = 7 − 2 i x=\sqrt{7}-2i x=7 2i y = e Π 2 y=e^{\frac{Π}{2} } y=e2Π
  • 在 MATLAB 命令行窗口输入如下命令

>> x=sqrt(7)-2i;
>> y=exp(pi/2);
>> z=(5+cos(47*pi/180))/(1+abs(x-y))

z =

    1.4395

  • 命令中的 pi 和 i 都是 MATLAB 预先定义的变量分别代表圆周率 π 和虚数单位。

2. 预定义变量

  • 在 MATLAB 工作空间中还驻留几个由系统本身定义的变量。除前面使用过的 ans、pi、i 和 j 外还有一些常用的预定义变量。
预定义变量含义预定义变量含义
ans计算结果的默认赋值变量nargin函数输入参数个数
eps机器零阈值nargout函数输出参数个数
pi圆周率 π 的近似值realmax最大正实数
i, j虚数单位realmin最小正实数
inf, Inf无穷大如 1/0 的结果lasterr存放最新的错误信息
NaN, nan非数如 0/0、inf/inf 的结果lastwarn存放最新的警告信息
  • MATLAB 预定义变量有特定的含义在使用时应尽量避免对这些变量重新赋值。以 i 或 j 为例在 MATLAB 中i 和 j 代表虚数单位如果给 i 或 j 重新赋值就会覆盖原来虚数单位的定义这时可能会导致一些很隐蔽的错误。

3. 变量的管理

3.1 内存变量的删除与修改

  • MATLAB 工作区窗口专门用于内存变量的管理。在工作区窗口中可以显示所有内存变量的属性。当选中某些变量后选择右键快捷菜单中的删除命令就能清除这些变量。
  • 当选中某个变量后双击该变量或选择右键快捷菜单中的打开所选内容命令将进入变量编辑器。通过变量编辑器可以直接观察变量中的具体元素也可以修改变量中的具体元素。

在这里插入图片描述

  • 通常对于较大矩阵的输入可采用变量编辑器操作方法如下。
  • 1 在工作区窗口的右键快捷菜单中选择新建命令并给变量命名。
  • 2 在工作区中双击该变量打开变量编辑器。
  • 3 在变量编辑器的空白表格中填写元素值表格的每一个方格对应矩阵的一个元素。
  • clear 命令用于删除 MATLAB 工作空间中的变量。who 和 whos 这两个命令用于显示在 MATLAB 工作空间中已经驻留的变量名清单。
  • who 命令只显示出驻留变量的名称whos 在给出变量名的同时还给出它们的大小、所占字节数及数据类型等信息。例如在某一时刻使用 who 和 whos 命令的结果如下
>> who

您的变量为:

A    B    ans  x    y    z    

>> whos
  Name      Size            Bytes  Class     Attributes

  A         2x3                48  double              
  B         6x1                48  double              
  ans       2x3                48  double              
  x         1x1                16  double    complex   
  y         1x1                 8  double              
  z         1x1                 8  double              

3.2 内存变量文件

  • 利用 MAT 文件可以把当前 MATLAB 工作区中的一些有用变量长久地保留下来。MAT 文件是 MATLAB 保存数据的一种标准的二进制格式文件扩展名一定是 .mat。MAT 文件的生成和装入由 saveload 命令来完成。常用格式如下
save 文件名 [变量名表] [-append] [-ascii]
load 文件名 [变量名表] [-ascii]
  • 其中文件名可以带路径但不需要带扩展名 .mat命令默认对 MAT 文件进行操作。变量名表中的变量个数不限只要内存或文件中存在即可变量名之间以空格分隔。当变量名表省略时保存或装入全部变量。
  • -ascii 选项使文件以 ASCII 格式处理省略该选项时文件将以二进制格式处理。save 命令中的 append 选项控制将变量追加到 MAT 文件中。
  • 假定变量 a 和 x 存在于 MATLAB 工作空间中输入以下命令便可借助 mydata.mat 文件保存 a 和 x
>> save mydata a x
  • 假如在下次重新进入 MATLAB 后需要使用变量 a 和 x可用以下命令把 mydata.mat 中的内容装入 MATLAB 工作空间
>> load mydata
  • 在执行上述命令后在当前的 MATLAB 环境中a 和 x 就是两个已知变量了。
  • 这里需要注意的是mydata 是用户自己取的文件名MATLAB 默认扩展名为 .mat。
  • 上述 save 命令执行以后该 mydata.mat 文件将存放在当前目录。假如我们需要让 mydata.mat
    存放在指定的其他目录例如 d:\lpp目录中那么 save 命令改为
>> save d: \1pp\mydata a x
  • 当然相应 load 命令中的文件名前也要加路径名。
  • 除了操作命令以外在 MATLAB 主窗口通过主页选项卡变量命令组中的保存工作区命令按钮或工作区窗口快捷菜单的保存命令可以保存工作区中的全部变量。通过主页选项卡变量命令组中的导入数据命令按钮可以将保存在 MAT 文件中的变量装入 MATLAB 工作区。
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

“MATLAB 之 数值数据,矩阵的表示和变量及其操作” 的相关文章