MATLAB 1.1:程序设计语言基础

目录

一、变量与常量

1. 常量

2. 变量

二、数据结构

1. 数值型数据

  (1)整数型

  (2)浮点数型

  (3)复数型

  (4)Inf 和 NaN

2. 符号型数据

3. 其它数据结构

三、基本语句结构

1. 直接赋值语句

2. 函数调用语句

四、冒号表达式

五、子矩阵提取


一、变量与常量

1. 常量

        常量是程序语句中值不会改变的那些量。如:表达式 y=3.1415*x 中的系数 3.1415 就是一个数值常量;表达式 s='Name and Tel' 中单引号内的英文字符串是一个字符串常量。

        在 MATLAB 语言中还为特定常数保留了一些名称,虽然这些常量都可以重新赋值,但建议在编程时应尽量避免对这些量重新赋值。
        (1) eps:机器的浮点运算误差限。PC上eps的默认值为2^{-52},若某个量的绝对值小于eps,则可以认为这个量为0。换句话说,绝对值小于eps的量在双精度数据结构下是没有物理意义的。
        (2) i 和 j:若 i 或 j 量不被改写,则它们表示纯虚数量 j。但在程序编写过程中经常事先改写这两个变量的值,如在循环过程中常用这两个变量来表示循环变量,所以应该确认使用这两个变量时没有被改写。如果想恢复该变量,则可以用语句"i=sqrt(-1)"设置,即对-1求平方根。
        (3) Inf:无穷大量+∞的 MATLAB 表示,也可以写成 inf。同样地,-∞可以表示为-Inf。在程序执行时,即使遇到了以0为除数的运算,也不会终止程序的运行,而只给出一个"除0"警告,并将结果赋成Inf,这样的定义方式符合IEEE的标准。
        (4) NaN:不定式(not a number),通常由0/0运算、Inf/Inf及其他可能的运算得出。NaN是一个很奇特的量,如NaN与Inf的乘积仍为NaN。
        (5) pi:圆周率π的双精度浮点表示,π=3.141592653589793。

2. 变量

        在程序运行过程中,其值可以改变的量称为变量,变量用变量名表示。变量名必须以字母开头,且只能由字母、数字或下画线3类符号组成,不能包含空格和标点符号等;同时变量名是区分大小写的,即ABC和abc两个变量名代表着不同的变量。

        变量的声明:在 MATLAB 中没有变量声明语句,当使用一个变量的时候,MATLAB会搜索这个变量名字,当没有这个名字的时候,默认自动生成。变量的删除:使用语句clear 变量名可以进行变量的删除。


二、数据结构

        数据结构是计算机程序设计语言中的重要因素。由于 MATLAB 语言主要用于科学运算,所以主要使用数值型与符号型数据结构,双精度数据结构是其默认的数据结构。本节将介绍各种常用的数据结构。MATLAB中,A变量的数据结构可以由命令“class(A)”读出。

1. 数值型数据

        强大方便的数值运算功能是MATLAB语言的最显著特色。为保证较高的计算精度,MATLAB语言中最常用的数值量为双精度浮点数,占8字节(64位),遵从IEEE记数法,有11个指数位、52个数值位及一个符号位,值域的近似范围为-1.7x10308~1.7x10308,其MATLAB表示为double()。一般情况下,双精度数据结构可以保留15~16位十进制有效数字。
        考虑到一些特殊的应用,比如图像处理,MATLAB语言还引入了无符号的8位整型数据类型,其MATLAB表示为uint8(),其值域为0~255,这样可以大大地节省MATLAB的存储空间,提高处理速度。此外,在MATLAB中还可以使用其他的数据类型,如int8()、int16()、int32()、uint16()、uint32()等,每一个类型后面的数字表示其位数,其含义不难理解。

  (1)整数型

        ① 在MATLAB中,整数类型包含4种有符号整数和4种无符号整数,支持 1B、2B、4B 和 8B 的有符号整数和无符号整数(B:Byte 字节)。

        ② 在实际应用时,要根据“数据的大小和范围”,选择合适的整数类型。例如:最大值为100的数据可以用 1B 的整数表示,而没有必要使用 8B 的整数来表示。

        ③ 类型转换函数不仅可以将其它数据类型的数值强制转换为整数类型,还可以用于生成整数类型的数值。

        ④ 如果要验证一个变量是否为整数类型,可以使用isinteger函数,;如果想要查看数据类型并输出,可以使用class函数。

