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

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

一、数值数据

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

1. 数值数据类型的分类

1.1 整型

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

x =

  int8

   127

>> x=int16(129)

x =

  int16

   129

  • 带符号 8 位整型数据的最大值是 127,int8 函数转换时只输出最大值,因此,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 位有效数字的科学记数形式输出
long 15 位有效数字形式输出
short e 5 位有效数字的科学记数形式输出
long e 15 位有效数字的科学记数形式输出
short g 从 short 和 short e 中自动选择最佳输出方式
long g 从 long 和 long e 中自动选择最佳输出方式
rat 近似有理数表示
hex 十六进制表示
+ 正数、负数、零分别用 +、-、空格表示
bank 银行格式,用元、角、分表示
compact 输出变量之间没有空行
loose 输出变量之间有空行
  • 这里需要注意的是,format 命令只影响数据输出格式,而不影响数据的计算和存储。
  • 如果输出矩阵的每个元素都是纯整数,MATLAB 就用不加小数点的纯整数格式显示结果。
  • 只要矩阵中有一个元素不是纯整数,MATLAB 将按当前的输出格式显示计算结果。
  • 如果 format 命令后面不加格式符,则回到默认输出格式。默认的输出格式是 short 格式。
  • 假定输入以下命令:
>> x=4/3
  • 那么,在各种不同的格式符下的输出结果如下。
  • (1) 短格式(short):1.3333。
  • (2) 短格式 e 方式(short e):1.3333e+00。
  • (3) 长格式(long):1.3333333333333。
  • (4) 长格式 e 方式(long e):1.3333333333333e+00。
  • (5) 银行格式(bank):1.33。
  • (6) 十六进制格式(hex):3555555555555。
  • (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)来引用,下标必须为正整数。例如,A(3,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) 的序号为 1,A(2,1) 的序号为 2,A(2,3) 的序号为 6,A(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: 1ppmydata a x
  • 当然,相应 load 命令中的文件名前也要加路径名。
  • 除了操作命令以外,在 MATLAB 主窗口通过主页选项卡变量命令组中的保存工作区命令按钮或工作区窗口快捷菜单的保存命令,可以保存工作区中的全部变量。通过主页选项卡变量命令组中的导入数据命令按钮可以将保存在 MAT 文件中的变量装入 MATLAB 工作区。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>