b = isinteger(a)     % a是输入变量,b是输出逻辑值。如果a是整数,则b为1;否则,b为0

class(x)    % ans会直接给出变量 x 的数据类型。(变量要用括号括起来)

>> x=uint16(16628)    %无符号2B整数

x =

  uint16

   16628

>> isinteger(x)    %验证变量是否为整数,如果x是整数,则返回值为1;否则,返回值为0。

ans =

  logical

   1

>> class(x)    %查看变量的数据类型,ans会直接给出变量的数据类型

ans =

    'uint16'
  (2)浮点数型

        ① 在MATLAB中浮点数分为“单精度浮点数(single)”和“双精度浮点数(double)”。

        ② 双精度浮点数(double)是MATLAB中默认数据类型。

        ③ 可以使用类型转换函数将数据类型转换为单精度或双精度浮点类型。

b = single(a);        % a 是输入的数值或数组,b 是转换后的单精度浮点类型数组。

whos x        % 用于查看当前工作空间中的变量列表,显示变量的名称、大小、字节占用等信息。(变量不需要用括号括起来)

>> a=1.3

a =

    1.3000

>> whos a
  Name      Size            Bytes  Class     Attributes

  a         1x1                 8  double              

>> a=single(a)

a =

  single

    1.3000

>> whos a
  Name      Size            Bytes  Class     Attributes

  a         1x1                 4  single  
  (3)复数型

        ① 复数包括实部和虚部两部分,虚部单位是 -1 的平方根,在MATLAB中,可以用 i 或 j 表示。

        ② 可以直接使用赋值语句产生复数,也可以利用 copmlex 函数创建复数。

        ③ 利用 real 和 imag 函数,可以把复数分为实数和虚数两部分。

z = complex(a,b)        % 通过两个实数 a,b 创建一个复数 z,z=a+bi

z = complex(x)        % 返回 x 的等效复数。x 为实数,返回 x+0i;x 为复数,则 z 与 x 相同

z = 3+4i

real(z)        % 返回复数的实部,返回值为3

imag(z)        % 返回复数的虚部,返回值为4

R = rand        % 返回一个区间在(0,1)内的均匀分布的随机数

R = rand(n)        % 生成 n×n 的矩阵随机数,每个元素均位于(0,1)之间

>> a=12+6i

a =

  12.0000 + 6.0000i

>> x=rand(2)*(-3);    % 生成一个2×2的随机浮点矩阵,然后矩阵中的每个元素均乘-3
>> y=rand(2)*5;    % 生成一个2×2的随机浮点矩阵,然后矩阵中的每个元素具乘5
>> z=complex(x,y)    % 创建复数,x、y是实数,z是以x为实部、y为虚部的复数

z =

  -2.4442 + 3.1618i  -0.3810 + 1.3925i
  -2.7174 + 0.4877i  -2.7401 + 2.7344i

>> x=rand(2);    % 生成一个2×2的随机矩阵,每个元素均位于(0,1)之间
>> z=complex(x)    % 创建复数,x是实数,z是以x为实部、0为虚部的复数

z =

   0.9575 + 0.0000i   0.1576 + 0.0000i
   0.9649 + 0.0000i   0.9706 + 0.0000i
  (4)Inf 和 NaN

        ① 规定用 Inf 和 -Inf 分别表示“正无穷大”和“负无穷大”。在除法运算时,除数为0或运算结果溢出(结果超出了设定的数据类型所对应的范围)都会导致出现 Inf 或 -Inf 的结果。

        ② 规定用 NaN 表示一个既不是实数又不是复数的数值(非数),NaN是Not a Number 的缩写,类似0/0、Inf/Inf 的表达式得到的结果均为 NaN 。

        ③ isinf 函数可以用于验证变量是否为无穷大。

b = isinf(a)        % a是输入变量,b是输出逻辑值。如果a是无穷大,则b为1;否则,b为0

>> 1000/0

ans =

   Inf

>> x=exp(1000)

x =

   Inf

>> x=log(0)

x =

  -Inf

>> 0/0

ans =

   NaN

>> Inf/Inf

ans =

   NaN

>> isinf(x)

ans =

  logical

   1
2. 符号型数据

        MATLAB还定义了"符号"型变量,以区别于常规的数值型变量,可以用于公式推导和数学问题的解析求解。进行解析运算前需要首先将采用的变量声明为符号变量,这需要用syms命令来实现。该语句具体的用法为 syms vars 变量属性,其中,vars给出需要声明的变量列表,可以同时声明多个变量,中间用空格分隔,而不是用逗号等分隔。如果需要,还可以进一步声明变量的"变量属性",可以使用的类型为real(实数)、positive(正数)等。例如,将a,b均定义为符号变量,则可以用syms a b语句声明,该命令还支持对符号变量具体形式的设定,如syms a real。
        ① 如果已知某数值型变量A,则可以使用 B=sym(A) 命令将数值型变量A转换成符号型数据结构,而 A=double(B) 命令可以将符号型数值还原成双精度数据结构。

syms vars        % 声明符号变量

B = sym(A)        % 将数值型变量A转换为符号型数据结构

A = double(B)        % 将符号型数值B还原成双精度数据结构

>> syms a b
>> whos a
  Name      Size            Bytes  Class    Attributes

  a         1x1                 8  sym                

>> whos b
  Name      Size            Bytes  Class    Attributes

  b         1x1                 8  sym                

>> a=1;
>> b=sym(a)
 
b =
 
1
 
>> whos b
  Name      Size            Bytes  Class    Attributes

  b         1x1                 8  sym                

>> a=double(b)

a =

     1

>> whos a
  Name      Size            Bytes  Class     Attributes

  a         1x1                 8  double   

        符号型数值可以通过变精度算法函数 vpa() 以任意指定的精度显示出来。直接使用 vpa() 命令最多显示5万位左右,需要更多的位可以通过循环的方式实现。

vpa(A)        % 以默认的十进制位数(32位)显示结果

vpa(A,n)        % A为需要显示的数值或矩阵,n为指定的有效数字位数

>> vpa(pi)
 
ans =
 
3.1415926535897932384626433832795

>> vpa(pi,100)
 
ans =
 
3.1415926535897932384626433832795028841971693993751
05820974944592307816406286208998628034825342117068

        ③ 数学函数有两种表示方法,一种是符号变量的描述方法,另一种是符号函数的描述方法。下面的语句都可以定义出该函数,但两种方法定义的数据结构是不一致的,前者是普通符号变量 sym, 后者是符号函数 symfun。由 class() 函数可以直接读取符号表达式的数据结构。

>> syms x;
>> f1=sin(x)/(x^2+4*x+3),class(f1)
 
f1 =
 
sin(x)/(x^2 + 4*x + 3)
 

ans =

    'sym'

>> f2(x)=sin(x)/(x^2+4*x+3),class(f2)
 
f2(x) =
 
sin(x)/(x^2 + 4*x + 3)
 

ans =

    'symfun'

        ④ 当输入指令“>>a=sym(12345678901234567890”,不过实际输入到计算机的是“a=12345678901234567168”,和期望的有差距,这是因为在MATLAB 执行机制下,该数被先转换成双精度数据结构,再由双精度的结果转换成符号型数据结构,从而出现偏差。如果想不走样地输入位数很多的整数,则需要借助字符串数据结构的帮助。例如,由下面语句可以直接输入更多位的有效数字。

>> a=sym(12345678901234567890)
 
a =
 
12345678901234567168
 
>> a=sym('12345678901234567890')
 
a =
 
12345678901234567890
3. 其它数据结构

    (1)字符串型数据。MATLAB支持字符串变量,可以用它来存储相关的信息。和C语言等程序设计语言不同,MATLAB字符串是用单引号括起来的。
    (2)多维数组。三维数组是一般矩阵的直接拓展。在控制系统的分析中也可以直接用于多变量系统的表示。在实际编程中还可以使用维数更高的数组。
    (3)单元数组。单元数组是矩阵的直接扩展,其存储形式类似于普通的矩阵,而矩阵的每个元素不是数值,可以认为能存储任意类型的信息,这样每个元素称为"单元"(cell),例如,A{i,j}可以表示单元数组A的第i行,第j列的内容。
    (4)类与对象。MATLAB允许用户自己编写包含各种复杂信息的变量,称为类,而对象是类的一个实例。类变量可以包含各种下级的信息,还可以重新对类定其计算,这在控制系统描述中特别有用。例如,在MATLAB的控制系统工具箱中定义了传递函数类,可以用一个变量来表示整个传递函数,还重新定义了该类的运算,如加法运算可以直接求取多个模块的并联连接,乘法运算可以求取若干模块的串联。这些内容将在后面进行详细介绍。


三、基本语句结构

1. 直接赋值语句

        直接赋值语句的基本结构为“赋值变量=赋值表达式”,这一过程把等号右边的表达式直接赋给左边的赋值变量,并返回到MATLAB的工作空间。如果赋值表达式后面没有分号,则将在MATLAB命令窗口中显示表达式的运算结果。若不想显示运算结果,则应该在赋值语句的末尾加一个分号。如果省略了赋值变量和等号,则表达式运算的结果将赋给保留变量ans。所以说,保留变量ans将永远存放最近一次无赋值变量语句的运算结果。

>> A=[1 2 3;4 5 6;7 8 0];
>> A=[[A;41 42 43],[14;24;34;44]]    %矩阵维数动态变化

A =

     1     2     3    14
     4     5     6    24
     7     8     0    34
    41    42    43    44
2. 函数调用语句

        函数调用语句的基本结构为“[返回变元列表]=函数名(输入变元列表)”,其中,函数名的要求和变量名的要求是一致的,一般函数名应该对应在 MATLAB 路径下的一个文件。例如,函数名 my_fun 应该对应于 my_fun.m 文件。当然,还有一些函数名需对应于 MATLAB 的内核函数(built-in function),如 inv() 函数等。
        返回变元列表和输入变元列表均可以由若干个变量名组成,它们之间应该分别用逗号隔开。返回变元还允许用空格分隔,例如,[U S V]=svd(X),该函数对给定的X 矩阵进行奇异值分解,所得的结果由 U、S、V 这3个变元返回。如果不想返回某个变元,则可以用~符号占位。


四、冒号表达式

        冒号表达式是 MATLAB 中很有用的表达式,在向量生成、子矩阵提取等很多方面都是特别重要的。冒号表达式的原型为v=s_{1}:s_{2}:s_{3},该函数将生成一个行向量 v,其中 s_{1} 为向量的起始值,s_{2} 为步距。该向量将从 s_{1} 出发,每隔步距 s_{2} 取一个点,直至不超过 s_{3} 的最大值就可以构成一个向量。若省略 s_{2},则步距取默认值1。

y = linspace(x1, x2, n)        % x1 是起始点,x2 是结束点,n 是生成的数据点的数量

>> v1=0:0.6:pi

v1 =

         0    0.6000    1.2000    1.8000    2.4000    3.0000

>> v2=0:pi/5:pi

v2 =

         0    0.6283    1.2566    1.8850    2.5133    3.1416

>> v3=linspace(0,pi,6)

v3 =

         0    0.6283    1.2566    1.8850    2.5133    3.1416

五、子矩阵提取

        提取子矩阵在 MATLAB 编程中是经常需要处理的事。提取子矩阵的具体方法是B=A(v1,v2),其中,v1向量表示子矩阵要包含的行号构成的向量,v2表示要包含的列号构成的向量,这样从A矩阵中提取有关的行和列,就可以构成子矩阵B了。若v1为“:”,则表示要提取所有的行,v2亦有相应的处理结果。关键词end表示最后一行(或列,取决于其位置)

>> A = rand(4, 4)    %随机生成一个4×4矩阵

A =

    0.8147    0.6324    0.9575    0.9572
    0.9058    0.0975    0.9649    0.4854
    0.1270    0.2785    0.1576    0.8003
    0.9134    0.5469    0.9706    0.1419

>> B1=A(1:2:end,:)    %提取A矩阵的奇数行、全部列

B1 =

    0.8147    0.6324    0.9575    0.9572
    0.1270    0.2785    0.1576    0.8003

>> B2=A([3 2 1],[2 3 4])    %提取A矩阵的3,2,1行、2,3,4列

B2 =

    0.2785    0.1576    0.8003
    0.0975    0.9649    0.4854
    0.6324    0.9575    0.9572

>> B3=A(:,end:-1:1)    %将A矩阵左右翻转

B3 =

    0.9572    0.9575    0.6324    0.8147
    0.4854    0.9649    0.0975    0.9058
    0.8003    0.1576    0.2785    0.1270
    0.1419    0.9706    0.5469    0.9134

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值