第二章 matlab 基础 计算机仿真与模拟第二章 matlab基础
2.1 矩阵与数组
2.2 数据类型第二章 matlab 基础 计算机仿真与模拟
2.1 矩阵和数组
2.1.1 概述
2.1.2 创建向量
2.1.3 创建矩阵
2.1.4 索引
2.1.5 基本运算
2.1.6 稀疏矩阵
2.1.7 多维数组第二章 matlab 基础 计算机仿真与模拟
2.1.1 概 述
1,变量和常量所谓变量,就是指在程序运行过程中需要改变数值的量,
每一个变量都具有一个名字,变量将在内存中占据一定的空间,
以便在程序运行的过程中保存其数值 。 M语言和 C语言类似,对变量的命名有相应的要求:变量必须以字母开头,后面可以是字母,数字或者下划线的组合 。 尽管在编写程序的时候可以使用任意数量的字符表示变量名,但是 MATLAB仅仅识别前面的
N个字符,在不同的操作系统下可以识别的字符个数不尽相同,
可以使用 namelengthmax函数察看相应的定义 。
第二章 matlab 基础 计算机仿真与模拟所谓常量就是在程序运行的过程中不需要改变数值的量,
例如,在求圆周周长或者圆的面积的时候,需要一个常量 π,
它的值近似是 3.1415927,常量也具有相应的名字,其定义方法和变量一样。 M语言中的常量不像 C语言中的常量,一般地在 M语言中并不存在常量的定义,任何常量和变量都可以修改其数值,只不过在 MATLAB中提供了一些常用的常数作为常量。
第二章 matlab 基础 计算机仿真与模拟
2,数组一般的,数组是有序数据的集合,在大多数编程语言中,
数组的每一个成员 (元素 )都属于同一种数据类型,它们使用同一个数组名称和不同的下标来惟一确定数组中的成员 (元素 )。
其中,下标是指数组元素在数组中的序号 。
对于 MATLAB而言,大多数数据类型的数组每一个元素都是同一个数据类型的元素,而对于其特殊的元胞数组则不然 。
和一般的编程语言类似,M语言的数组也有一维,二维和多维数组的区别 。 而在 MATLAB中一般不存在数组的数组,除非在
M语言中使用 Java数据对象 。
第二章 matlab 基础 计算机仿真与模拟
3,向量从编程语言的角度上看,向量其实就是一维数组,然而从数学的角度上看,向量就是 1× N或者 N× 1的矩阵,即行向量或列向量,即
MATLAB的基本运算单位就是矩阵和向量,而 M语言本身就是以向量化运算为基础的编程语言,正因为有如此特点,使用 M
语言成为了目前最流行的算法开发和验证的原型语言 。
n
n
bbbbB
b
b
b
b
B
,13,12,11,1
1,
1,3
1,2
1,1
和
都是一维数组,但是从数学的角度上看,分别被称为列向量和行向量。
第二章 matlab 基础 计算机仿真与模拟
4,矩阵在 MATLAB中,矩阵的概念就是线性代数中定义的矩阵的概念 ——矩阵是用一对圆括号或者方括号括起来,符合一定规则的数学对象 。 例如:
332331
232221
131211
bbb
bbb
bbb
B
就是一个三行三列的方阵。
第二章 matlab 基础 计算机仿真与模拟
2.1.2 创 建 向 量从编程语言的角度上看,向量也就是一维数组 。 在
MATLAB中创建向量可以使用不同的方法,最直接也最简单的方法就是逐个输入向量的元素,见例子 2-1。
例子 2-1 利用逐个输入元素的方法在 MATLAB中创建向量 。
在命令行窗口中键入:
>> x = [1 3 pi 3+5i]
x =
1.0000 3.0000 3.1416 3.0000 + 5.0000i
>> whos
Name Size Bytes Class
x 1x4 64 double array (complex)
Grand total is 4 elements using 64 bytes
第二章 matlab 基础 计算机仿真与模拟例子 2-2 利用冒号运算符创建向量 。
在命令行窗口中键入:
>> x = 1:10
x =
1 2 3 4 5 6 7 8 9 10
>> whos
Name Size Bytes Class
x 1x10 80 double array
Grand total is 10 elements using 80 bytes
第二章 matlab 基础 计算机仿真与模拟在例子 2-2中使用冒号运算符创建了具有 10个元素的向量 。
利用冒号运算符创建向量的基本语法如下:
X = J:INC:K
其中
* J为向量的第一个元素,而 K为向量的最后一个元素,INC
为向量元素递增的步长;
* J,INC和 K之间必须用,,,间隔;
* 若在表达式中忽略 INC(如例子 2-2所示 ),则默认的递增步长为 1;
* INC可以为正数也可以为负数,若 INC为正数,则必须
J<K,若 INC为负数,则必须 J>K,否则创建的为空向量。
第二章 matlab 基础 计算机仿真与模拟例子 2-3 使用冒号运算符创建向量 。
在命令行窗口中键入:
>> x = 1:0.01:1.1
x =
Columns 1 through 6
1.0000 1.0100 1.0200 1.0300 1.0400 1.0500
Columns 7 through 11
1.0600 1.0700 1.0800 1.0900 1.1000
第二章 matlab 基础 计算机仿真与模拟创建向量的第三种方法是使用函数 linspace和 logspace。
linspace是用来创建线性间隔向量的函数,函数 linspace的基本语法为
x = linspace(x1,x2,n)
其中
* x1为向量的第一个元素,x2为向量的最后一个元素,n
为向量具有的元素个数,函数将根据 n的数值平均计算元素之间的间隔,间隔的计算公式为;
* 若在表达式中忽略参数 n,则系统默认地将向量设置为
100个元素 。
函数的具体使用方法参见例子 2-4。
第二章 matlab 基础 计算机仿真与模拟例子 2-4 使用 linspace函数创建向量 。
>> x = linspace(1,2,5)
x =
1.0000 1.2500 1.5000 1.7500 2.0000
在本例子中,使用 linspace函数创建了一个具有五个元素的向量,而元素之间彼此的间隔为 。
另外一个函数 logspace被用来创建对数空间的向量,该函数的基本语法为
25.015 12
x = logspace(x1,x2,n)
第二章 matlab 基础 计算机仿真与模拟其中:
* 该函数创建的向量第一个元素值为 x1,而最后一个元素的数值为 x2,n为向量的元素个数,元素彼此之间的间隔按照对数空间的间隔设置;
* 若在表达式中忽略参数 n,则参数默认地将向量设置为
50个元素 。
该函数的使用参见例子 2-5。
第二章 matlab 基础 计算机仿真与模拟例子 2-5 使用 logspace函数创建向量 。
在 MATLAB的命令行窗口中键入下面的指令:
>> x = logspace(1,3,3)
x =
10 100 1000
上面创建的向量都是行向量,也就是说,创建的都是一行
n列的二维数组 (n表示元素的个数 ),如果需要创建列向量,即
n行一列的二维数组 (n表示元素的个数 ),则需要使用分号作为元素与元素之间的间隔或者直接使用转置运算符,'”,参见例子 2-6。
第二章 matlab 基础 计算机仿真与模拟例子 2-6 创建列向量。
>> %直接输入元素的方法创建列向量
>> A = [1;2;3;4;5;6]
A =
1
2
3
4
5
6
第二章 matlab 基础 计算机仿真与模拟
>> %使用转置的方法创建列向量
>> B = (1:6)'
B =
1
2
3
4
5
6
>> whos
Name Size Bytes Class
A 6x1 48 double array
B 6x1 48 double array
Grand total is 12 elements using 96 bytes
第二章 matlab 基础 计算机仿真与模拟
2.1.3 创 建 矩 阵
1 直接输入法例子 2-7 用直接输入矩阵元素的方法创建矩阵 。
在 MATLAB的命令行窗口中键入下面的指令:
>> A = [1 2 3;4 5 6;7 8 9]
A =
1 2 3
4 5 6
7 8 9
>> whos
Name Size Bytes Class
A 3x3 72 double array
Grand total is 9 elements using 72 bytes
第二章 matlab 基础 计算机仿真与模拟在上面的例子中创建了一个 3× 3的矩阵,在创建矩阵的时候,需要注意:
* 整个矩阵的元素必须在,[]”中键入;
* 矩阵的元素行与行之间需要使用分号,;,间隔,也可以在需要分行的地方用回车键间隔;
* 矩阵的元素之间可以使用逗号,,,或者空格间隔 。
其实创建上面的矩阵时还可以这么做
>> B = [1:3;4:6;7:9]
B =
1 2 3
4 5 6
7 8 9
第二章 matlab 基础 计算机仿真与模拟
2 数组编辑器前面的例子中使用 whos指令来察看当前 MATLAB会话保存在工作空间内存中的各种变量,此外,还可以使用工作空间浏览器察看工作空间中包含的各种变量,图 2-1所示为执行了例子 2-7之后的工作空间浏览器 。
在工作空间浏览器中可以察看当前工作空间中保存的各种数据的信息,利用工作空间浏览器,在相应的变量上单击鼠标右键,通过弹出的快捷菜单 (如图 2-2所示 )可以对矩阵或者向量进行编辑,也可以删除,重命名工作空间的变量,还能够完成数据可视化的工作 。
第二章 matlab 基础 计算机仿真与模拟图 2-1 MATLAB的工作空间浏览器第二章 matlab 基础 计算机仿真与模拟对矩阵或者向量元素的编辑可以通过数组编辑器来完成,
调用数组编辑器有以下几种不同的方法:
第一种,首先选择工作空间浏览器中的变量,然后单击工作空间浏览器工具栏中的按钮,这时系统将运行数组编辑器,同时在编辑器中加载变量 。 在用鼠标选择工作空间中的变量时,可以按住 Ctrl键或者 Shift键选择多个变量,同样也可以使用快捷键 Ctrl+A选择工作空间中的所有变量 。
第二种方法是在工作空间浏览器中直接双击变量,也可以运行数组编辑器,同时在编辑器中加载变量。
第二章 matlab 基础 计算机仿真与模拟第三种方法就是通过工作空间浏览器中的快捷菜单命令
Open来完成同样的工作 。
第四种方法是直接在 MATLAB命令行窗口中键入如下指令:
>> openvar A
也可以在数组编辑器中打开变量 A。打开矩阵 A的数组编辑器界面如图 2-3所示。
第二章 matlab 基础 计算机仿真与模拟图 2-3 在数组编辑器中编辑矩阵第二章 matlab 基础 计算机仿真与模拟前文提及,在命令行窗口中直接输入元素较多的向量或者矩阵时比较麻烦,所以,可以利用数组编辑器完成大矩阵的编辑,具体方法如下:
首先在命令行窗口中创建一个新的变量,A。
通过鼠标选择想要创建的矩阵的最后一格,如要创建 A
( 3?3) 的矩阵,则选择第 3行第 3列,然后输入一个数值 。
Matlab会自动地将前面的所有元素填充 0。 如图 2-4所示 。
第二章 matlab 基础 计算机仿真与模拟图 2-4 利用数组编辑器定义矩阵第二章 matlab 基础 计算机仿真与模拟在数组编辑器中可以使用多种格式来显示数组中的数据,
在图 2-5中演示了利用 bank格式显示数据的效果。
图 2-5 以 bank格式显示数据第二章 matlab 基础 计算机仿真与模拟
2.1.4 索 引
1 向量元素的访问访问向量的元素只要使用相应元素的索引即可,请参阅下面的例子 2-8。 在例子 2-8中操作对象是一个向量,该向量为 A =
[1 2 3 4 5 6 7 8 9 0]。
例子 2-8 访问向量中的元素 。
在 MATLAB的命令行窗口中键入下面的指令:
>> %访问向量的第三个元素
>> A(3)
ans =
3
第二章 matlab 基础 计算机仿真与模拟
>> %访问向量的第一、三、七个元素
>> A([1 3 7])
ans =
1 3 7
>> %访问向量的第一、三、五个元素
>> A([1:3:5])
ans =
1 3 5
>> %访问向量的最后四个元素
>> A([end-3:end])
ans =
7 8 9 0
>> %重复访问向量中的元素
>> A([1:5,5,-1:1])
ans =
1 2 3 4 5 5 4 3 2 1
第二章 matlab 基础 计算机仿真与模拟说明:
* 访问向量元素的结果是创建新的向量 。
* 访问向量的元素直接给出元素在向量中的序号,元素的序号不仅可以是单一的整数,还可以是元素序号组成的向量,
如例子 2-8中的各种操作 。
* 关键字 end在访问向量元素时,表示向量中最后一个元素的序号 。
* 访问向量元素时,序号的数值必须介于数值 1~ end之间 。
可以通过访问元素的方法,对具体的元素赋值,参见例子
2-9。
第二章 matlab 基础 计算机仿真与模拟例子 2-9 对向量的元素进行赋值 。
在 MATLAB命令行窗口中键入下面的指令:
>> %对向量的第三个元素赋值
>> A(3) = -3
A =
1 2 -3 4 5 6 7 8 9 0
>> %对向量中不存在的数据赋值
>> A(15) = -15
A =
Columns 1 through 10
1 2 -3 4 5 6 7 8 9 0
Columns 11 through 15
0 0 0 0 -15
第二章 matlab 基础 计算机仿真与模拟说明:
在例子 2-9中,对向量的第 15个元素赋值,在赋值之前向量的第 11~15个元素不存在,但是在赋值之后,将自动创建这些元素,并且为没有明确赋值的元素赋默认值 0,这就是 MATLAB的数据自动扩充和初始化机制。
第二章 matlab 基础 计算机仿真与模拟
2 矩阵元素的访问访问矩阵的元素也需要使用矩阵元素的索引,不过具有两种方式,第一种方式是使用矩阵元素的行列全下标形式,第二种方法是使用矩阵元素的单下标形式,参阅例子 2-10。
例子 2-10 访问矩阵的元素 。
MATLAB工作空间中具有一个 5× 5的矩阵,该矩阵是五阶的幻方,通过命令行获取矩阵的第二行、第四列的元素,于是在 MATLAB命令行窗口中键入下面的指令:
第二章 matlab 基础 计算机仿真与模拟
>> %创建矩阵
>> A = magic(5)
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
>> %使用全下标的形式访问元素
>> A(2,4)
ans =
14
>> %使用单下标的形式访问元素
>> A(17)
ans =
14
第二章 matlab 基础 计算机仿真与模拟说明:
* 使用了 MATLAB函数 magic创建幻方 。 所谓幻方,就是 n
阶的方阵,该方阵的行元素和列元素的和都相等 。
* 使用全下标的形式访问矩阵元素的方法简单,直接,同线性代数的矩阵元素的概念一一对应 。
* 矩阵元素的单下标是矩阵元素在内存中存储的序列号,
一般地,同一个矩阵的元素存储在连续的内存单元中 。
* 矩阵元素的单下标与全下标之间的转换关系如下,以的矩阵为例,该矩阵的第 i行第 j列的元素全下标表示为单下标 l=(j-
1)× m+i。
第二章 matlab 基础 计算机仿真与模拟注意:
MATLAB的矩阵元素的排列以列元素优先,这一点同
FORTRAN语言的二维数组元素的排列方法一致,与 C语言的二维数组元素的排列不同,C语言的二维数组元素排列以行元素优先 。
为了方便全下标和单下标之间的转换,MATLAB提供了两个函数分别完成两者之间的相互转化:
* sub2ind:根据全下标计算单下标 。
* ind2sub:根据单下标计算全下标。
第二章 matlab 基础 计算机仿真与模拟表 2-1 使用索引访问矩阵元素的方法矩阵元素的访问 说 明
A (i,j) 访问矩阵 A 的第 i 行第 j 列上的元素,其中 i 和 j 为标量
A (I,J) 访问由向量 I 和 J 指定的矩阵 A 中的元素
A( i,,) 访问矩阵 A 中第 i 行的所有元素
A (:,j) 访问矩阵 A 中第 j 列的所有元素
A (:) 访问矩阵 A 的所有元素,将矩阵看作一个向量
A (l) 使用单下标的方式访问矩阵元素,其中 l 为标量
A (L )
访问由向量 L 指定的矩阵 A 的元素,向量 L 中的元素为矩阵元素的单下标数值第二章 matlab 基础 计算机仿真与模拟例子 2-11 用不同的方法访问矩阵的元素。
在 MATLAB命令行中键入下面的指令:
>> % 创建矩阵
>> A = 1:25;
>> A = reshape(A,5,5)
A =
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
第二章 matlab 基础 计算机仿真与模拟
>> %访问矩阵的第三行第一列元素
>> A(3,1)或 A(3)
ans =
3
>> % 访问矩阵第三行的所有元素
>> A(3,:)
ans =
3 8 13 18 23
>> %访问矩阵第四列的所有元素
>> A(:,4)
ans =
16
17
18
19
20
第二章 matlab 基础 计算机仿真与模拟
>> %访问矩阵的最后一行元素
>> A(end,:)
ans =
5 10 15 20 25
>> %获取矩阵的子矩阵
>> I = [1 3 5];J = [2 4];
>> A(I,J)
ans =
6 16
8 18
10 20
第二章 matlab 基础 计算机仿真与模拟
2.1.5 基 本 运 算
1 矩阵生成函数表 2-2 MATLAB的矩阵生成函数函 数 说 明
ze ros 产生元素全为 0 的矩阵
one s 产生元素全为 1 的矩阵
ey e 产生单位矩阵
ra nd 产生均匀分布的随机数矩阵,数值范围 (0,1)
ra ndn 产生均值为 0,方差为 1 的正态分布随机数矩阵
dia g 获取矩阵的对角线元素,也可生成对角矩阵
tril 产生下三角矩阵
triu 产生上三角矩阵
pa sca l 产生帕斯卡矩阵
m ag ic 产生幻方阵第二章 matlab 基础 计算机仿真与模拟例子 2-12 矩阵生成函数的示例。
在 MATLAB命令行中键入下面的指令:
>> %创建三阶帕斯卡矩阵
>> A = pascal(3)
A =
1 1 1
1 2 3
1 3 6
>> %从矩阵 A生成下三角矩阵
>> tril(A)
ans =
1 0 0
1 2 0
1 3 6
第二章 matlab 基础 计算机仿真与模拟
>> %获取矩阵 A的对角线元素
>> diag(A)
ans =
1
2
6
>> %利用向量生成对角矩阵
>> diag(ans)
ans =
1 0 0
0 2 0
0 0 6
第二章 matlab 基础 计算机仿真与模拟
2 基本矩阵运算针对矩阵的运算 MATLAB提供了若干函数和基本的运算规则,这些规则和函数都分别和线性代数的基本概念和运算规则对应。矩阵的基本运算参见表 2-3。
第二章 matlab 基础 计算机仿真与模拟表 2-3 矩阵的基本运算第二章 matlab 基础 计算机仿真与模拟提示:
在 MATLAB中,获取矩阵 (线性代数 )的运算函数列表请在
MATLAB命令行窗口中键入如下命令:
>> help matfun
在 MATLAB命令行窗口中将显示相应的函数列表:
Matrix functions - numerical linear algebra.
Matrix analysis.
norm - Matrix or vector norm.
normest - Estimate the matrix 2-norm.
一般的 MATLAB函数都可以针对矩阵进行运算,但是在前面的 help命令行中显示的函数是专门针对矩阵和线性代数运算的函数 。
…
第二章 matlab 基础 计算机仿真与模拟例子 2-13 矩阵的基本运算示例 ——求解方程组。
443
63
22
321
321
321
xxx
xxx
xxx
这类问题可以直接通过矩阵运算解决 。 在 MATLAB命令行窗口中键入下面的指令:
>> %创建线性方程组的系数矩阵和向量
>> A = [-1 1 2; 3 -1 1; -1 3 4];
>> b = [2;6;4];
>> %求解方程,使用矩阵求逆的方法
>> x = inv(A)*b
第二章 matlab 基础 计算机仿真与模拟
x =
1.0000
-1.0000
2.0000
>> %求解方程,使用矩阵左除运算
>> x = A\b
x =
1.0000
-1.0000
2.0000
第二章 matlab 基础 计算机仿真与模拟从例子 2-13可以看出以矩阵为基本运算单位进行数值运算的优势 。 对于 MATLAB,矩阵的基本运算都可以用一种最简单,
直观的表达式完成,像这种利用向量或者矩阵的运算,不仅可以简化代码,还能够提高 MATLAB的 M语言的运行速度 。
矩阵的运算同时也包含了矩阵和标量之间的运算,
MATLAB在处理这种运算的时候,首先对标量进行扩充,例如:
>> w=[1 2;3 4] + 5
w =
6 7
8 9
第二章 matlab 基础 计算机仿真与模拟该指令行实际的执行过程如下:
w=[1 2;3 4] + 5
5 5
5 5
4 3
2 1
5
4 3
2 1
9 8
7 6
第二章 matlab 基础 计算机仿真与模拟
2.5.3 基本数组运算在 MATLAB中,除了基本的线性代数运算以外,大多数的矩阵运算都适用于数组运算,但是有部分运算不同,本小节将介绍其中的基本运算指令和方法 。
1,数组转置数组转置的操作符是在矩阵转置操作符前加符号,,”,见例子 2-14。
例子 2-14 数组转置操作 。
在 MATLAB命令行窗口中,键入下面的指令:
>> %创建矩阵
>> A = ones(2,3); A(:)=1:6
第二章 matlab 基础 计算机仿真与模拟
A =
1 3 5
2 4 6
>> %矩阵转置
>> A'.
ans =
1 2
3 4
5 6
>> %数组转置
>> A'.
第二章 matlab 基础 计算机仿真与模拟
ans =
1 2
3 4
5 6
>> %复数运算,矩阵 A成为复数矩阵
>> A = A*I
A =
0 + 1.0000i 0 + 3.0000i 0 + 5.0000i
0 + 2.0000i 0 + 4.0000i 0 + 6.0000i
第二章 matlab 基础 计算机仿真与模拟
>> %矩阵转置
>> A'
ans =
0 - 1.0000i 0 - 2.0000i
0 - 3.0000i 0 - 4.0000i
0 - 5.0000i 0 - 6.0000i
>> %数组转置
>> A.'
ans =
0 + 1.0000i 0 + 2.0000i
0 + 3.0000i 0 + 4.0000i
0 + 5.0000i 0 + 6.0000i
第二章 matlab 基础 计算机仿真与模拟从例子 2-14可以看出,对于实数矩阵,矩阵转置和数组转置的计算结果是一致的,但是对于复数矩阵,数组转置和矩阵转置的计算结果就不一致。所以,对于数组转置运算也被称为非共轭转置,矩阵转置运算则被称为共轭转置。
第二章 matlab 基础 计算机仿真与模拟
2,数组幂数组幂运算符就是在矩阵幂运算符前加上符号,,”,见例子 2-15。
例子 2-15 数组幂运算 。
在 MATLAB命令行中,键入下面的指令:
>> %本例子中使用的矩阵
>> A
A =
0 + 1.0000i 0 + 3.0000i 0 + 5.0000i
0 + 2.0000i 0 + 4.0000i 0 + 6.0000i
第二章 matlab 基础 计算机仿真与模拟
>> %矩阵幂运算
>> A^3
Error using ==> ^
Matrix must be square.
>> %数组幂运算
>> A.^3
ans =
1.0e+002 *
0 - 0.0100i 0 - 0.2700i 0 - 1.2500i
0 - 0.0800i 0 - 0.6400i 0 - 2.1600i
第二章 matlab 基础 计算机仿真与模拟
3,数组乘法和前面两种运算类似,数组乘法运算符是在矩阵乘法运算符前加上符号,,”,见例子 2-16。
例子 2-16 数组乘法示例 。
在 MATLAB命令行中,键入下面的指令:
>> %本例子中使用的矩阵
>> A
A =
0 + 1.0000i 0 + 3.0000i 0 + 5.0000i
0 + 2.0000i 0 + 4.0000i 0 + 6.0000i
第二章 matlab 基础 计算机仿真与模拟
>> %矩阵乘法
>> A*5
ans =
0 + 5.0000i 0 +15.0000i 0 +25.0000i
0 +10.0000i 0 +20.0000i 0 +30.0000i
>> %数组乘法
>> A.*5
ans =
0 + 5.0000i 0 +15.0000i 0 +25.0000i
0 +10.0000i 0 +20.0000i 0 +30.0000i
第二章 matlab 基础 计算机仿真与模拟
>> %矩阵乘法
>> A*A'
ans =
35 44
44 56
>> %数组乘法
>> A.*A
ans =
-1 -9 -25
-4 -16 -36
第二章 matlab 基础 计算机仿真与模拟
4 基本数学函数在 MATLAB中有部分函数可以用来进行基本的数学运算,
主要有如下类别:三角函数 (见表 2-4)、指数运算函数 (见表 2-5)、
复数运算函数 (见表 2-6)、圆整和求余函数 (见表 2-7)。需要注意的是这些函数的参数可以是矩阵也可以是向量或者多维数组,
函数在处理参数时,都是按照数组运算的规则来进行的,也就是说对于 的矩阵,函数 f(● )的运算针对的是 。
nm?
nmijaA ][
ija
第二章 matlab 基础 计算机仿真与模拟表 2-4 三 角 函 数函 数 说 明 函 数 说 明 函 数 说 明
sin 正弦函数 ta nh 双曲正切函数 c sc h 双曲余割函数
sin h 双曲正弦函数 a ta n 反正切函数 a c sc 反余割函数
a sin 反正弦函数 a ta n2 四象限反正切函数 a c sc h 反双曲余割函数
a sin h 反双曲正弦函数 a ta nh 反双曲正切函数 cot 余切函数
cos 余弦函数 se c 正割函数 c ot h 双曲余切函数
c os h 双曲余弦函数 se c h 双曲正割函数 acot 反余切函数
acos 反余弦函数 as ec 反正割函数 a c ot h 反双曲余切函数
a c os h 反双曲余弦函数 a se c h 双曲反正割函数
ta n 正切函数 c sc 余割函数第二章 matlab 基础 计算机仿真与模拟表 2-5 指数运算函数函 数 说 明 函 数 说 明
exp 指数函数 r e a lp o w 实数幂运算函数
lo g 自然对数函数 r e a ll o g 实数自然对数函数
lo g 1 0 常用对数函数 r e a ls q r t 实数平方根函数
lo g 2 以 2 为底的对数函数 sq r t 平方根函数
p o w 2 2 的幂函数 n e x tp o w 2 求大于输入参数的第一个 2 的幂第二章 matlab 基础 计算机仿真与模拟说明:
以 real开头的函数仅能处理实数,如输入的参数为复数,
则 MATLAB会报错 。
函数 nextpow2是用来计算仅仅比输入参数大的第一个 2的幂,例如输入参数为 N,则函数的计算结果整数 P需要满足的条件为 2P≥abs(N)≥2P-1。
第二章 matlab 基础 计算机仿真与模拟表 2-6 复 数 运 算函 数 说 明 函 数 说 明
abs 求复数的模,若参数为实数则求绝对值 r e a l 求复数的实部
a n g le 求复数的相角 u n w r a p 相位角按照 360 °线调整
c o m p le x 构造复数 is r e a l 判断输入参数是否为实数
conj 求复数的共轭复数 c p lx p a ir 复数阵成共轭对形式排列
im a g e 求复数的虚部第二章 matlab 基础 计算机仿真与模拟表 2-7 圆整和求余函数函 数 说 明 函 数 说 明
fix 向 0 取整的函数 m od 求模函数
flo or 向
取整的函数 re m 求余数
c e il 向
取整的函数 sig n 符号函数
ro un d 向最近的整数取整的函数第二章 matlab 基础 计算机仿真与模拟例子 2-17 MATLAB的圆整和求余函数。
在 MATLAB的命令行中,键入下面的指令:
>> fix(-1.9)
ans =
-1
>> floor(-1.9)
ans =
-2
>> round(-1.9)
ans =
-2
>> ceil(-1.9)
ans =
-1
第二章 matlab 基础 计算机仿真与模拟上面比较了四种圆整函数处理同一个数据的结果,在使用不同的取整函数时要注意各个函数的特点 。 其实这四种圆整函数之间的区别主要是进行圆整运算时,趋近的方向不尽相同 。
例如 fix函数是将数据向 0的方向趋近,而 floor函数是向无穷大的方向上趋近 。
>> mod(9,-2)
ans =
-1
>> rem(9,-2)
ans =
1
第二章 matlab 基础 计算机仿真与模拟
5 矩阵 (数组 )操作函数在前面的小节中主要介绍了进行数学运算的 MATLAB函数,
在 MATLAB中还存在一类函数用来获取矩阵或者数组的信息,
以及对数组进行操作,在表 2-8中列举了较常用的函数。完整的函数列表内容可以在 MATLAB命令行中键入 help elmat指令来察看。
第二章 matlab 基础 计算机仿真与模拟表 2-8 用于矩阵 (数组 )操作的常用函数函 数 说 明
size 获取矩阵的行、列数,对于多维数组,获取数组的各个维的尺寸
len gth 获取向量长度,若输入参数为矩阵或多维数组,则返回各个维尺寸的最大值
ndim s 获取矩阵或者多维数组的维数
num el 获取矩阵或者数组的元素个数
disp 显示矩阵或者字符串内容 ( 有关字符串的内容将在第三章中讲述 )
cat 合并不同的矩阵或者数组
re sha pe 保持矩阵元素的个数不变,修改矩阵的行数和列数
re pm at 复制矩阵元素并扩展矩阵
fliplr 交换矩阵左右对称位置上的 元素
flipud 交换矩阵上下对称位置上的元素
flipdim 按照指定的方向翻转交换矩阵元素
find 获取矩阵或者数组中非零元素的索引第二章 matlab 基础 计算机仿真与模拟例子 2-18 reshape函数的使用示例 。
在前面的例子 2-11中曾经使用过 reshape函数,这里将详细讨论该函数的使用方法,在 MATLAB命令行中,键入下面的指令:
>> A = 1:8
A =
1 2 3 4 5 6 7 8
>> B = reshape(A,2,4)
第二章 matlab 基础 计算机仿真与模拟
B =
1 3 5 7
2 4 6 8
>> C = reshape(B,3,3)
Error using ==> reshape
To RESHAPE the number of elements must not change,
第二章 matlab 基础 计算机仿真与模拟例子 2-19 对称交换函数的使用示例。
在 MATLAB命令行中,键入下面的指令:
>> A = reshape(1:9,3,3)
A =
1 4 7
2 5 8
3 6 9
>> fliplr(A)
ans =
7 4 1
8 5 2
9 6 3
第二章 matlab 基础 计算机仿真与模拟
>> flipud(A)
ans =
3 6 9
2 5 8
1 4 7
>> flipdim(A,1)
ans =
3 6 9
2 5 8
1 4 7
>> flipdim(A,2)
ans =
7 4 1
8 5 2
9 6 3
第二章 matlab 基础 计算机仿真与模拟在生成比较复杂的矩阵时,可以使用 MATLAB提供的矩阵扩展方法完成相应矩阵的构造。假设矩阵 A为三阶方阵,B
为二阶方阵,由矩阵 A和 B组合构成五阶方阵,其中 O为相应的零矩阵,具体的创建方法见例子 2-20。
BO
OA
C
第二章 matlab 基础 计算机仿真与模拟例子 2-20 创建复杂矩阵。
在 MATLAB命令行中,键入下面的指令:
>> A = reshape(1:9,3,3);
>> B = [1 2 ; 3 4];
>> O = zeros(length(A),length(B))
O =
0 0
0 0
0 0
>> C = [ A O; O' B]
C =
1 4 7 0 0
2 5 8 0 0
3 6 9 0 0
0 0 0 1 2
0 0 0 3 4
第二章 matlab 基础 计算机仿真与模拟例子 2-21 使用方括号创建复杂矩阵。
在 MATLAB命令行中,键入下面的指令:
>> A = [1 2 ; 3 4];
>> B = [ A,A*2 ; tril(A),triu(A) ; A*3,A*4]
B =
1 2 2 4
3 4 6 8
1 0 1 2
3 4 0 4
3 6 4 8
9 12 12 16
第二章 matlab 基础 计算机仿真与模拟例子 2-22 函数 repmat的应用示例。
>> repmat(magic(2),2,3)
ans =
1 3 1 3 1 3
4 2 4 2 4 2
1 3 1 3 1 3
4 2 4 2 4 2
第二章 matlab 基础 计算机仿真与模拟
repmat函数的基本语法为 repmat(A,M,N),它的作用是将指定的矩阵 A复制 M?N次,然后创建一个复杂的大矩阵,结果
,因此,在例子 2-22中,将一个简单的二行二列的矩阵进行了六次重复,创建了四行六列的大矩阵。
NM
AA
A
AAA
.,,.,,
.,,.,,.,,.,,
.,,.,,.,,
.,,
第二章 matlab 基础 计算机仿真与模拟
2.1.6 稀 疏 矩 阵矩阵元素的表示方法是计算机数据结构理论中经常讨论的话题,因为在实际工作中,经常遇到这样一类矩阵,这类矩阵中数值为 0的元素居多,这类矩阵一般被称为稀疏矩阵。如果使用满阵的方式来表示稀疏矩阵,则 0元素将占用相当的内存空间,
特别是在 MATLAB中,由于 MATLAB默认的数据类型是双精度类型,每一个双精度类型的数据元素都要占用八个字节的内存空间,当 0元素很多的时候将占用相当可观的内存空间,因此,
在 MATLAB中,专门提供了稀疏矩阵的表示方法。
第二章 matlab 基础 计算机仿真与模拟例子 2-23 创建稀疏矩阵。
在 MATLAB命令行窗口中键入下面的指令:
>> A = eye(5)
A =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
第二章 matlab 基础 计算机仿真与模拟
>> B = sparse(A)
B =
(1,1) 1
(2,2) 1
(3,3) 1
(4,4) 1
(5,5) 1
>> whos
Name Size Bytes Class
A 5x5 200 double array
B 5x5 84 double array (sparse)
Grand total is 30 elements using 284 bytes
第二章 matlab 基础 计算机仿真与模拟在例子 2-23中,首先使用 eye函数创建了五阶的单位矩阵,
五阶单位方阵一共有 25个元素,其中却有 20个元素是 0,于是使用 sparse函数将该函数构造成为稀疏矩阵,这样就得到了矩阵 B。
通过 whos指令可以清晰地比较两个矩阵占用的内存空间,
A矩阵占用了 200个字节,而 B矩阵仅占用了 84个字节。
第二章 matlab 基础 计算机仿真与模拟稀疏矩阵和普通矩阵 (满阵 )之间可以直接进行运算,例如
>> A+B
ans =
2 0 0 0 0
0 2 0 0 0
0 0 2 0 0
0 0 0 2 0
0 0 0 0 2
第二章 matlab 基础 计算机仿真与模拟这里运算得到的结果是一个满阵,请读者在进行稀疏矩阵运算的时候注意 。
MATLAB中使用“三元组”表示法来表示稀疏矩阵,该表示方法一般由三个向量组成:第一个向量是由矩阵中非零元素组成的向量,其长度一般为 nzmax,即矩阵中所有非零元素的个数;第二个向量是非零元素的行序号,该向量的长度也为
nzmax;第三个向量是非零元素的列序号,该向量的长度也为
nzmax。
第二章 matlab 基础 计算机仿真与模拟例如对于下面的稀疏矩阵:
0 0 0 28 0 0
0 0 0 0 0 91
0 0 0 0 0 0
0 0 6 0 0 0
0 0 0 3 11 0
15 0 22 0 0 15
S
因此,表示矩阵的三个向量分别为
>> data = [15 91 11 3 28 22?6?15];
>> ir = [ 1 5 2 2 6 1 3 1];
>> jc = [1 1 2 3 3 4 4 6];
第二章 matlab 基础 计算机仿真与模拟利用上面的三个矩阵和 sparse函数创建六行六列的稀疏矩阵:
>> S = sparse(ir,jc,data,6,6)
S =
(1,1) 15
(5,1) 91
(2,2) 11
(2,3) 3
(6,3) 28
(1,4) 22
(3,4) -6
(1,6) -15
第二章 matlab 基础 计算机仿真与模拟
>> %将该矩阵还原成满阵
>> full(S)
ans =
15 0 0 22 0 -15
0 11 3 0 0 0
0 0 0 -6 0 0
0 0 0 0 0 0
91 0 0 0 0 0
0 0 28 0 0 0
第二章 matlab 基础 计算机仿真与模拟
>> whos
Name Size Bytes Class
S 6x6 124 double array (sparse)
ans 6x6 288 double array
data 1x8 64 double array
ir 1x8 64 double array
jc 1x8 64 double array
Grand total is 68 elements using 604 bytes
第二章 matlab 基础 计算机仿真与模拟注意:
在不同的语言或者数学计算工具软件中,表示稀疏矩阵的方法可能不尽相同 。
MATLAB专门提供了若干函数用于稀疏矩阵的运算,在表
2-9中对这些函数进行了总结 。
提示:
在 MATLAB命令行窗口中键入指令 help sparfun可以得到稀疏矩阵运算函数的列表。
第二章 matlab 基础 计算机仿真与模拟表 2-9 稀疏矩阵的常用函数创建稀疏矩阵
spe ye 创建单位稀疏矩阵
spra nd 创建均匀分布的随机数稀疏矩阵
spra ndn 创建正态分布的随机数稀疏矩阵满阵和稀疏矩阵之间的转换
spa rse 创建稀疏矩阵或者将满阵转变为稀疏矩阵
full 将稀疏矩阵转变为满阵
find 获取非零元素的索引向量稀疏矩阵的操作函数
nnz 获取矩阵的非零元素的个数
noz er os 获取矩阵的非零元素向量
nz m ax 获取矩阵的各个向量的最大长度
spon es 将稀疏矩阵中的元素用数字 1 替代
isspar se 判断输入 参数是否为稀疏矩阵第二章 matlab 基础 计算机仿真与模拟
2.1.7 多 维 数 组
1 创建多维数组多维数组的创建也有多种方法:第一种方法是使用直接赋值的方法来创建;第二种方法是使用部分 MATLAB的函数创建多维数组 。 具体的做法结合例子讲述 。
例子 2-24 使用直接赋值的方法创建多维数组。
第二章 matlab 基础 计算机仿真与模拟在 MATLAB的命令行中,键入下面的指令:
>> A = pascal(4)
A =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
>> A(:,:,2) = eye(4)
A(:,:,1) =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
第二章 matlab 基础 计算机仿真与模拟
A(:,:,2) =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
>> A(:,:,3) = magic(5)
Subscripted assignment dimension mismatch,
在例子 2-24中,首先创建了一个矩阵 ——帕斯卡矩阵,也可以将其看作二维数组,然后,使用全下标的形式创建了三维数组的第二页,第二页上的矩阵是一个单位阵,接着在创建新的一页时使用了五阶方阵作为输入,由于维数不匹配所以系统报错。
第二章 matlab 基础 计算机仿真与模拟例子 2-25 使用直接赋值的方法创建多维数组。
在 MATLAB的命令行中,键入下面的指令:
>> B(3,3,3) = 1
B(:,:,1) =
0 0 0
0 0 0
0 0 0
B(:,:,2) =
0 0 0
0 0 0
0 0 0
B(:,:,3) =
0 0 0
0 0 0
0 0 1
第二章 matlab 基础 计算机仿真与模拟例子 2-26 使用函数创建多维数组。
在 MATLAB命令行中,键入下面的指令:
>> rand(3,3,3)
ans(:,:,1) =
0.9501 0.4860 0.4565
0.2311 0.8913 0.0185
0.6068 0.7621 0.8214
ans(:,:,2) =
0.4447 0.9218 0.4057
0.6154 0.7382 0.9355
0.7919 0.1763 0.9169
ans(:,:,3) =
0.4103 0.3529 0.1389
0.8936 0.8132 0.2028
0.0579 0.0099 0.1987
第二章 matlab 基础 计算机仿真与模拟例子 2-27 使用函数 cat构造多维数组。
在 MATLAB命令行中,键入下面的指令:
>> A = magic(3);
>> B = eye(3);
>> C = pascal(3);
>> cat(3,A,B,C)
ans(:,:,1) =
8 1 6
3 5 7
4 9 2
第二章 matlab 基础 计算机仿真与模拟
ans(:,:,2) =
1 0 0
0 1 0
0 0 1
ans(:,:,3) =
1 1 1
1 2 3
1 3 6
第二章 matlab 基础 计算机仿真与模拟在本例子中利用 cat函数将三个三阶方阵组合构成一个三维数组 。
有关构造数组的函数的具体使用方法可参阅 MATLAB的帮助文档或在线帮助 。
访问多维数组的元素和访问向量或者矩阵元素的方法一致,
不仅可以使用相应的索引作为下标访问多维数组的元素,而且也可以使用单下标的方式来访问 。
在前面曾经提及了两个函数可以用于全下标和单下标之间的转换,这两个函数分别为 sub2ind和 ind2sub,在例子 2-28中演示了这两个函数的使用方法。
第二章 matlab 基础 计算机仿真与模拟例子 2-28 单下标和全下标之间的转换。
>> %创建多维数组
>> A = rand(3,3,4);
>> %全下标向单下标转换
>> sub2ind(size(A),2,3,2)
ans =
17
>> %单下标向全下标转换
>> ind2sub(size(A),17)
第二章 matlab 基础 计算机仿真与模拟
ans =
17
>> [i,j,k] = ind2sub(size(A),17)
i =
2
j =
3
k =
2
第二章 matlab 基础 计算机仿真与模拟
2 多维数组的操作函数在 MATLAB中有一组函数专门用于处理多维数组,见表 2-10。
表 2-10 多维数组的操作函数函 数 说 明
n d g ri d 根据输入的向量产生用于函数和插值运算的多维数组
p e rm u te 改变多维数组的维数顺序
ip e rm u te p e rm u te 函数的逆运算
sh if td im 平移多维数组的维数
c ir c sh if t 循环平移多维数组的行或列元素
sq u e e z e 进行数组降维操作,将多维数组中维数为 1 的页消除第二章 matlab 基础 计算机仿真与模拟例子 2-28 permute函数和 ipermute函数的使用示例 。
在 MATLAB命令行中,键入下面的指令:
>> a = rand(2,3,4);
>> size(a)
ans =
2 3 4
>> b = permute(a,[ 2 1 3]);
>> size(b)
ans =
3 2 4
>> c = ipermute(b,[2 1 3]);
>> size(c)
ans =
2 3 4
第二章 matlab 基础 计算机仿真与模拟在本例子中,首先创建了一个二行三列四页的三维数组,
然后使用 permute函数将三维数组转变成为了一个三行二列四页的三维数组 。 ipermute函数是 permute函数的逆运算,在例 2-28
中最后得到的三维数组 c和三维数组 a是完全一致的 。
注意:
permute函数和 ipermute函数的第二个参数是一个向量,向量内的元素是多维数组各个维的序号。
第二章 matlab 基础 计算机仿真与模拟例子 2-29 shiftdim函数的使用示例。
在 MATLAB命令行中,键入下面的指令:
>> a = rand(1,2,3,4,5);
>> size(a)
ans =
1 2 3 4 5
>> size(shiftdim(a))
ans =
2 3 4 5
>> size(shiftdim(a,2))
ans =
3 4 5 1 2
>> size(shiftdim(a,?2))
ans =
1 1 1 2 3 4 5
第二章 matlab 基础 计算机仿真与模拟例子 2-30 squeeze函数的使用示例 。
在 MATLAB命令行中,键入下面的指令:
>> a = rand(1,2,1,3,1,4,1,5);
>> size(a)
ans =
1 2 1 3 1 4 1 5
>> size(squeeze(a))
ans =
2 3 4 5
squeeze函数的作用是将多维数组中尺寸为 1的页删除,以缩减多维数组的维数,同时保持数组的元素个数不变。
第二章 matlab 基础 计算机仿真与模拟
2.2 数 据 类 型
2.2.1 概述
2.2.2 MATLAB基本数值类型
2.2.3 逻辑类型和关系运算
2.2.4 字符串
2.2.5 元胞数组
2.2.6 结构第二章 matlab 基础 计算机仿真与模拟
2.2.1 概 述
MATLAB的早期版本只有非常简单的二维数组和字符类型的数据,目前的 MATLAB版本中不仅有多达十几种的基本数据类型,在不同的专业工具箱中还有特殊的数据类型,并且
MATLAB还支持面向对象的编程技术,支持用户自定义的数据类型 。
MATLAB支持的基本数据类型见图 3-1。
第二章 matlab 基础 计算机仿真与模拟图 2-6 MATLAB的数据类型
M A T L A B 数据类型基本数值类型 字符串 元胞数组 结构内嵌对象函数句柄 J a v a 对象 逻辑类型双精度类型 单精度类型 整数类型 用户自定义类
i n t 8,u i n t 8
i n t 1 6,u i n t 1 6
i n t 3 2,u i n t 3 2
i n t 6 4,u i n 6 4
第二章 matlab 基础 计算机仿真与模拟获取 MATLAB的数据类型列表可以在 MATLAB命令行窗口中键入 help datatypes命令 。
在图 2-6中所示的各种数据类型都可以用于创建向量、矩阵或者多维数组。用户自定义的数据类型也是图示的各种数据类型的组合。在不同的 MATLAB工具箱中具有自定义的数据类型,
例如控制系统工具箱中定义的 LTI对象,在滤波器设计工具箱中定义的滤波器对象,在符号数学工具箱中定义的符号类型数据等。这些工具箱中包含的特殊数据对象也都使用这些基本的数据类型组合构成。
第二章 matlab 基础 计算机仿真与模拟需要指出一点,MATLAB的基本数据类型是双精度数据类型和字符类型。 MATLAB的 M语言和其他高级编程语言不同的是,MATLAB没有具体的变量或对象声明和定义过程,任何数据类型的变量或对象都可以利用面向对象编程技术中构造函数的方法或者数据类型转换的方法来创建其他数据类型对象和变量。 MATLAB和 Java语言,C++语言类似,所有数据类型就是相应的类,具有一定的面向对象的特点。 MATLAB的不同数据类型的变量或对象占用的内存空间不尽相同,不同的数据类型的变量或对象也具有不同的操作函数。在本节中,将详细讲述
MATLAB的基本数值类型、逻辑类型、字符串、元胞数组和结构的使用方法,其中,元胞数组是 MATLAB中常用的一种独有的数据类型。
第二章 matlab 基础 计算机仿真与模拟
2.2.2 MATLAB基本数值类型
1 基本数值类型入门表 2-11 MATLAB的基本数值类型数据类型 说 明 字节数 取 值 范 围
dou ble 双精度数据类型 8
spa rse 稀疏矩阵数据类型 N/A
single 单精度数据类型 4
uint8 无符号 8 位整数 1 0 ~ 255
uint1 6 无符号 16 位整数 2 0 ~ 65 535
uint3 2 无符号 32 位整数 4 0 ~ 4 294 967 295
uint6 4 无符号 64 位整数 8 0 ~ 18 446 744 073 709 551 615
int8 有符号 8 位整数 1? 128 ~ 127
int16 有符号 16 位整数 2? 32 768 ~ 32 767
int32 有符号 32 位整数 4? 2 147 4 83 648 ~ 2 147 483 647
int64 有符号 64 位整数 8? 9 223 3 72 036 854 775 808 ~ 9 223 372 036 854 775 807
第二章 matlab 基础 计算机仿真与模拟说明:
表格中所指的字节数是指使用该数据类型创建数组或者矩阵时,每一个元素占用的内存字节数,稀疏矩阵则不同,由于稀疏矩阵使用了特殊的存储数据方法,所以稀疏矩阵对象占用的内存字节数比较特殊 。
复数数据类型也相对特殊,复数可以用表格中所示的各种数据类型创建,但是由于复数由实部数据和虚部数据组成,所以占用的字节数为构成复数的数据类型的两倍,例如复数 z =
1+i,在 MATLAB中占用了 16个字节的内存。
第二章 matlab 基础 计算机仿真与模拟例子 2-31 使用不同的数据类型。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = [ 1 2 3];
>> class(A)
ans =
double
>> whos
Name Size Bytes Class
A 1x3 24 double array
ans 1x6 12 char array
Grand total is 9 elements using 36 bytes
第二章 matlab 基础 计算机仿真与模拟
>> B = int16(A);
>> class(B)
ans =
int16
>> whos
Name Size Bytes Class
A 1x3 24 double array
B 1x3 6 int16 array
ans 1x5 10 char array
Grand total is 11 elements using 40 bytes
第二章 matlab 基础 计算机仿真与模拟在例子 2-31中,使用了 int16,即 16位的有符号整数类型,
作为示例,并且使用 class函数获取不同变量或者对象的数据类型。向量 B是从向量 A通过数据类型转换得到的,可以看出,A
和 B向量包含同样的数据,但是由于两个向量的数据类型不同,
所以它们占据的内存字节数不同,其中双精度类型的向量 A占用了 24个字节,而 16位整数类型的向量 B仅占用了 6个字节。
第二章 matlab 基础 计算机仿真与模拟注意:
MATLAB和 C语言在处理数据类型和变量时不同 。 在 C语言中,任何变量在使用之前都必须声明,然后赋值,在声明变量时就指定了变量的数据类型 。 但是在 MATLAB中,任何数据变量都不需要预先的声明,MATLAB将自动地将数据类型设置为双精度类型,若需要使用其他类型的数据,则必须通过数据类型的转换完成 。 MATLAB的数据类型名称同样就是数据类型转换的函数,利用这些函数来完成相应的数据类型转化的工作 。
关于数据类型转换函数的使用可以参阅相应的在线帮助。
第二章 matlab 基础 计算机仿真与模拟例子 2-32 使用不同的数据类型。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = [ 1 2 3];
>> b = [ 3 4 5];
>> c = a+b;
>> whos
Name Size Bytes Class
a 1x3 24 double array
b 1x3 24 double array
c 1x3 24 double array
Grand total is 9 elements using 72 bytes
>> c=int16(a)+b
Error using ==> plus
Integers can only be combined with integers of the
same class,or scalar doubles.
第二章 matlab 基础 计算机仿真与模拟
2 整数类型数据运算
MATLAB运算的基本数据类型为双精度的数据类型,
MATLAB还另外提供了一些函数可以进行整数类型数据的运算,
在表 2-12中总结了这些函数。
表 2-12 整数类型数据的运算函数函 数 说 明
bitand 数据位“与”运算
bitcmp 按照指定的数据位数求数据的补码
bitor 数据位“或”操作
bitmax 最大的浮点整数数值,一般为 2
53
1=9 007 199 254 740 991
bitxor 数据位“异或”操作
bits et 将指定的数据位设置为 1
bitget 获取指定的数据位数值
bits hift 数据位移操作第二章 matlab 基础 计算机仿真与模拟注意:
整数类型数据运算函数的操作数一般为无符号的整数,不同的函数会有所不同,函数运算的结果必须小于 bitmax代表的数值 。
提示:数据位运算了解计算机中数据的二进制表达是进行二进制位运算的基础。在计算机中的任何数据都是由二进制数来保存的,计算机最初能够处理的也只有二进制的数据。对于整数可以使用原码、
反码、补码来表示。
第二章 matlab 基础 计算机仿真与模拟字节和位字节这个概念对于计算机用户来讲并不陌生,计算机中的存储器就是由许许多多被称为,字节,(byte)的单元组成的 。
一般地,内存的最小度量单位是位 (bit),有些地方叫作比特 。 而一个字节就是由 8个二进制位组成的,其中,最右边的一位叫最低位,最左边的一位叫作最高位 。 所以在本章前面小节介绍的 16位整数占用两个字节的内存,依次类推,32位整数就需要占用四个字节的内存 。
在计算机中表示数据可以有不同的方法,一般有原码,反码和补码三种形式 。
为了便于表述,这里所有的数字都将按照数字在八位计算机内的表示方式来表示。
第二章 matlab 基础 计算机仿真与模拟原码将最高位作为符号位 (以数字 0表示正,以数字 1表示负 ),
其他的数字位代表数值本身的绝对值,这种表示数字的方式叫作原码 。
例如,数字 7在八位计算机中的原码为 0000 0111;而数字 -
7在八位计算机中的原码为 1000 0111。
如果这两个数字在我们日常使用的 32位计算机中用原码表示,则无非再多几个数字 0。例如在 32位的计算机中用原码表示数字 7,则为 0000 0000 0000 0000 0000 0000 0000 0111。
第二章 matlab 基础 计算机仿真与模拟反码用反码表示数字的规则是,如果是正数,则用这个数字的原码来表示,如果是负数,则保持符号位为 1,然后将这个数字的原码按照每位取反,得到这个数字的反码 。
例如,数字 7在八位计算机中的反码就是它的原码,为 000
0111;而数字 -7在八位计算机中的反码是 1111 1000。
第二章 matlab 基础 计算机仿真与模拟补码计算机中表示数据的一般方式是补码,补码是这样规定的:
一个正数的补码就是其原码,例如整数 7在八位计算机中的补码是 0000 0111。
对于负数的补码是将数字的反码加上 1,就得到了这个数字的补码 。 例如 -7在 8位计算机中的补码是 1111 1001。
关于数字在计算机中二进制表示的详细解释请参阅相应的计算机原理方面的书籍。
第二章 matlab 基础 计算机仿真与模拟
MATLAB整数类型数据运算和 C语言整数位运算比较类似,
所不同的是 MATLAB中没有相应的运算符,而只有这些函数可用,并且这些整数运算的数据都必须大于 0。 这里结合具体的示例讲解表 2-12所列函数的用法 。
第二章 matlab 基础 计算机仿真与模拟例子 2-33(a) 数据位,与,操作。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = 86; B = 77;
>> C = bitand(A,B)
C =
68
>> a = uint16(A);b = uint16(B);
>> c = bitand(a,b)
c =
68
>> whos
第二章 matlab 基础 计算机仿真与模拟
Name Size Bytes Class
A 1x1 8 double array
B 1x1 8 double array
C 1x1 8 double array
a 1x1 2 uint16 array
b 1x1 2 uint16 array
c 1x1 2 uint16 array
Grand total is 6 elements using 30 bytes
第二章 matlab 基础 计算机仿真与模拟注意例子 2-33(a)运算得到结果的数据类型,数据 a,b为无符号的 16位整数,所以进行操作的结果也是无符号的 16位整数,
但数据 A,B为双精度类型的数据 (注意这些数据都是非负整数 ),
结果运算的结果是双精度类型 。
运算的过程大体如下:
(68)
86 的补码
77 的补码
010 1 01 10
010 0 1 101
“与”运算的结果 010 0 010 0
第二章 matlab 基础 计算机仿真与模拟例子 2-33(b) 整数数据位的运算。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = 86;
>> dec2bin(A)
ans =
1010110
>> B = bitset(A,6);
>> dec2bin(B)
ans =
1110110
>> C = bitset(A,7,0);
>> dec2bin(C)
第二章 matlab 基础 计算机仿真与模拟
ans =
10110
>> D = bitshift(A,-4);
>> dec2bin(D)
ans =
10101100000
>> E = bitshift(A,-4);
>> dec2bin(E)
ans =
101
>> a = uint16(A);
>> e = bitshift(A,-4);
>> dec2bin(e)
ans =
101
第二章 matlab 基础 计算机仿真与模拟
>> whos
Name Size Bytes Class
A 1x1 8 double array
B 1x1 8 double array
C 1x1 8 double array
D 1x1 8 double array
E 1x1 8 double array
a 1x1 2 uint16 array
ans 1x3 6 char array
e 1x1 8 double array
Grand total is 10 elements using 56 bytes
第二章 matlab 基础 计算机仿真与模拟说明:
dec2bin函数是将十进制整数转变成二进制整数字符串的函数,该函数将在后面字符串转换函数中详细讲述 。
在例子 2-33(b)中,使用了 bitset函数和 bitshift函数,其中
bitshift函数类似于 C语言的,>>”运算符和,<<”运算符,如果函数输入的第二个参数为正数,则进行左位移操作,否则为右位移操作。 bitset函数根据输入的第二个参数设置相应的数据位的数值,若不指定第三个参数,则将相应的数据位设置为,1”,
否则根据输入的第三个参数 (0或者 1)设置相应的数据位。另外,
注意一些函数运算的结果,有些函数的运算结果是双精度数据类型。
第二章 matlab 基础 计算机仿真与模拟
3 MATLAB的常量表 2-13 MATLAB的常量常 量 说 明
ans 最近运算的结果
eps 浮点数相对精度
realm ax MA TL AB 能够表示的实数的最大绝对值
realm in MA TL AB 能够表示的实数的最小绝对值
pi 常数 π
i,j 复数的虚部数据最小单位
I nf 无穷大
NaN 非数 (Not a Numbe r)
第二章 matlab 基础 计算机仿真与模拟说明:
eps,realmax 和 realmin 三个常量具体的数值与运行
MATLAB的计算机相关,不同的计算机系统可能具有不同的数值,例如,在 我 的 计 算 机 上,这 三 个 数 值 分 别 为
eps=2.2204× 10-16,realmax=1.7977× 10308,
realmin=2.2251× 10-308。
和其他的高级编程语言所定义的常量不同,MATLAB的常量数值是可以修改的。例如,在 MATLAB命令行窗口中可以键入如下的指令,pi=100,这样 pi这个常量的数值就变成了 100。
但是,如果用 clear指令清除变量后,pi将变成原有的常量数值。
第二章 matlab 基础 计算机仿真与模拟
Inf也可以写作 inf,它为 IEEE定义的算术数据无穷大数值,
在 MATLAB中进行诸如 1.0/0.0或者 exp(1000)的操作时都会得到这个数值 。 如果将 inf应用于函数,则计算结果可能为 inf或者
NaN。
NaN也可以写作 nan,它为 IEEE规定的某种运算得到的结果,例如 0/0的运算得到的结果就是 NaN。 NaN参与运算的结果也为 NaN(关系运算除外 )。
第二章 matlab 基础 计算机仿真与模拟例子 2-34 NaN和 Inf运算示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = inf;
>> class(a)
ans =
double
>> b = int16(a)
b =
32767
>> c = sin(a)
c =
NaN
第二章 matlab 基础 计算机仿真与模拟
>> sin(c)
ans =
NaN
>> class(c)
ans =
double
>> int64(c)
ans =
0
第二章 matlab 基础 计算机仿真与模拟说明:
MATLAB中所有的数据默认类型均为双精度类型,包括像
NaN和 Inf在内的上述若干常数 。
对 NaN和 Inf进行数据转化时要注意,Inf将获取相应数据类型的最大值,而 NaN往往返回相应整数数据类型的数值 0,浮点数类型则仍然为 NaN。
在运算中使用 NaN可以避免因为执行了 0/0这类能够产生错误的应用程序中断,可以辅助调试应用程序。
第二章 matlab 基础 计算机仿真与模拟例子 2-35 最小复数单位的使用。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = i
a =
0 + 1.0000i
>> i = 1
i =
1
>> b = i+j
b =
1.0000 + 1.0000i
>> clear
>> c = i+j
c =
0 + 2.0000i
第二章 matlab 基础 计算机仿真与模拟通过例子 2-35可以看出,MATLAB的常量是可以赋予新的数值的。一旦被赋予了新的数值,则常量代表的就不是原有的数值,而是新的数值,除非执行 clear命令。就像创建变量 c的时候,由于执行了 clear指令,将工作空间中的变量清除干净,
于是在执行 c = i+j的时候,MATLAB认为这是在进行两个最小复数运算单位的计算,所以得到了 c = 2i。
第二章 matlab 基础 计算机仿真与模拟
4 空数组所谓空数组,就是指那些某一个维或者某些维的长度为 0
的数组 。 它是为了完成某些 MATLAB操作和运算而专门设计的一种数组 。 利用空数组可以修改数组的大小,但是不能修改数组的维数 。
下面通过具体的例子来说明空数组创建和使用的过程 。
例子 2-36 创建空数组 。
和创建普通的数组 (矩阵 )一样,创建空数组也有不同的方法,在 MATLAB命令行窗口中键入下面的命令:
第二章 matlab 基础 计算机仿真与模拟
>> A = []
A =
[]
>> B = ones(2,3,0)
B =
Empty array,2-by-3-by-0
>> C = randn(2,3,4,0)
C =
Empty array,2-by-3-by-4-by-0
>> whos
Name Size Bytes Class
A 0x0 0 double array
B 2x3x0 0 double array
C 4-D 0 double array
Grand total is 0 elements using 0 bytes
第二章 matlab 基础 计算机仿真与模拟空数组并不意味着什么都没有,使用 whos命令可以看到空数组类型的变量在 MATLAB的工作空间中确实存在。在数组编辑器中也可以对空数组进行编辑,填充矩阵的元素。图 2-7为空数组在数组编辑器中显示的状况。
第二章 matlab 基础 计算机仿真与模拟图 2-7 空数组在数组编辑器中的显示情况第二章 matlab 基础 计算机仿真与模拟例子 2-37 使用空数组的例子。
在 MATLAB命令行窗口中,键入下面的指令:
>> A (2,2,3) = 1
A(:,:,1) =
0 0
0 0
A(:,:,2) =
0 0
0 0
A(:,:,3) =
0 0
0 1
>> A(:,:,3) = []
第二章 matlab 基础 计算机仿真与模拟
A(:,:,1) =
0 0
0 0
A(:,:,2) =
0 0
0 0
>> B = reshape(1:24,4,6)
B =
1 5 9 13 17 21
2 6 10 14 18 22
3 7 11 15 19 23
4 8 12 16 20 24
>> B(:,[2 3 4]) = []
B =
1 17 21
2 18 22
3 19 23
4 20 24
第二章 matlab 基础 计算机仿真与模拟
2.2.3 逻辑类型和关系运算
1 逻辑数据类型所谓逻辑数据类型就是仅具有两个数值的一种数据类型,
其中,一个数 值为 TRUE,另外 一个 数值为 FALSE 。 在
MATLAB中,参与逻辑运算或者关系运算的并不一定必须有逻辑类型的数据,任何数值都可以参与逻辑运算 。 这时,
MATLAB将所有非零值看作逻辑真,将零值看作逻辑假 。 一般地,1表示逻辑真,0表示逻辑假 。
和一般的数值类型类似,逻辑类型的数据只能通过数值类型转换,或者使用特殊的函数生成相应类型的数组或者矩阵。
第二章 matlab 基础 计算机仿真与模拟表 2-14 创建逻辑类型数据的函数函 数 说 明
logical 将任意类型的数组转变成为逻辑类型数组,其中,非零元素为真,零元素为假
T rue 产生逻辑真值数组
F alse 产生逻辑假值数组第二章 matlab 基础 计算机仿真与模拟例子 2-38 创建逻辑类型数组。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = eye(3);
>> B = logical(A)
B =
1 0 0
0 1 0
0 0 1
>> C = true(size(A))
C =
1 1 1
1 1 1
1 1 1
第二章 matlab 基础 计算机仿真与模拟
>> D = false([size(A),2])
D(:,:,1) =
0 0 0
0 0 0
0 0 0
D(:,:,2) =
0 0 0
0 0 0
0 0 0
第二章 matlab 基础 计算机仿真与模拟
>> whos
Name Size Bytes Class
A 3x3 72 double array
B 3x3 9 logical array
C 3x3 9 logical array
D 3x3x2 18 logical array
Grand total is 45 elements using 108 bytes
第二章 matlab 基础 计算机仿真与模拟使用 logical函数,true函数和 false函数的过程都比较简单,
通过最后的比较可以看出,逻辑类型的数组每一个元素仅占用一个字节的内存空间,所以矩阵 B尽管和矩阵 A看上去一致,但是内存占用上有相当大的差距,并且属于不同的数据类型,也就有不同的操作函数和方法 。
第二章 matlab 基础 计算机仿真与模拟逻辑类型的数组元素仅能有两个取值,1或者 0,分别表示逻辑真和逻辑假 。
另外,在 MATLAB中还有若干函数以 is开头,这类函数是用来完成某种判断功能的函数,例如函数 isnan判断输入参数是否为 NaN,而 isnumeric函数判断输入参数是否为某种数值类型,
见例子 2-39。
第二章 matlab 基础 计算机仿真与模拟例子 2-39 isnumeric函数的使用示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> a =true
a =
1
>> isnumeric(a)
ans =
0
>> b = 1;
>> isnumeric(b)
ans =
1
第二章 matlab 基础 计算机仿真与模拟注意:
在使用 true或者 false函数创建逻辑类型数组时,若不指明参数,则创建一个逻辑类型的标量 。
此外,能够产生逻辑数据类型结果的运算还有关系运算,
关系运算将在后面详细讨论 。
第二章 matlab 基础 计算机仿真与模拟
2 逻辑运算表 2-15 MATLAB的逻辑运算运 算 符 说 明
&& 具有短路作用的逻辑与操作,仅能处理标量
|| 具有短路作用的逻辑或操作,仅能处理标量
& 元素与操作
| 元素或操作
~ 逻辑非操作
xor 逻辑异或操作
any 当向量中的元素有非零元素时,返回真
all 当向量中的元素都是非零元素时,返回真第二章 matlab 基础 计算机仿真与模拟说明:
参与逻辑运算的操作数不一定必须是逻辑类型的变量或常数,也可以使用其他类型的数据进行逻辑运算,但是运算的结果一定是逻辑类型的数据 。
所谓具有短路作用是指,在进行 &&或 ||运算时,若参与运算的变量有多个,例如 a && b && c && d,若 a,b,c,d四个变量中 a为假,则后面的三个都不再被处理,运算结束,并返回运算结果逻辑假。
第二章 matlab 基础 计算机仿真与模拟例子 2-40 逻辑运算示例 。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = eye(3);
>> b = a;b(3,1) =1;
>> a && b
Operands to the || and && operators must be convertible to
logical scalar values.
>> a & b
第二章 matlab 基础 计算机仿真与模拟
ans =
1 0 0
0 1 0
0 0 1
>> whos
Name Size Bytes Class
a 3x3 72 double array
ans 3x3 9 logical array
b 3x3 72 double array
Grand total is 27 elements using 153 bytes
第二章 matlab 基础 计算机仿真与模拟例子 2-40中,首先参与逻辑运算的是两个双精度类型的矩阵,这两个矩阵进行 &&运算时,MATLAB报告了相应的错误,
因为参与 &&或者 ||运算的操作数必须为标量。另外,从例子也能够看出,尽管参与运算的是两个双精度类型的矩阵,运算的结果却是逻辑类型的矩阵。
第二章 matlab 基础 计算机仿真与模拟例子 2-41 函数 all和 any使用示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = [1 0 1;1 0 0 ;1 1 0;1 1 1]
a =
1 0 1
1 0 0
1 1 0
1 1 1
>> all(a)
ans =
1 0 0
>> any(a)
ans =
1 1 1
第二章 matlab 基础 计算机仿真与模拟
3 关系运算关系运算是用来判断两个操作数关系的运算,MATLAB中的关系运算和 C语言的关系运算基本一致,主要有六种,见表
2-16。
表 2-16 MATLAB中的关系运算符 运算符 说明 运算符 说明
= = 等于 > 大于
~= 不等于 <= 小于等于
< 小于 >= 大于等于第二章 matlab 基础 计算机仿真与模拟参与关系运算的操作数可以使用各种数据类型的变量或者常数,运算的结果是逻辑类型的数据。标量也可以和矩阵或者数组进行比较,比较的时候将自动扩展标量,返回的结果是和数组同维的逻辑类型数组。如果进行比较的是两个数组,则数组必须是同维的,且每一维的尺寸也必须一致。
第二章 matlab 基础 计算机仿真与模拟例子 2-42 关系运算示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = reshape(1:9,3,3);
>> B = magic(3);
>> A > B
ans =
0 1 1
0 0 1
0 0 1
>> A = = B
ans =
0 0 0
0 1 0
0 0 0
第二章 matlab 基础 计算机仿真与模拟例子 2-43 复杂的关系运算。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = reshape(-4:4,3,3)
A =
-4 -1 2
-3 0 3
-2 1 4
>> B = ~(A>=0)
B =
1 1 0
1 0 0
1 0 0
第二章 matlab 基础 计算机仿真与模拟
>> C = (A>0)&(A<3)
C =
0 0 1
0 0 0
0 1 0
在例子 2-43中,使用逻辑运算和关系运算从矩阵 A中分别标识出不大于 0的数据和大于 0且小于 3的数据索引位置 。
将逻辑类型的数据应用于索引就构成了逻辑索引,利用逻辑索引,可以方便地从矩阵或者数组中找到某些符合条件的元素,见例子 2-44。
第二章 matlab 基础 计算机仿真与模拟例子 3-44 逻辑索引示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = [-2 10 NaN 30 0 -11 -Inf 31];
>> pos = A<0
pos =
1 0 0 0 0 1 1 0
>> B = A(pos)
B =
-2 -11 -Inf
>> pos = (A>=0)&(isfinite(A))
pos =
0 1 0 1 1 0 0 1
>> C = A(pos)
C =
10 30 0 31
第二章 matlab 基础 计算机仿真与模拟在例子 2-43中,首先从向量 A中获取了全部小于 0的元素构成向量 B,然后从向量 A中获取了不小于 0且有穷的向量元素 。
可以看出,逻辑索引数组可以非常方便地获取数组中满足条件的元素,这种操作在处理大数组时非常有效 。
第二章 matlab 基础 计算机仿真与模拟
4 运算符的优先级到本小节为止,MATLAB的基本运算符都已经介绍完毕了 。
在 M语言中可以将这些不同的运算符组合起来创建复杂的运算表达式 。 M语言的运算符和普通的高级编程语言类似,也具有相应的计算优先级 。 这里将 M语言的运算以及相应的计算优先级进行了总结:
(1) 括号 ( )。
(2) 数组转置 (.'),数组幂 (.^),复转置 ('),矩阵幂 (^)。
(3) 一元加 (+),一元减 (?),逻辑非 (~)。
(4) 数组乘法 (.*),数组除法 (./),数组左除 (.\),矩阵乘法 (*),
矩阵右除 (/),矩阵左除 (\)。
(5) 加法 (+),减法 (?)。
第二章 matlab 基础 计算机仿真与模拟
(6) 冒号运算符 (:)。
(7) 小于 (<),小于等于 (<=),大于 (>),大于等于 (>=),等于 (= =),不等于 (~=)。
(8) 元素与 (&)。
(9) 元素或 (|)。
(10) 短路逻辑与 (&&)。
(11) 短路逻辑或 (||)。
第二章 matlab 基础 计算机仿真与模拟上面的运算符优先级是由高到低排列的,例如括号运算符的优先级最高,数组转置等次之。如果同一级别的运算符出现在表达式中,则按照运算符在表达式中出现的次序,由左向右排列。在使用 M语言编写程序时,需要灵活使用这些运算符来具体实现不同的算法。
第二章 matlab 基础 计算机仿真与模拟
2.2.4 字 符 串
1 字符串入门例子 3-15 字符串的创建 。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = 127
a =
127
>> class(a)
ans =
double
>> size(a)
ans =
1 1
第二章 matlab 基础 计算机仿真与模拟
>> b = '127'
b =
127
>> class(b)
ans =
char
>> size(b)
ans =
1 3
>> whos
Name Size Bytes Class
a 1x1 8 double array
ans 1x2 16 double array
b 1x3 6 char array
Grand total is 6 elements using 30 bytes
第二章 matlab 基础 计算机仿真与模拟创建字符串时,只要将字符串的内容用单引号包含起来就可以了,若需要在字符串内容中包含单引号,则需要在键入字符串内容时,连续键入两个单引号即可,例如
>> c = 'Isn''t it?'
c =
Isn't it?
另外,使用 char函数可以创建一些无法通过键盘输入的字符,该函数的作用是将输入的整数参数转变成为相应的字符,
一般地转换成为相应的 Unicode字符。同样字符串也可以转变成为相应的双精度数据。关于 char函数的使用将在后续章节中讲述。
第二章 matlab 基础 计算机仿真与模拟
2 基本字符串操作本小节详细介绍字符串的基本操作,结合具体的例子将详细讲解字符串元素索引,字符串的拼接,字符串与数值之间的转换等操作 。
例子 2-46 字符串元素索引 。
字符串实际上也是一种 MATLAB的向量或者数组,所以,
一般利用索引操作数组的方法都可以用来操作字符串。在
MATLAB命令行窗口中,键入下面的指令:
第二章 matlab 基础 计算机仿真与模拟
>> a = 'This is No.2-46 Example!'
a =
This is No.2-46 Example!
>> b = a(1:4)
b =
This
>> c = a(12:15)
c =
2-46
>> d = a(17:end)
d =
Example!
第二章 matlab 基础 计算机仿真与模拟本例子使用了索引获取字符串 a的子串,直观上在字符串中使用索引和在数组或向量中使用索引是没有任何区别的 。
字符串还可以利用,[]”运算符进行拼接,不过拼接字符串时需要注意以下两点:
● 若使用,,,作为不同字符串之间的间隔,则相当于扩展字符串成为更长的字符串向量 。
● 若使用“;”作为不同字符串之间的间隔,则相当于扩展字符串成为二维或者多维的数组,这时,不同行上的字符串必须具有同样的长度,见例子 3-17。
第二章 matlab 基础 计算机仿真与模拟例子 2-47 字符串的拼接。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = 'Hello';
>> b = 'MOTO!';
>> length(a) == length(b)
ans =
1
>> c = [a,' ',b]
c =
Hello MOTO!
>> d = [ a ; b]
第二章 matlab 基础 计算机仿真与模拟
d =
Hello
MOTO!
>> size(c)
ans =
1 11
>> size(d)
ans =
2 5
第二章 matlab 基础 计算机仿真与模拟在例子 2-46中,首先创建了两个长度一致的字符串,然后利用,[]”运算符将两个字符串分别组合成为了向量 c和矩阵 d。
不过在创建矩阵 d时,各个行字符串必须具有相同的长度 。
拼接字符串还可以使用部分函数完成 。
如前文所述,在 MATLAB中使用了 Unicode作为字符集,
所以每一个字符占用了两个字节的存储空间 。 字符串和一般的数值之间也可以进行相应的转换,在例子 2-48中,将使用字符向数值转换的方法察看相应字符的 Unicode数值 。
第二章 matlab 基础 计算机仿真与模拟例子 2-48 字符串和数值的转换。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = 'Hello MOTO!';
>> b = double(a)
b =
Columns 1 through 8
72 101 108 108 111 32 77 79
Columns 9 through 11
84 79 33
>> c = '您好! ';
>> d = double(c)
d =
50426 47811 41889
>> char(d)
ans =
您好!
第二章 matlab 基础 计算机仿真与模拟3 字符串操作函数表 2-17 常用的字符串操作函数函 数 说 明
ch ar 创建字符串,将数值转变成为字符串
dou ble 将字符串转变成 Un ico de 数值
bla nks 创建空白的字符串 ( 由空格组成 )
de bla nk 将字符串尾部的空格删除
isch ar 判断变量是否是字符类型
strca t 水平组合字符串,构成更长的字符向量
strvc at 垂直组合字符串,构成字符串矩阵
strcm p 比较字符串,判断字符串是否一致
strnc m p 比较字符串前 n 个字符,判断是否一致
strcm pi 比较字符串,比较时忽略字符的大小写
s trnc m pi 比较字符串前 n 个字符,比较时忽略字符的大小写
find str 在较长的字符串中查寻较短的字符串出现的索引
strfind 在第一个字符串中查寻第二个字符串出现的索引
strjust 对齐排列字符串
strre p 替换字符串中的子串
strm atc h 查询匹配的字符串
upp er 将字符串的字符都转变成为大写字符
low er 将字符串的字符都转变成为小写字符第二章 matlab 基础 计算机仿真与模拟例子 2-49 组合字符串示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = 'Hello';
>> b = 'MOTO!';
>> c = strcat(a,b)
c =
HelloMOTO!
>> d =strvcat(a,b,c)
d =
Hello
MOTO!
HelloMOTO!
>> whos
第二章 matlab 基础 计算机仿真与模拟
Name Size Bytes Class
a 1x5 10 char array
b 1x5 10 char array
c 1x10 20 char array
d 3x10 60 char array
Grand total is 50 elements using 100 bytes
在例子 2-49中,使用 strcat函数和 strvcat函数进行了字符串的组合。其中,与前一小节介绍的字符串组合不同,strvcat函数允许将不同长度的字符串组合成为字符矩阵,并且将短字符串扩充为与长字符串相同的长度。
第二章 matlab 基础 计算机仿真与模拟例子 2-50 字符串比较函数应用示例。
在 MATLAB命令行窗口中,键入如下的指令:
>> a = 'The first string';
>> b = 'The second string';
>> c = strcmp(a,b)
c =
0
>> d = strncmp(a,b,4)
d =
1
第二章 matlab 基础 计算机仿真与模拟
>> whos
Name Size Bytes Class
a 1x16 32 char array
b 1x17 34 char array
c 1x1 1 logical array
d 1x1 1 logical array
Grand total is 35 elements using 68 bytes
第二章 matlab 基础 计算机仿真与模拟在例子 2-50中,使用两种不同函数进行了字符串比较,
strcmp比较两个字符串的全部字符,所以第一次比较时,系统返回了逻辑假值,而 strncmp只比较指定字符串中的前 n个字符,
所以在第二次比较时,系统返回了逻辑真值 。
另外,使用 isequal函数也可以比较两个或两个以上字符串是否一致。
第二章 matlab 基础 计算机仿真与模拟例子 2-51 findstr函数和 strfind函数使用示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> S1 = 'A friend in need is a friend indeed';
>> S2 = 'friend';
>> a = findstr(S2,S1)
a =
3 23
>> b = strfind(S2,S1)
b =
[]
第二章 matlab 基础 计算机仿真与模拟
>> whos
Name Size Bytes Class
S1 1x35 70 char array
S2 1x6 12 char array
a 1x2 16 double array
b 0x0 0 double array
Grand total is 43 elements using 98 bytes
第二章 matlab 基础 计算机仿真与模拟在例子 2-51中,分别使用 findstr函数和 strfind函数在字符串中查寻子串的索引位置。注意两个函数的区别,findstr函数从长字符串中查寻短字符串的索引位置,而 strfind是在第一个字符串参数中查寻第二个字符串参数的索引。所以,在例子 2-51中两次操作获取了不同的运算结果。
第二章 matlab 基础 计算机仿真与模拟
4 字符串转换函数在 MATLAB中允许不同类型的数据和字符串类型的数据之间进行转换,这种转换需要使用不同的函数完成。另外,
同样的数据,特别是整数数据有很多种表示的格式,例如十进制、二进制或者十六进制。在 C语言中,printf函数通过相应的格式字符串就可以输出不同格式的数据。而在 MATLAB
中,则直接提供了相应的函数完成数制的转换。在表 2-18和表 2-19中,分别列举了这些函数。
第二章 matlab 基础 计算机仿真与模拟表 2-18 数字和字符之间的转换函数函 数 说 明
num2str 将数字转变成为字符串
int2str 将整数转变成为字符串
ma t2st r 将矩阵转变成为可被 eval 函数使用的字符串
str2doubl e 将字符串转变为双精度类型的数据
str2num 将字符串转变为数字
sprint f 格式化输出数据到命令行窗口
ss canf 读取格式化字符串第二章 matlab 基础 计算机仿真与模拟表 2-19 不同数值之间的转换函数函 数 说 明
hex2num 将十六进制整数字符串转变成为双精度数据
hex2dec 将十六进制整数字符串转变成为十进制整数
dec2he x 将十进制整数转变成为十六进制整数字符串
bin2dec 将二进制整数字符串转变成为十进制整数
dec2bin 将十进制整数转变成为二进制整数字符串
base2dec 将指定数制类型的数字字符串转变成为十进制整数
dec2ba se 将十进制整数转变成为指定数制类型的数字字符串第二章 matlab 基础 计算机仿真与模拟例子 2-52 num2str函数和 str2num函数的用法示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> S = ['1 2';'2 3'];
>> A = str2num(S)
A =
1 2
2 3
>> B = str2num('1 + 2i')
B =
1.0000 + 2.0000i
>> C = str2num('1 +2i')
C =
1.0000 0 + 2.0000i
第二章 matlab 基础 计算机仿真与模拟
>> D = num2str(rand(2,2),5)
D =
0.95013 0.60684
0.23114 0.48598
>> whos
Name Size Bytes Class
A 2x2 32 double array
B 1x1 16 double array (complex)
C 1x2 32 double array (complex)
D 2x19 76 char array
S 2x3 12 char array
Grand total is 51 elements using 168 bytes
第二章 matlab 基础 计算机仿真与模拟在使用 str2num函数时需要注意如下几点:
● 被转换的字符串仅能包含数字,小数点,字符,e”或者,d”,数字的正号或者负号,以及复数虚部字符,i”或者
,j”,此外不可以包含其他字符 。
● 使用该字符转换函数时需要注意空格 。 例如在本例子中转换生成变量 B和 C时得到了不同的结果,主要原因是在变量 C中,字符,1”和字符,+2i”之间存在空格,而加号,+”和数字 2之间没有空格,所以转化的结果与生成变量 B时不同,
创建变量 B的时候,在数字 1,加号,+”和数字 2之间都存在空格 。
● 为了避免上述问题,可以使用 str2double函数,但是该函数仅能转换标量,不能转换矩阵或者数组 。
第二章 matlab 基础 计算机仿真与模拟例子 2-53 数制转换函数示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = 255;
>> h = dec2hex(a)
h =
FF
>> b = dec2bin(a)
b =
11111111
>> c = dec2base(a,5)
c =
2010
>> b(end) = '0';
>> bin2dec(b)
第二章 matlab 基础 计算机仿真与模拟
ans =
254
>> whos
Name Size Bytes Class
a 1x1 8 double array
ans 1x1 8 double array
b 1x8 16 char array
c 1x4 8 char array
h 1x2 4 char array
Grand total is 16 elements using 44 bytes
第二章 matlab 基础 计算机仿真与模拟在例子 2-53中,使用了部分数制转换的函数,其中比较特殊的一个是 dec2base函数,它和 base2dec函数类似,这两个函数的输入参数为两个,第二个参数表示相应的数制,比如在例子
2-53中调用的函数,是将十进制数据 a转变成为了五进制数据的字符串 。
注意需要注意各种数制转换函数的输入参数类型和输出参数类型,请仔细阅读 MATLAB的帮助文档和本书中的例子。
第二章 matlab 基础 计算机仿真与模拟
5 格式化输入输出和 C语言一致,MATLAB也能够进行格式化的输入、输出,
这是一种高级编程语言所必备的一种能力。 MATLAB继承了标准 C语言中用于 printf函数的格式化字符,也就是说,用于 C语言的格式化字符串都可以用于 MATLAB的格式化输出函数。在本小节将详细讲述 MATLAB的格式化输入、输出函数的使用方法。表 2-20中总结了可以应用在格式化输出函数的格式化字符。
第二章 matlab 基础 计算机仿真与模拟表 2-20 格式化字符字 符 说 明
%c 显示内容为单一的字符
%d 有符号的整数
%e 科学技术法,使用小写的字符 e
%E 科学技术法,使用大写的字符 E
%f 浮点数据
%g 不定,在 %e 或者 %f 之间选择一种形式
%G 不定,在 %E 或者 %f 之间选择一种形式
%o 八进制表示
%s 字符串
%u 无符号的整数
%x 十六进制表示,使用小写的字符
%X 十六进制表示,使用大写的字符第二章 matlab 基础 计算机仿真与模拟除了这些格式化字符外,MATLAB还支持那些在 C语言中就包含的特殊字符,例如回车符,制表符等,这里就不再赘述 。
在 MATLAB中,主要有两个函数用来进行格式化的输入和输出,这两个函数分别为 sscanf和 sprintf。
sscanf函数用来从字符串中获取数据,它的基本语法结构为
A = sscanf(s,format)
A = sscanf(s,format,size)
在 sscanf函数的参数中,s为包含数据的字符串,format是转换字符串数据的格式化字符串,而 size是需要转换的字符矩阵的大小。函数的使用方法参见下面的例子。
第二章 matlab 基础 计算机仿真与模拟例子 2-54 sscanf函数的例子。
在 MATLAB命令行窗口中,键入下面的指令:
>> S1 = '2.7183 3.1416';
>> S2 = '2.7183e3 3.1416e3';
>> S3 = '0 2 4 8 16 32 64 128';
>> A = sscanf(S1,'%f')
A =
2.7183
3.1416
>> B = sscanf(S2,'%e')
B =
1.0e+003 *
2.7183
3.1416
第二章 matlab 基础 计算机仿真与模拟
>> C = sscanf(S3,'%d')
C =
0
2
4
8
16
32
64
128
>> whos
第二章 matlab 基础 计算机仿真与模拟
Name Size Bytes Class
A 2x1 16 double array
B 2x1 16 double array
C 8x1 64 double array
S1 1x14 28 char array
S2 1x17 34 char array
S3 1x20 40 char array
Grand total is 63 elements using 198 bytes
第二章 matlab 基础 计算机仿真与模拟在使用 sscanf函数进行格式化的输入时,需要注意输入数据格式与格式化字符串之间的匹配,否则得到的结果可能不正确 。
格式化的输出函数是 sprintf函数,该函数的基本语法如下:
s = sprintf(format,A,.........)
其中,format是格式化字符串,A为输出的数据,而 s则是函数格式化得到的输出结果,熟悉 C语言的读者理解 sprintf函数应该没有任何问题。
第二章 matlab 基础 计算机仿真与模拟例子 2-55 sprintf函数的例子。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = 1/eps; B = -eps;
>> C = [ 65,66,67,pi];
>> D = [pi,65,66,67];
>> s1 = sprintf('%+15.5f',A)
s1 =
+4503599627370496.00000
>> s2 = sprintf('%+.5e',B)
s2 =
-2.22045e-016
>> s3 = sprintf('%s %f',C)
s3 =
ABC 3.141593
第二章 matlab 基础 计算机仿真与模拟
>> s4 = sprintf('%s %f %s',D)
s4 =
3.141593e+000 65.000000 BC
>> whos
Name Size Bytes Class
A 1x1 8 double array
B 1x1 8 double array
C 1x4 32 double array
D 1x4 32 double array
s1 1x23 46 char array
s2 1x13 26 char array
s3 1x12 24 char array
s4 1x26 52 char array
Grand total is 84 elements using 228 bytes
第二章 matlab 基础 计算机仿真与模拟从例子 2-54中可以看出,利用格式化字符串输出数据的时候有如下几点需要注意:
● 格式化字符串若包含了,+”,则表示在输出的字符串中包含数据的符号,如输出字符串 s1和 s2时的结果 。
● 对于整数数值进行格式化输出时,可以直接将向量转变成为字符串,例如字符串 s3的输出结果 。
● 如果输出的数据与相应的格式化字符串不匹配,则输出数值最常见的一种形式,如字符串 s4的输出结果。
第二章 matlab 基础 计算机仿真与模拟作为编程语言,必须能够和用户的输入进行交互,所以
MATLAB也提供了相应的函数用来完成获取用户输入数据的功能,这个函数就是 input函数,它的基本用法如下:
A = input(prompt);
A = input(prompt,'s')
其中,prompt为提示用的字符串,若具有第二个参数 s,则输入数据为字符串,否则为双精度数据,参见例子 3-26。
第二章 matlab 基础 计算机仿真与模拟例子 2-56 input函数的例子。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = input('随便输入数字,')
随便输入数字,123↙
A =
123
>> whos
Name Size Bytes Class
A 1x1 8 double array
Grand total is 1 element using 8 bytes
>> A = input('随便输入数字,','s')
第二章 matlab 基础 计算机仿真与模拟随便输入数字,123↙
A =
123
>> whos
Name Size Bytes Class
A 1x3 6 char array
Grand total is 3 elements using 6 bytes
注意比较两次输入得到的变量 A数据类型可以看出,在
input函数中,第二个参数若指定为 s的时候,则输入数据默认为字符串的格式。
第二章 matlab 基础 计算机仿真与模拟
2.2.5 元 胞 数 组
1 元胞数组的创建组成元胞数组的内容可以是任意类型的数据,所以创建元胞数组之前需要创建相应的数据 。 本小节结合具体的实例讲述创建元胞数组的方法和步骤 。
例子 2-57(a) 创建元胞数组 。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = {zeros(2,2,2),'Hello' ; 17.35,1:100}
A =
[2x2x2 double] 'Hello'
第二章 matlab 基础 计算机仿真与模拟
[ 17.3500] [1x100 double]
>> B = [{zeros(2,2,2)},{'Hello'};{17.35},{1:100}]
B =
[2x2x2 double] 'Hello'
[ 17.3500] [1x100 double]
>> C = {1}
C =
[1]
>> C(2,2) = {3}
C =
[1] []
[] [3]
>> isequal(A,B)
第二章 matlab 基础 计算机仿真与模拟
ans =
1
>> whos
Name Size Bytes Class
A 2x2 1122 cell array
B 2x2 1122 cell array
C 2x2 144 cell array
ans 1x1 1 logical array
Grand total is 243 elements using 2389 bytes
第二章 matlab 基础 计算机仿真与模拟创建元胞数组需要使用运算符花括号 ——“{}”,例如在创建数组 A的时候,使用花括号将不同类型和尺寸的数据组合在一起构成了一个元胞数组,在这个数组中有标量、多维数组、向量和字符串。注意创建数组 B时使用了不同的方法,该方法是将数组的每一个元素都使用花括号括起来,然后再用数组创建的符号方括号 ——“[]”将数组的元素括起来,这时创建的数组 B
和前面创建的数组 A完全一致,通过 isequal函数的运行就可以看出。还有一种创建元胞数组的方法,如创建数组 C时所用的方法,MATLAB能够自动扩展数组的尺寸,没有被明确赋值的元素作为空元胞数组存在。
第二章 matlab 基础 计算机仿真与模拟注意:
元胞数组占用的内存空间和元胞数组的内容相关,不同的元胞数组占用的内存空间不尽相同 。 另外,在显示元胞数组内容时,对于内容较多的元胞,显示的内容为元胞的数据类型和尺寸,例如显示数组 A时的三维数组和长度为 100的向量 。 另外仔细察看例子 2-57创建元胞数组的不同方法 。
一般的来说,构成元胞数组的数据类型可以是字符串、双精度数、稀疏矩阵、元胞数组、结构或其他 MATLAB数据类型。
每一个元胞数据也可以为标量、向量、矩阵,N维数组。
第二章 matlab 基础 计算机仿真与模拟例子 2-57(b) 创建元胞数组 。
在 MATLAB中还有一个函数 ——cell可以用来创建元胞数组,
本例子将使用这个函数创建元胞数组 。 在 MATLAB命令行窗口中,键入下面的指令:
>> A = cell(1)
A =
{[ ]}
>> B = cell(3,2)
B =
[ ] [ ]
[ ] [ ]
第二章 matlab 基础 计算机仿真与模拟
[ ] [ ]
>> C = cell(2,2,2)
C(:,:,1) =
[ ] [ ]
[ ] [ ]
C(:,:,2) =
[ ] [ ]
[ ] [ ]
>> whos
Name Size Bytes Class
A 1x1 4 cell array
B 3x2 24 cell array
C 2x2x2 32 cell array
Grand total is 15 elements using 60 bytes
第二章 matlab 基础 计算机仿真与模拟
cell函数的作用是用来创建空元胞数组,该函数可以创建一维,二维或者多维元胞数组,但是创建的数组都为空元胞 。
这里需要注意区别空数组和空元胞之间内存占用的区别,从例子 2-57(b)可以看出,元胞数组的每个空元胞占用四个字节的内存空间 。
注意:
使用 cell函数创建空元胞数组的主要目的是为数组预先分配连续的存储空间,节约内存的占用,提高程序执行的效率。
有关空元胞数组的元胞赋值将在第 2小节中讲述。
第二章 matlab 基础 计算机仿真与模拟
2 元胞数组的基本操作所谓元胞数组的基本操作主要包括对元胞数组元胞和元胞数据的访问、修改,元胞数组的扩展、收缩或者重组。和操作一般的数值数组类似,操作数值数组的函数也可以应用在元胞数组上。本小节将结合具体的示例讲述元胞数组的基本操作。
第二章 matlab 基础 计算机仿真与模拟例子 2-58(a) 元胞数组的访问。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = {zeros(2,2,2),'Hello' ; 17.35,1:10};
>> B = A(1,2)
B =
'Hello'
>> class(B)
ans =
cell
>> whos
Name Size Bytes Class
A 2x2 402 cell array
B 1x1 70 cell array
ans 1x4 8 char array
Grand total is 38 elements using 480 bytes
第二章 matlab 基础 计算机仿真与模拟例子 2-58(b) 元胞元素的访问。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = {zeros(2,2,2),'Hello' ; 17.35,1:10};
>> C = A{1,2}
C =
Hello
>> class C
ans =
char
>> whos
Name Size Bytes Class
A 2x2 402 cell array
C 1x5 10 char array
ans 1x4 8 char array
Grand total is 37 elements using 420 bytes
第二章 matlab 基础 计算机仿真与模拟在例子 2-58(b)中,使用花括号,{}”可以直接获取元胞数组的元胞内容,和例子 2-58(a)比较,变量 B的类型为元胞,但是变量 C的类型为字符串,这就是访问元胞数组的两种操作符 ——“{}”和,()”之间的不同之处。
第二章 matlab 基础 计算机仿真与模拟例子 2-58(c) 元胞元素的访问 。
若需要访问元胞元素内部的成员,则需要将,{}”运算符和
,()”结合起来使用 。 在 MATLAB命令行窗口中,键入下面的指令:
>> A = {zeros(2,2,2),'Hello' ; 17.35,1:10};
>> D = A{1,2}(4)
D =
l
>> E = A{2,2}(5:end)
E =
5 6 7 8 9 10
>> class(E)
ans =
double
第二章 matlab 基础 计算机仿真与模拟
>> F = A{4}([1 3 5])
F =
1 3 5
>> whos
Name Size Bytes Class
A 2x2 402 cell array
D 1x1 2 char array
E 1x6 48 double array
F 1x3 24 double array
ans 1x6 12 char array
Grand total is 44 elements using 488 bytes
第二章 matlab 基础 计算机仿真与模拟将不同的括号 ——花括号,圆括号和方括号结合起来可以访问元胞元素的内部成员 。 特别是在例子 2-58(c)中,创建变量 F
的时候使用了三种括号访问了向量的元素 。
元胞数组的扩充、收缩和重组的方法和数值数组大体相同,
见下面的例子。
例子 2-59(a) 元胞数组的扩充。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = {zeros(2,2,2),'Hello' ; 17.35,1:10};
>> B = cell(2,2);
>> B(:,1) = {char('Hello','Welcome'); 10,-1:5}
B =
[2x7 char ] []
[1x6 double] []
>> C = [ A,B]
第二章 matlab 基础 计算机仿真与模拟
C =
[2x2x2 double] 'Hello' [2x7 char ] [ ]
[ 17.3500] [1x10 double] [1x6 double] [ ]
>> D = [ A,B ; C]
D =
[2x2x2 double] 'Hello' [2x7 char ] [ ]
[ 17.3500] [1x10 double] [1x6 double] [ ]
[2x2x2 double] 'Hello' [2x7 char ] [ ]
[ 17.3500] [1x10 double] [1x6 double] [ ]
>> whos
Name Size Bytes Class
A 2x2 402 cell array
B 2x2 204 cell array
C 2x4 606 cell array
D 4x4 1212 cell array
Grand total is 208 elements using 2424 bytes
第二章 matlab 基础 计算机仿真与模拟例子 2-59(b) 元胞数组的收缩和重组。
接上例,在 MATLAB命令行窗口中,键入下面的指令:
>> D(2,:) = []
D =
[2x2x2 double] 'Hello' [2x7 char ] [ ]
[2x2x2 double] 'Hello' [2x7 char ] [ ]
[ 17.3500] [1x10 double] [1x6 double] [ ]
>> E = reshape(D,2,2,3)
E(:,:,1) =
[2x2x2 double] [17.3500]
[2x2x2 double] 'Hello'
第二章 matlab 基础 计算机仿真与模拟
E(:,:,2) =
'Hello' [2x7 char]
[1x10 double] [2x7 char]
E(:,:,3) =
[1x6 double] [ ]
[ ] [ ]
>> whos
Name Size Bytes Class
A 2x2 402 cell array
B 2x2 204 cell array
C 2x4 606 cell array
D 3x4 892 cell array
E 2x2x3 892 cell array
Grand total is 270 elements using 2996 bytes
第二章 matlab 基础 计算机仿真与模拟
3 元胞数组的操作函数表 2-21 元胞数组的操作函数函 数 说 明
cell 创建空的元胞数组
cellfun 为元胞数组的每个元胞执行指定的函数
celldisp 显示所有元胞的内容
cellplot 利用图形方式显示元胞数组
cell2m at 将元胞数组转变成为普通的矩阵
ma t2cell 将数值矩阵转变成为元胞数组
num2c ell 将数值数组转变成为元胞数组
deal 将输入参数赋值给输出
cell2struct 将元胞数组转变成为结构
struct2cell 将结构转变成为元胞数组
iscell 判断输入是否为元胞数组第二章 matlab 基础 计算机仿真与模拟例子 2-60 cellfun函数示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = {rand(2,2,2),'Hello',pi; 17,1+i,magic(5)}
A =
[2x2x2 double] 'Hello' [ 3.1416]
[ 17] [1.0000+ 1.0000i] [5x5 double]
>> B = cellfun('isreal',A)
B =
1 1 1
1 0 1
第二章 matlab 基础 计算机仿真与模拟
>> C = cellfun('length',A)
C =
2 5 1
1 1 5
>> D = cellfun('isclass',A,'double')
D =
1 0 1
1 1 1
>> whos
Name Size Bytes Class
A 2x3 666 cell array
B 2x3 6 logical array
C 2x3 48 double array
D 2x3 6 logical array
Grand total is 65 elements using 726 bytes
第二章 matlab 基础 计算机仿真与模拟表 2-32 在 cellfun函数中可用的函数函 数 说 明
isempty 若元胞元素为空,则返回逻辑真
isl ogical 若元胞元素为逻辑类型,则返回逻辑真
isreal 若元胞元素为实数,则返回逻辑真
length 元胞元素的长度
ndims 元胞元素的维数
prodofsi ze 元胞元素包含的元素个数第二章 matlab 基础 计算机仿真与模拟此外,cellfun函数还有以下两种用法:
● cellfun('size',C,k)用来获取元胞数组元素第 k维的尺寸。
● cellfun('isclass',C,classname)用来判断元胞数组的数据类型。
第二章 matlab 基础 计算机仿真与模拟例子 2-61 显示元胞数组的内容。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = {rand(2,2,2),'Hello',pi;17,1+i,magic(5)}
A =
[2x2x2 double] 'Hello' [ 3.1416]
[ 17] [1.0000+ 1.0000i] [5x5 double]
>> celldisp(A)
A{1,1} =
(:,:,1) =
0.9355 0.4103
0.9169 0.8936
第二章 matlab 基础 计算机仿真与模拟
(:,:,2) =
0.0579 0.8132
0.3529 0.0099
A{2,1} =
17
A{1,2} =
Hello
A{2,2} =
1.0000 + 1.0000i
A{1,3} =
3.1416
第二章 matlab 基础 计算机仿真与模拟
A{2,3} =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
>> cellplot(A)
cellplot函数的运行结果如图 2-8所示。
第二章 matlab 基础 计算机仿真与模拟图 2-8 cellplot函数的运行结果第二章 matlab 基础 计算机仿真与模拟
2.2.6 结 构和 C语言类似,MATLAB也具有结构类型的数据 。 结构
(struct)是包含一组记录 (records)的数据类型,而记录则存储在相应的字段 (fields)中 。 和元胞数组类似,结构的字段可以是任意一种 MATLAB数据类型的变量或者对象 。 结构类型的变量也可以是一维的,二维的或者多维的数组 。 不过,在访问结构类型数据的元素时,需要使用下标配合字段的形式 。
在 MATLAB中,结构和元胞数组有诸多类似之处,在表 2-
23中进行了比较。
第二章 matlab 基础 计算机仿真与模拟表 2-23 元胞数组和结构数组的异同不同的数组对象内容元胞数组对象 结构数组对象基本元素 元胞 (c e ll) 结构 (str uc t)
基本索引 全下标方式、单下标方式 全下标方式、单下标方式可包含的数据类型 任何数据类型 任何数据类型数据的存储 元胞 (c e ll) 字段 (fi e ld )
访问元素的方法 花括号和索引 圆括号、索引和字段名第二章 matlab 基础 计算机仿真与模拟
1 结构的创建创建结构数组对象可以使用两种方法,一种是直接赋值的方法,另外一种方法是利用 struct函数创建 。 这里结合具体的操作示例讲解创建结构的方法 。
例子 3-32(a) 直接赋值法创建结构 。
在 MATLAB命令行窗口中,键入下面的指令:
>> Student.name = 'Way';
>> Student.age = 26;
>> Student.grade = uint16(1);
>> whos
Name Size Bytes Class
第二章 matlab 基础 计算机仿真与模拟
Student 1x1 388 struct array
Grand total is 8 elements using 388 bytes
>> Student
Student =
name,'Way'
age,26
grade,1
第二章 matlab 基础 计算机仿真与模拟在例子 2-62(a)中,创建了具有一个记录的 Student结构数组,
该数组具有一个元素 (记录 ),结构同时具有三个字段,分别为姓名 (name),年龄 (age)和级别 (grade),这三个字段分别包含了字符串,双精度和无符号整数数据类型 。
创建结构的时候,直接用结构的名称 (如例子 2-62(a)中的
Student),配合操作符,.”和相应字段的名称完成创建,创建是直接给字段赋具体的数值。
第二章 matlab 基础 计算机仿真与模拟例子 2-62(b) 直接赋值法创建结构数组。
接例子 3-32(a),在 MATLAB命令行窗口中,键入下面的指令:
>> Student(3).name = 'Deni';
>> Student(3).grade = 2;
>> whos
Name Size Bytes Class
Student 1x3 540 struct array
Grand total is 19 elements using 540 bytes
>> Student(2)
ans =
name,[ ]
age,[ ]
grade,[ ]
>> Student(3).age
ans =
[ ]
第二章 matlab 基础 计算机仿真与模拟例子 2-63 利用函数 struct创建结构 。
在 MATLAB命令行窗口中,键入下面的指令:
>> Student = struct('name','Way','age',26,'grade',uint16(1))
Student =
name,'Way'
age,26
grade,1
>> whos
Name Size Bytes Class
Student 1x1 388 struct array
Grand total is 8 elements using 388 bytes
第二章 matlab 基础 计算机仿真与模拟
>> Student = struct('name',{'Deni','Sherry'},'age',{22,24},'grade',
{2,3})
Student =
1x2 struct array with fields:
name
age
grade
>> whos
Name Size Bytes Class
Student 1x2 604 struct array
Grand total is 20 elements using 604 bytes
>> Student = struct('name',{},'age',{},'grade',{})
第二章 matlab 基础 计算机仿真与模拟
Student =
0x0 struct array with fields:
name
age
grade
>> whos
Name Size Bytes Class
Student 0x0 192 struct array
Grand total is 0 elements using 192 bytes
>> Student = repmat(struct('name','Way',' age',26,'grade',1),1,3)
Student =
第二章 matlab 基础 计算机仿真与模拟
1x3 struct array with fields:
name
age
grade
>> Student(3)
ans =
name,'Way'
age,26
grade,1
第二章 matlab 基础 计算机仿真与模拟在例子 2-63中讲述了使用 struct函数创建结构的方法 。 struct
函数的基本语法为
struct_name = struct(field1,val1,field2,val2,......)
struct_name = struct(field1,{val1},filed2,{val2},......)
其中,这两种创建结构的方法在例子 2-63中均有体现,而且利用 struct函数还可以创建空结构数组。例子 2-63最后使用了
repmat函数,将结构制作了复本,从而创建了 1× 3结构数组。
第二章 matlab 基础 计算机仿真与模拟
2 结构的基本操作对于结构的基本操作其实是对结构数组元素包含的记录的操作 。 主要有结构记录数据的访问,字段的增加和删除等 。 本小节结合具体的例子讲述有关结构操作的基本方法 。
访问结构数组元素包含的记录的方法非常简单,直接使用结构数组的名称和字段的名称以及操作符,,”完成相应的操作 。
不过,在访问结构数组的元素时可以使用所谓的,动态,字段的形式,其基本语法结构是
struct_name.(expression)
其中,expression是代表字段的表达式,可以是字段名称的字符串。利用动态字段形式访问结构数组元素,便于利用函数完成对结构字段数据的重复操作。
第二章 matlab 基础 计算机仿真与模拟例子 2-64 结构字段数据的访问 。
在 MATLAB命令行窗口中,键入下面的指令:
>> Student = struct('name',{'Deni','Sherry'},'age',{22,24},'grade',{2,3},...
'score',{rand(3)*10,randn(3)*10});
>> %察看结构字段
>> Student
Student =
1x2 struct array with fields:
name
age
grade
score
第二章 matlab 基础 计算机仿真与模拟
>> %访问结构记录的数据
>> Student(2).score
ans =
4.3256 2.8768 11.8916
16.6558?11.4647?0.3763
1.2533 11.9092 3.2729
>> %访问结构记录的一部分数据
>> Student(1).score(1,:)
ans =
9.5013 4.8598 4.5647
>> %访问结构某一字段的所有数据
>> Student.name
第二章 matlab 基础 计算机仿真与模拟
ans =
Deni
ans =
Sherry
>> %使用动态字段形式访问数据
>> Student.('name')
ans =
Deni
ans =
Sherry
第二章 matlab 基础 计算机仿真与模拟在例子 2-64中使用了各种访问结构记录数据的方法,特别是在例子的最后,使用动态字段的形式访问了字段记录的数据 。
利用这种形式可以通过编写函数对结构记录的数据进行统一的运算操作 。
结构是管理数据的一种方式,在使用结构的时候,可以直接通过字段名称来访问数据,参见例子 2-65。
第二章 matlab 基础 计算机仿真与模拟例子 2-65 对结构字段数据进行运算。
接例子 2-64,在 MATLAB命令行窗口中键入下面的指令:
>> mean(Student(1).score)
ans =
5.9604 7.1313 4.3213
>> mean(Student.score)
Error using ==> sum
Dimension argument must be a positive integer scalar.
Error in ==> I:\MATLAB6p5\toolbox\matlab\datafun\mean.m
On line 28 ==> y = sum(x,dim)/size(x,dim);
>> mean([Student.score])
ans =
5.9604 7.1313 4.3213 -6.5761 1.1071 4.9294
第二章 matlab 基础 计算机仿真与模拟
mean函数为 MATLAB内建的数学函数之一,用来求解列向量的平均值 。
在例子 2-65中,首先对结构数组第一个元素的字段 score代表的数据求平均值,其实该操作和使用 MATLAB普通的变量没有什么区别 。 然后后面的操作就专属于结构了 。 注意,最后的操作相当于对结构数组的某一个字段所有的数据进行同一种操作,不过,这个时候需要使用,[]”符号将字段包含起来,否则会出现错误提示 。
如前文所述,MATLAB结构数组的字段可以包含任何一种数据,自然也可以包含结构。当结构的字段记录了结构时,则称其为内嵌 (nest)的结构。创建内嵌结构可以使用直接赋值的方法,同样也可以使用 struct函数完成。
第二章 matlab 基础 计算机仿真与模拟例子 2-66 内嵌的结构。
>> Student = struct('name',{'Deni','Sherry'},'age',{22,24},'grade',{2,3},...
'score',{rand(3)*10,randn(3)*10});
>> Class.number = 1;
>> Class.Student = Student;
>> whos
Name Size Bytes Class
Class 1x1 1188 struct array
Student 1x2 932 struct array
Grand total is 83 elements using 2120 bytes
第二章 matlab 基础 计算机仿真与模拟
>> Class
Class =
number,1
Student,[1x2 struct]
>> %使用 struct函数创建内嵌的结构
>> Class = struct('number',1,'Student',struct('name',{'Way','Deni'}))
Class =
number,1
Student,[1x2 struct]
第二章 matlab 基础 计算机仿真与模拟
3 结构操作函数和其他的各种数据类似,MATLAB也提供了部分函数用于针对结构的操作,在表 2-24中将这些函数进行了总结。
第二章 matlab 基础 计算机仿真与模拟表 2-24 结构操作函数函 数 说 明
struct 创建结构或将其他数据类型转变成结构
fieldnam es 获取结构的字段名称
getfield 获取结构字段的数据
setfield 设置结构字段的数据
rmfield 删除结构的指定字段
isfi eld 判断给定的字符串是否为结构的字段名称
iss truct 判断给定的数据对象是否为结构类型
oderfields 将结构字段排序第二章 matlab 基础 计算机仿真与模拟例子 2-67 结构操作函数的使用示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> S.name = 'Deni';S.ID = 0;
>> S(2,2).name = 'Way';S(2,2).ID = 1;
>> S2 = setfield(S,{2,1},'name','Sherry');
>> S.name
ans =
Deni
ans =
[ ]
ans =
[ ]
ans =
Way
>> S2.name
ans =
Deni
第二章 matlab 基础 计算机仿真与模拟
ans =
Sherry
ans =
[ ]
ans =
Way
>> fieldnames(S)
ans =
'name'
'ID'
>> S3 = orderfields(S)
S3 =
2x2 struct array with fields:
ID
name
第二章 matlab 基础 计算机仿真与模拟在例子 2-67中,主要讲述了 setfield,fieldnames和 orderfields
函数的使用 。 setfield函数是为结构字段进行赋值的函数,对应的可以使用 getfield函数获取结构字段的数值 。 利用 setfiled函数和 struct函数可以有效地创建结构数组 。 fieldnames函数用来获取结构中的字段名称,由字段的名称组成元胞数组,其中元胞就是字段名称字符串 。 orderfileds函数是用来将字段进行排序的,
该函数能够将结构的字段按照字符序号排列 。 例如在例子 2-67
中,orderfileds函数就将字段 ID和 name进行了排序,该函数不会修改结构中包含的内容 。
第二章 matlab 基础 计算机仿真与模拟例子 2-68 结构操作函数的使用示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> S.name = 'Deni';S.ID = 0;
>> S(2).name = 'Way';S(2).ID = 1;
>> C = struct2cell(S)
C(:,:,1) =
'Deni'
[ 0]
C(:,:,2) =
'Way'
[ 1]
>> C = squeeze(C)
C =
'Deni' 'Way'
第二章 matlab 基础 计算机仿真与模拟
[ 0] [ 1]
>> fields = {'Name','ID'};
>> S2 = cell2struct(C',fields,2)
S2 =
2x1 struct array with fields:
Name
ID
>> whos
Name Size Bytes Class
C 2x2 270 cell array
S 1x2 398 struct array
S2 2x1 398 struct array
fields 1x2 132 cell array
Grand total is 47 elements using 1198 bytes
第二章 matlab 基础 计算机仿真与模拟例子 2-68主要演示了 cell2struct函数和 struct2cell函数的使用方法。从表现形式、用途以及保存的数据类型等方面看,结构和元胞非常的类似,因此 MATLAB提供了将这两种数据类型进行相互转换的函数。在将元胞数组转换为结构的时候需要指定结构的字段名称。函数 squeeze是用来删除多维数组中维数为 1
的那一维的函数。
第二章 matlab 基础 计算机仿真与模拟例子 2-69 结构操作函数的使用示例。
>> clear all
>> X = 3;
>> [y1,y2,y3] = deal(X)
y1 =
3
y2 =
3
y3 =
3
>> X = {rand(3),'2',1};
>> [y1,y2,y3] = deal(X{:})
第二章 matlab 基础 计算机仿真与模拟
y1 =
0.8462 0.6721 0.6813
0.5252 0.8381 0.3795
0.2026 0.0196 0.8318
y2 =
2
y3 =
1
>> X,num = rand(3);X.str = '2'; X.ID = 1;
>> X(2).num = rand(3);X(2).str = '3'; X(2).ID = 2;
>> [y1,y2] = deal(X(:).num)
第二章 matlab 基础 计算机仿真与模拟
y1 =
0.5028 0.3046 0.6822
0.7095 0.1897 0.3028
0.4289 0.1934 0.5417
y2 =
0.1509 0.8600 0.4966
0.6979 0.8537 0.8998
0.3784 0.5936 0.8216
第二章 matlab 基础 计算机仿真与模拟例子 2-69主要演示了函数 deal的使用方法。 deal函数的主要作用是进行数据的复制。该函数不仅能够操作一般的数值类型数据,还可以处理结构或者元胞。在例子 2-69中,deal函数处理了标量、元胞和结构。在 deal函数处理标量的时候,函数将标量的数值依次赋值给函数的输出,所以第一次使用 deal函数的时候 y1,y2和 y3都被赋值为数值 3。不过在处理元胞或者结构的时候,该函数执行的效果则不同。它能够将元胞数组中的元胞或者结构中的某个字段的数据依次赋值给相应的输出,
所以利用该函数可以非常方便地将结构或者元胞中的实际数据解析 (分离 )出来,例如在例子 2-69中所完成的操作。
2.1 矩阵与数组
2.2 数据类型第二章 matlab 基础 计算机仿真与模拟
2.1 矩阵和数组
2.1.1 概述
2.1.2 创建向量
2.1.3 创建矩阵
2.1.4 索引
2.1.5 基本运算
2.1.6 稀疏矩阵
2.1.7 多维数组第二章 matlab 基础 计算机仿真与模拟
2.1.1 概 述
1,变量和常量所谓变量,就是指在程序运行过程中需要改变数值的量,
每一个变量都具有一个名字,变量将在内存中占据一定的空间,
以便在程序运行的过程中保存其数值 。 M语言和 C语言类似,对变量的命名有相应的要求:变量必须以字母开头,后面可以是字母,数字或者下划线的组合 。 尽管在编写程序的时候可以使用任意数量的字符表示变量名,但是 MATLAB仅仅识别前面的
N个字符,在不同的操作系统下可以识别的字符个数不尽相同,
可以使用 namelengthmax函数察看相应的定义 。
第二章 matlab 基础 计算机仿真与模拟所谓常量就是在程序运行的过程中不需要改变数值的量,
例如,在求圆周周长或者圆的面积的时候,需要一个常量 π,
它的值近似是 3.1415927,常量也具有相应的名字,其定义方法和变量一样。 M语言中的常量不像 C语言中的常量,一般地在 M语言中并不存在常量的定义,任何常量和变量都可以修改其数值,只不过在 MATLAB中提供了一些常用的常数作为常量。
第二章 matlab 基础 计算机仿真与模拟
2,数组一般的,数组是有序数据的集合,在大多数编程语言中,
数组的每一个成员 (元素 )都属于同一种数据类型,它们使用同一个数组名称和不同的下标来惟一确定数组中的成员 (元素 )。
其中,下标是指数组元素在数组中的序号 。
对于 MATLAB而言,大多数数据类型的数组每一个元素都是同一个数据类型的元素,而对于其特殊的元胞数组则不然 。
和一般的编程语言类似,M语言的数组也有一维,二维和多维数组的区别 。 而在 MATLAB中一般不存在数组的数组,除非在
M语言中使用 Java数据对象 。
第二章 matlab 基础 计算机仿真与模拟
3,向量从编程语言的角度上看,向量其实就是一维数组,然而从数学的角度上看,向量就是 1× N或者 N× 1的矩阵,即行向量或列向量,即
MATLAB的基本运算单位就是矩阵和向量,而 M语言本身就是以向量化运算为基础的编程语言,正因为有如此特点,使用 M
语言成为了目前最流行的算法开发和验证的原型语言 。
n
n
bbbbB
b
b
b
b
B
,13,12,11,1
1,
1,3
1,2
1,1
和
都是一维数组,但是从数学的角度上看,分别被称为列向量和行向量。
第二章 matlab 基础 计算机仿真与模拟
4,矩阵在 MATLAB中,矩阵的概念就是线性代数中定义的矩阵的概念 ——矩阵是用一对圆括号或者方括号括起来,符合一定规则的数学对象 。 例如:
332331
232221
131211
bbb
bbb
bbb
B
就是一个三行三列的方阵。
第二章 matlab 基础 计算机仿真与模拟
2.1.2 创 建 向 量从编程语言的角度上看,向量也就是一维数组 。 在
MATLAB中创建向量可以使用不同的方法,最直接也最简单的方法就是逐个输入向量的元素,见例子 2-1。
例子 2-1 利用逐个输入元素的方法在 MATLAB中创建向量 。
在命令行窗口中键入:
>> x = [1 3 pi 3+5i]
x =
1.0000 3.0000 3.1416 3.0000 + 5.0000i
>> whos
Name Size Bytes Class
x 1x4 64 double array (complex)
Grand total is 4 elements using 64 bytes
第二章 matlab 基础 计算机仿真与模拟例子 2-2 利用冒号运算符创建向量 。
在命令行窗口中键入:
>> x = 1:10
x =
1 2 3 4 5 6 7 8 9 10
>> whos
Name Size Bytes Class
x 1x10 80 double array
Grand total is 10 elements using 80 bytes
第二章 matlab 基础 计算机仿真与模拟在例子 2-2中使用冒号运算符创建了具有 10个元素的向量 。
利用冒号运算符创建向量的基本语法如下:
X = J:INC:K
其中
* J为向量的第一个元素,而 K为向量的最后一个元素,INC
为向量元素递增的步长;
* J,INC和 K之间必须用,,,间隔;
* 若在表达式中忽略 INC(如例子 2-2所示 ),则默认的递增步长为 1;
* INC可以为正数也可以为负数,若 INC为正数,则必须
J<K,若 INC为负数,则必须 J>K,否则创建的为空向量。
第二章 matlab 基础 计算机仿真与模拟例子 2-3 使用冒号运算符创建向量 。
在命令行窗口中键入:
>> x = 1:0.01:1.1
x =
Columns 1 through 6
1.0000 1.0100 1.0200 1.0300 1.0400 1.0500
Columns 7 through 11
1.0600 1.0700 1.0800 1.0900 1.1000
第二章 matlab 基础 计算机仿真与模拟创建向量的第三种方法是使用函数 linspace和 logspace。
linspace是用来创建线性间隔向量的函数,函数 linspace的基本语法为
x = linspace(x1,x2,n)
其中
* x1为向量的第一个元素,x2为向量的最后一个元素,n
为向量具有的元素个数,函数将根据 n的数值平均计算元素之间的间隔,间隔的计算公式为;
* 若在表达式中忽略参数 n,则系统默认地将向量设置为
100个元素 。
函数的具体使用方法参见例子 2-4。
第二章 matlab 基础 计算机仿真与模拟例子 2-4 使用 linspace函数创建向量 。
>> x = linspace(1,2,5)
x =
1.0000 1.2500 1.5000 1.7500 2.0000
在本例子中,使用 linspace函数创建了一个具有五个元素的向量,而元素之间彼此的间隔为 。
另外一个函数 logspace被用来创建对数空间的向量,该函数的基本语法为
25.015 12
x = logspace(x1,x2,n)
第二章 matlab 基础 计算机仿真与模拟其中:
* 该函数创建的向量第一个元素值为 x1,而最后一个元素的数值为 x2,n为向量的元素个数,元素彼此之间的间隔按照对数空间的间隔设置;
* 若在表达式中忽略参数 n,则参数默认地将向量设置为
50个元素 。
该函数的使用参见例子 2-5。
第二章 matlab 基础 计算机仿真与模拟例子 2-5 使用 logspace函数创建向量 。
在 MATLAB的命令行窗口中键入下面的指令:
>> x = logspace(1,3,3)
x =
10 100 1000
上面创建的向量都是行向量,也就是说,创建的都是一行
n列的二维数组 (n表示元素的个数 ),如果需要创建列向量,即
n行一列的二维数组 (n表示元素的个数 ),则需要使用分号作为元素与元素之间的间隔或者直接使用转置运算符,'”,参见例子 2-6。
第二章 matlab 基础 计算机仿真与模拟例子 2-6 创建列向量。
>> %直接输入元素的方法创建列向量
>> A = [1;2;3;4;5;6]
A =
1
2
3
4
5
6
第二章 matlab 基础 计算机仿真与模拟
>> %使用转置的方法创建列向量
>> B = (1:6)'
B =
1
2
3
4
5
6
>> whos
Name Size Bytes Class
A 6x1 48 double array
B 6x1 48 double array
Grand total is 12 elements using 96 bytes
第二章 matlab 基础 计算机仿真与模拟
2.1.3 创 建 矩 阵
1 直接输入法例子 2-7 用直接输入矩阵元素的方法创建矩阵 。
在 MATLAB的命令行窗口中键入下面的指令:
>> A = [1 2 3;4 5 6;7 8 9]
A =
1 2 3
4 5 6
7 8 9
>> whos
Name Size Bytes Class
A 3x3 72 double array
Grand total is 9 elements using 72 bytes
第二章 matlab 基础 计算机仿真与模拟在上面的例子中创建了一个 3× 3的矩阵,在创建矩阵的时候,需要注意:
* 整个矩阵的元素必须在,[]”中键入;
* 矩阵的元素行与行之间需要使用分号,;,间隔,也可以在需要分行的地方用回车键间隔;
* 矩阵的元素之间可以使用逗号,,,或者空格间隔 。
其实创建上面的矩阵时还可以这么做
>> B = [1:3;4:6;7:9]
B =
1 2 3
4 5 6
7 8 9
第二章 matlab 基础 计算机仿真与模拟
2 数组编辑器前面的例子中使用 whos指令来察看当前 MATLAB会话保存在工作空间内存中的各种变量,此外,还可以使用工作空间浏览器察看工作空间中包含的各种变量,图 2-1所示为执行了例子 2-7之后的工作空间浏览器 。
在工作空间浏览器中可以察看当前工作空间中保存的各种数据的信息,利用工作空间浏览器,在相应的变量上单击鼠标右键,通过弹出的快捷菜单 (如图 2-2所示 )可以对矩阵或者向量进行编辑,也可以删除,重命名工作空间的变量,还能够完成数据可视化的工作 。
第二章 matlab 基础 计算机仿真与模拟图 2-1 MATLAB的工作空间浏览器第二章 matlab 基础 计算机仿真与模拟对矩阵或者向量元素的编辑可以通过数组编辑器来完成,
调用数组编辑器有以下几种不同的方法:
第一种,首先选择工作空间浏览器中的变量,然后单击工作空间浏览器工具栏中的按钮,这时系统将运行数组编辑器,同时在编辑器中加载变量 。 在用鼠标选择工作空间中的变量时,可以按住 Ctrl键或者 Shift键选择多个变量,同样也可以使用快捷键 Ctrl+A选择工作空间中的所有变量 。
第二种方法是在工作空间浏览器中直接双击变量,也可以运行数组编辑器,同时在编辑器中加载变量。
第二章 matlab 基础 计算机仿真与模拟第三种方法就是通过工作空间浏览器中的快捷菜单命令
Open来完成同样的工作 。
第四种方法是直接在 MATLAB命令行窗口中键入如下指令:
>> openvar A
也可以在数组编辑器中打开变量 A。打开矩阵 A的数组编辑器界面如图 2-3所示。
第二章 matlab 基础 计算机仿真与模拟图 2-3 在数组编辑器中编辑矩阵第二章 matlab 基础 计算机仿真与模拟前文提及,在命令行窗口中直接输入元素较多的向量或者矩阵时比较麻烦,所以,可以利用数组编辑器完成大矩阵的编辑,具体方法如下:
首先在命令行窗口中创建一个新的变量,A。
通过鼠标选择想要创建的矩阵的最后一格,如要创建 A
( 3?3) 的矩阵,则选择第 3行第 3列,然后输入一个数值 。
Matlab会自动地将前面的所有元素填充 0。 如图 2-4所示 。
第二章 matlab 基础 计算机仿真与模拟图 2-4 利用数组编辑器定义矩阵第二章 matlab 基础 计算机仿真与模拟在数组编辑器中可以使用多种格式来显示数组中的数据,
在图 2-5中演示了利用 bank格式显示数据的效果。
图 2-5 以 bank格式显示数据第二章 matlab 基础 计算机仿真与模拟
2.1.4 索 引
1 向量元素的访问访问向量的元素只要使用相应元素的索引即可,请参阅下面的例子 2-8。 在例子 2-8中操作对象是一个向量,该向量为 A =
[1 2 3 4 5 6 7 8 9 0]。
例子 2-8 访问向量中的元素 。
在 MATLAB的命令行窗口中键入下面的指令:
>> %访问向量的第三个元素
>> A(3)
ans =
3
第二章 matlab 基础 计算机仿真与模拟
>> %访问向量的第一、三、七个元素
>> A([1 3 7])
ans =
1 3 7
>> %访问向量的第一、三、五个元素
>> A([1:3:5])
ans =
1 3 5
>> %访问向量的最后四个元素
>> A([end-3:end])
ans =
7 8 9 0
>> %重复访问向量中的元素
>> A([1:5,5,-1:1])
ans =
1 2 3 4 5 5 4 3 2 1
第二章 matlab 基础 计算机仿真与模拟说明:
* 访问向量元素的结果是创建新的向量 。
* 访问向量的元素直接给出元素在向量中的序号,元素的序号不仅可以是单一的整数,还可以是元素序号组成的向量,
如例子 2-8中的各种操作 。
* 关键字 end在访问向量元素时,表示向量中最后一个元素的序号 。
* 访问向量元素时,序号的数值必须介于数值 1~ end之间 。
可以通过访问元素的方法,对具体的元素赋值,参见例子
2-9。
第二章 matlab 基础 计算机仿真与模拟例子 2-9 对向量的元素进行赋值 。
在 MATLAB命令行窗口中键入下面的指令:
>> %对向量的第三个元素赋值
>> A(3) = -3
A =
1 2 -3 4 5 6 7 8 9 0
>> %对向量中不存在的数据赋值
>> A(15) = -15
A =
Columns 1 through 10
1 2 -3 4 5 6 7 8 9 0
Columns 11 through 15
0 0 0 0 -15
第二章 matlab 基础 计算机仿真与模拟说明:
在例子 2-9中,对向量的第 15个元素赋值,在赋值之前向量的第 11~15个元素不存在,但是在赋值之后,将自动创建这些元素,并且为没有明确赋值的元素赋默认值 0,这就是 MATLAB的数据自动扩充和初始化机制。
第二章 matlab 基础 计算机仿真与模拟
2 矩阵元素的访问访问矩阵的元素也需要使用矩阵元素的索引,不过具有两种方式,第一种方式是使用矩阵元素的行列全下标形式,第二种方法是使用矩阵元素的单下标形式,参阅例子 2-10。
例子 2-10 访问矩阵的元素 。
MATLAB工作空间中具有一个 5× 5的矩阵,该矩阵是五阶的幻方,通过命令行获取矩阵的第二行、第四列的元素,于是在 MATLAB命令行窗口中键入下面的指令:
第二章 matlab 基础 计算机仿真与模拟
>> %创建矩阵
>> A = magic(5)
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
>> %使用全下标的形式访问元素
>> A(2,4)
ans =
14
>> %使用单下标的形式访问元素
>> A(17)
ans =
14
第二章 matlab 基础 计算机仿真与模拟说明:
* 使用了 MATLAB函数 magic创建幻方 。 所谓幻方,就是 n
阶的方阵,该方阵的行元素和列元素的和都相等 。
* 使用全下标的形式访问矩阵元素的方法简单,直接,同线性代数的矩阵元素的概念一一对应 。
* 矩阵元素的单下标是矩阵元素在内存中存储的序列号,
一般地,同一个矩阵的元素存储在连续的内存单元中 。
* 矩阵元素的单下标与全下标之间的转换关系如下,以的矩阵为例,该矩阵的第 i行第 j列的元素全下标表示为单下标 l=(j-
1)× m+i。
第二章 matlab 基础 计算机仿真与模拟注意:
MATLAB的矩阵元素的排列以列元素优先,这一点同
FORTRAN语言的二维数组元素的排列方法一致,与 C语言的二维数组元素的排列不同,C语言的二维数组元素排列以行元素优先 。
为了方便全下标和单下标之间的转换,MATLAB提供了两个函数分别完成两者之间的相互转化:
* sub2ind:根据全下标计算单下标 。
* ind2sub:根据单下标计算全下标。
第二章 matlab 基础 计算机仿真与模拟表 2-1 使用索引访问矩阵元素的方法矩阵元素的访问 说 明
A (i,j) 访问矩阵 A 的第 i 行第 j 列上的元素,其中 i 和 j 为标量
A (I,J) 访问由向量 I 和 J 指定的矩阵 A 中的元素
A( i,,) 访问矩阵 A 中第 i 行的所有元素
A (:,j) 访问矩阵 A 中第 j 列的所有元素
A (:) 访问矩阵 A 的所有元素,将矩阵看作一个向量
A (l) 使用单下标的方式访问矩阵元素,其中 l 为标量
A (L )
访问由向量 L 指定的矩阵 A 的元素,向量 L 中的元素为矩阵元素的单下标数值第二章 matlab 基础 计算机仿真与模拟例子 2-11 用不同的方法访问矩阵的元素。
在 MATLAB命令行中键入下面的指令:
>> % 创建矩阵
>> A = 1:25;
>> A = reshape(A,5,5)
A =
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
第二章 matlab 基础 计算机仿真与模拟
>> %访问矩阵的第三行第一列元素
>> A(3,1)或 A(3)
ans =
3
>> % 访问矩阵第三行的所有元素
>> A(3,:)
ans =
3 8 13 18 23
>> %访问矩阵第四列的所有元素
>> A(:,4)
ans =
16
17
18
19
20
第二章 matlab 基础 计算机仿真与模拟
>> %访问矩阵的最后一行元素
>> A(end,:)
ans =
5 10 15 20 25
>> %获取矩阵的子矩阵
>> I = [1 3 5];J = [2 4];
>> A(I,J)
ans =
6 16
8 18
10 20
第二章 matlab 基础 计算机仿真与模拟
2.1.5 基 本 运 算
1 矩阵生成函数表 2-2 MATLAB的矩阵生成函数函 数 说 明
ze ros 产生元素全为 0 的矩阵
one s 产生元素全为 1 的矩阵
ey e 产生单位矩阵
ra nd 产生均匀分布的随机数矩阵,数值范围 (0,1)
ra ndn 产生均值为 0,方差为 1 的正态分布随机数矩阵
dia g 获取矩阵的对角线元素,也可生成对角矩阵
tril 产生下三角矩阵
triu 产生上三角矩阵
pa sca l 产生帕斯卡矩阵
m ag ic 产生幻方阵第二章 matlab 基础 计算机仿真与模拟例子 2-12 矩阵生成函数的示例。
在 MATLAB命令行中键入下面的指令:
>> %创建三阶帕斯卡矩阵
>> A = pascal(3)
A =
1 1 1
1 2 3
1 3 6
>> %从矩阵 A生成下三角矩阵
>> tril(A)
ans =
1 0 0
1 2 0
1 3 6
第二章 matlab 基础 计算机仿真与模拟
>> %获取矩阵 A的对角线元素
>> diag(A)
ans =
1
2
6
>> %利用向量生成对角矩阵
>> diag(ans)
ans =
1 0 0
0 2 0
0 0 6
第二章 matlab 基础 计算机仿真与模拟
2 基本矩阵运算针对矩阵的运算 MATLAB提供了若干函数和基本的运算规则,这些规则和函数都分别和线性代数的基本概念和运算规则对应。矩阵的基本运算参见表 2-3。
第二章 matlab 基础 计算机仿真与模拟表 2-3 矩阵的基本运算第二章 matlab 基础 计算机仿真与模拟提示:
在 MATLAB中,获取矩阵 (线性代数 )的运算函数列表请在
MATLAB命令行窗口中键入如下命令:
>> help matfun
在 MATLAB命令行窗口中将显示相应的函数列表:
Matrix functions - numerical linear algebra.
Matrix analysis.
norm - Matrix or vector norm.
normest - Estimate the matrix 2-norm.
一般的 MATLAB函数都可以针对矩阵进行运算,但是在前面的 help命令行中显示的函数是专门针对矩阵和线性代数运算的函数 。
…
第二章 matlab 基础 计算机仿真与模拟例子 2-13 矩阵的基本运算示例 ——求解方程组。
443
63
22
321
321
321
xxx
xxx
xxx
这类问题可以直接通过矩阵运算解决 。 在 MATLAB命令行窗口中键入下面的指令:
>> %创建线性方程组的系数矩阵和向量
>> A = [-1 1 2; 3 -1 1; -1 3 4];
>> b = [2;6;4];
>> %求解方程,使用矩阵求逆的方法
>> x = inv(A)*b
第二章 matlab 基础 计算机仿真与模拟
x =
1.0000
-1.0000
2.0000
>> %求解方程,使用矩阵左除运算
>> x = A\b
x =
1.0000
-1.0000
2.0000
第二章 matlab 基础 计算机仿真与模拟从例子 2-13可以看出以矩阵为基本运算单位进行数值运算的优势 。 对于 MATLAB,矩阵的基本运算都可以用一种最简单,
直观的表达式完成,像这种利用向量或者矩阵的运算,不仅可以简化代码,还能够提高 MATLAB的 M语言的运行速度 。
矩阵的运算同时也包含了矩阵和标量之间的运算,
MATLAB在处理这种运算的时候,首先对标量进行扩充,例如:
>> w=[1 2;3 4] + 5
w =
6 7
8 9
第二章 matlab 基础 计算机仿真与模拟该指令行实际的执行过程如下:
w=[1 2;3 4] + 5
5 5
5 5
4 3
2 1
5
4 3
2 1
9 8
7 6
第二章 matlab 基础 计算机仿真与模拟
2.5.3 基本数组运算在 MATLAB中,除了基本的线性代数运算以外,大多数的矩阵运算都适用于数组运算,但是有部分运算不同,本小节将介绍其中的基本运算指令和方法 。
1,数组转置数组转置的操作符是在矩阵转置操作符前加符号,,”,见例子 2-14。
例子 2-14 数组转置操作 。
在 MATLAB命令行窗口中,键入下面的指令:
>> %创建矩阵
>> A = ones(2,3); A(:)=1:6
第二章 matlab 基础 计算机仿真与模拟
A =
1 3 5
2 4 6
>> %矩阵转置
>> A'.
ans =
1 2
3 4
5 6
>> %数组转置
>> A'.
第二章 matlab 基础 计算机仿真与模拟
ans =
1 2
3 4
5 6
>> %复数运算,矩阵 A成为复数矩阵
>> A = A*I
A =
0 + 1.0000i 0 + 3.0000i 0 + 5.0000i
0 + 2.0000i 0 + 4.0000i 0 + 6.0000i
第二章 matlab 基础 计算机仿真与模拟
>> %矩阵转置
>> A'
ans =
0 - 1.0000i 0 - 2.0000i
0 - 3.0000i 0 - 4.0000i
0 - 5.0000i 0 - 6.0000i
>> %数组转置
>> A.'
ans =
0 + 1.0000i 0 + 2.0000i
0 + 3.0000i 0 + 4.0000i
0 + 5.0000i 0 + 6.0000i
第二章 matlab 基础 计算机仿真与模拟从例子 2-14可以看出,对于实数矩阵,矩阵转置和数组转置的计算结果是一致的,但是对于复数矩阵,数组转置和矩阵转置的计算结果就不一致。所以,对于数组转置运算也被称为非共轭转置,矩阵转置运算则被称为共轭转置。
第二章 matlab 基础 计算机仿真与模拟
2,数组幂数组幂运算符就是在矩阵幂运算符前加上符号,,”,见例子 2-15。
例子 2-15 数组幂运算 。
在 MATLAB命令行中,键入下面的指令:
>> %本例子中使用的矩阵
>> A
A =
0 + 1.0000i 0 + 3.0000i 0 + 5.0000i
0 + 2.0000i 0 + 4.0000i 0 + 6.0000i
第二章 matlab 基础 计算机仿真与模拟
>> %矩阵幂运算
>> A^3
Error using ==> ^
Matrix must be square.
>> %数组幂运算
>> A.^3
ans =
1.0e+002 *
0 - 0.0100i 0 - 0.2700i 0 - 1.2500i
0 - 0.0800i 0 - 0.6400i 0 - 2.1600i
第二章 matlab 基础 计算机仿真与模拟
3,数组乘法和前面两种运算类似,数组乘法运算符是在矩阵乘法运算符前加上符号,,”,见例子 2-16。
例子 2-16 数组乘法示例 。
在 MATLAB命令行中,键入下面的指令:
>> %本例子中使用的矩阵
>> A
A =
0 + 1.0000i 0 + 3.0000i 0 + 5.0000i
0 + 2.0000i 0 + 4.0000i 0 + 6.0000i
第二章 matlab 基础 计算机仿真与模拟
>> %矩阵乘法
>> A*5
ans =
0 + 5.0000i 0 +15.0000i 0 +25.0000i
0 +10.0000i 0 +20.0000i 0 +30.0000i
>> %数组乘法
>> A.*5
ans =
0 + 5.0000i 0 +15.0000i 0 +25.0000i
0 +10.0000i 0 +20.0000i 0 +30.0000i
第二章 matlab 基础 计算机仿真与模拟
>> %矩阵乘法
>> A*A'
ans =
35 44
44 56
>> %数组乘法
>> A.*A
ans =
-1 -9 -25
-4 -16 -36
第二章 matlab 基础 计算机仿真与模拟
4 基本数学函数在 MATLAB中有部分函数可以用来进行基本的数学运算,
主要有如下类别:三角函数 (见表 2-4)、指数运算函数 (见表 2-5)、
复数运算函数 (见表 2-6)、圆整和求余函数 (见表 2-7)。需要注意的是这些函数的参数可以是矩阵也可以是向量或者多维数组,
函数在处理参数时,都是按照数组运算的规则来进行的,也就是说对于 的矩阵,函数 f(● )的运算针对的是 。
nm?
nmijaA ][
ija
第二章 matlab 基础 计算机仿真与模拟表 2-4 三 角 函 数函 数 说 明 函 数 说 明 函 数 说 明
sin 正弦函数 ta nh 双曲正切函数 c sc h 双曲余割函数
sin h 双曲正弦函数 a ta n 反正切函数 a c sc 反余割函数
a sin 反正弦函数 a ta n2 四象限反正切函数 a c sc h 反双曲余割函数
a sin h 反双曲正弦函数 a ta nh 反双曲正切函数 cot 余切函数
cos 余弦函数 se c 正割函数 c ot h 双曲余切函数
c os h 双曲余弦函数 se c h 双曲正割函数 acot 反余切函数
acos 反余弦函数 as ec 反正割函数 a c ot h 反双曲余切函数
a c os h 反双曲余弦函数 a se c h 双曲反正割函数
ta n 正切函数 c sc 余割函数第二章 matlab 基础 计算机仿真与模拟表 2-5 指数运算函数函 数 说 明 函 数 说 明
exp 指数函数 r e a lp o w 实数幂运算函数
lo g 自然对数函数 r e a ll o g 实数自然对数函数
lo g 1 0 常用对数函数 r e a ls q r t 实数平方根函数
lo g 2 以 2 为底的对数函数 sq r t 平方根函数
p o w 2 2 的幂函数 n e x tp o w 2 求大于输入参数的第一个 2 的幂第二章 matlab 基础 计算机仿真与模拟说明:
以 real开头的函数仅能处理实数,如输入的参数为复数,
则 MATLAB会报错 。
函数 nextpow2是用来计算仅仅比输入参数大的第一个 2的幂,例如输入参数为 N,则函数的计算结果整数 P需要满足的条件为 2P≥abs(N)≥2P-1。
第二章 matlab 基础 计算机仿真与模拟表 2-6 复 数 运 算函 数 说 明 函 数 说 明
abs 求复数的模,若参数为实数则求绝对值 r e a l 求复数的实部
a n g le 求复数的相角 u n w r a p 相位角按照 360 °线调整
c o m p le x 构造复数 is r e a l 判断输入参数是否为实数
conj 求复数的共轭复数 c p lx p a ir 复数阵成共轭对形式排列
im a g e 求复数的虚部第二章 matlab 基础 计算机仿真与模拟表 2-7 圆整和求余函数函 数 说 明 函 数 说 明
fix 向 0 取整的函数 m od 求模函数
flo or 向
取整的函数 re m 求余数
c e il 向
取整的函数 sig n 符号函数
ro un d 向最近的整数取整的函数第二章 matlab 基础 计算机仿真与模拟例子 2-17 MATLAB的圆整和求余函数。
在 MATLAB的命令行中,键入下面的指令:
>> fix(-1.9)
ans =
-1
>> floor(-1.9)
ans =
-2
>> round(-1.9)
ans =
-2
>> ceil(-1.9)
ans =
-1
第二章 matlab 基础 计算机仿真与模拟上面比较了四种圆整函数处理同一个数据的结果,在使用不同的取整函数时要注意各个函数的特点 。 其实这四种圆整函数之间的区别主要是进行圆整运算时,趋近的方向不尽相同 。
例如 fix函数是将数据向 0的方向趋近,而 floor函数是向无穷大的方向上趋近 。
>> mod(9,-2)
ans =
-1
>> rem(9,-2)
ans =
1
第二章 matlab 基础 计算机仿真与模拟
5 矩阵 (数组 )操作函数在前面的小节中主要介绍了进行数学运算的 MATLAB函数,
在 MATLAB中还存在一类函数用来获取矩阵或者数组的信息,
以及对数组进行操作,在表 2-8中列举了较常用的函数。完整的函数列表内容可以在 MATLAB命令行中键入 help elmat指令来察看。
第二章 matlab 基础 计算机仿真与模拟表 2-8 用于矩阵 (数组 )操作的常用函数函 数 说 明
size 获取矩阵的行、列数,对于多维数组,获取数组的各个维的尺寸
len gth 获取向量长度,若输入参数为矩阵或多维数组,则返回各个维尺寸的最大值
ndim s 获取矩阵或者多维数组的维数
num el 获取矩阵或者数组的元素个数
disp 显示矩阵或者字符串内容 ( 有关字符串的内容将在第三章中讲述 )
cat 合并不同的矩阵或者数组
re sha pe 保持矩阵元素的个数不变,修改矩阵的行数和列数
re pm at 复制矩阵元素并扩展矩阵
fliplr 交换矩阵左右对称位置上的 元素
flipud 交换矩阵上下对称位置上的元素
flipdim 按照指定的方向翻转交换矩阵元素
find 获取矩阵或者数组中非零元素的索引第二章 matlab 基础 计算机仿真与模拟例子 2-18 reshape函数的使用示例 。
在前面的例子 2-11中曾经使用过 reshape函数,这里将详细讨论该函数的使用方法,在 MATLAB命令行中,键入下面的指令:
>> A = 1:8
A =
1 2 3 4 5 6 7 8
>> B = reshape(A,2,4)
第二章 matlab 基础 计算机仿真与模拟
B =
1 3 5 7
2 4 6 8
>> C = reshape(B,3,3)
Error using ==> reshape
To RESHAPE the number of elements must not change,
第二章 matlab 基础 计算机仿真与模拟例子 2-19 对称交换函数的使用示例。
在 MATLAB命令行中,键入下面的指令:
>> A = reshape(1:9,3,3)
A =
1 4 7
2 5 8
3 6 9
>> fliplr(A)
ans =
7 4 1
8 5 2
9 6 3
第二章 matlab 基础 计算机仿真与模拟
>> flipud(A)
ans =
3 6 9
2 5 8
1 4 7
>> flipdim(A,1)
ans =
3 6 9
2 5 8
1 4 7
>> flipdim(A,2)
ans =
7 4 1
8 5 2
9 6 3
第二章 matlab 基础 计算机仿真与模拟在生成比较复杂的矩阵时,可以使用 MATLAB提供的矩阵扩展方法完成相应矩阵的构造。假设矩阵 A为三阶方阵,B
为二阶方阵,由矩阵 A和 B组合构成五阶方阵,其中 O为相应的零矩阵,具体的创建方法见例子 2-20。
BO
OA
C
第二章 matlab 基础 计算机仿真与模拟例子 2-20 创建复杂矩阵。
在 MATLAB命令行中,键入下面的指令:
>> A = reshape(1:9,3,3);
>> B = [1 2 ; 3 4];
>> O = zeros(length(A),length(B))
O =
0 0
0 0
0 0
>> C = [ A O; O' B]
C =
1 4 7 0 0
2 5 8 0 0
3 6 9 0 0
0 0 0 1 2
0 0 0 3 4
第二章 matlab 基础 计算机仿真与模拟例子 2-21 使用方括号创建复杂矩阵。
在 MATLAB命令行中,键入下面的指令:
>> A = [1 2 ; 3 4];
>> B = [ A,A*2 ; tril(A),triu(A) ; A*3,A*4]
B =
1 2 2 4
3 4 6 8
1 0 1 2
3 4 0 4
3 6 4 8
9 12 12 16
第二章 matlab 基础 计算机仿真与模拟例子 2-22 函数 repmat的应用示例。
>> repmat(magic(2),2,3)
ans =
1 3 1 3 1 3
4 2 4 2 4 2
1 3 1 3 1 3
4 2 4 2 4 2
第二章 matlab 基础 计算机仿真与模拟
repmat函数的基本语法为 repmat(A,M,N),它的作用是将指定的矩阵 A复制 M?N次,然后创建一个复杂的大矩阵,结果
,因此,在例子 2-22中,将一个简单的二行二列的矩阵进行了六次重复,创建了四行六列的大矩阵。
NM
AA
A
AAA
.,,.,,
.,,.,,.,,.,,
.,,.,,.,,
.,,
第二章 matlab 基础 计算机仿真与模拟
2.1.6 稀 疏 矩 阵矩阵元素的表示方法是计算机数据结构理论中经常讨论的话题,因为在实际工作中,经常遇到这样一类矩阵,这类矩阵中数值为 0的元素居多,这类矩阵一般被称为稀疏矩阵。如果使用满阵的方式来表示稀疏矩阵,则 0元素将占用相当的内存空间,
特别是在 MATLAB中,由于 MATLAB默认的数据类型是双精度类型,每一个双精度类型的数据元素都要占用八个字节的内存空间,当 0元素很多的时候将占用相当可观的内存空间,因此,
在 MATLAB中,专门提供了稀疏矩阵的表示方法。
第二章 matlab 基础 计算机仿真与模拟例子 2-23 创建稀疏矩阵。
在 MATLAB命令行窗口中键入下面的指令:
>> A = eye(5)
A =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
第二章 matlab 基础 计算机仿真与模拟
>> B = sparse(A)
B =
(1,1) 1
(2,2) 1
(3,3) 1
(4,4) 1
(5,5) 1
>> whos
Name Size Bytes Class
A 5x5 200 double array
B 5x5 84 double array (sparse)
Grand total is 30 elements using 284 bytes
第二章 matlab 基础 计算机仿真与模拟在例子 2-23中,首先使用 eye函数创建了五阶的单位矩阵,
五阶单位方阵一共有 25个元素,其中却有 20个元素是 0,于是使用 sparse函数将该函数构造成为稀疏矩阵,这样就得到了矩阵 B。
通过 whos指令可以清晰地比较两个矩阵占用的内存空间,
A矩阵占用了 200个字节,而 B矩阵仅占用了 84个字节。
第二章 matlab 基础 计算机仿真与模拟稀疏矩阵和普通矩阵 (满阵 )之间可以直接进行运算,例如
>> A+B
ans =
2 0 0 0 0
0 2 0 0 0
0 0 2 0 0
0 0 0 2 0
0 0 0 0 2
第二章 matlab 基础 计算机仿真与模拟这里运算得到的结果是一个满阵,请读者在进行稀疏矩阵运算的时候注意 。
MATLAB中使用“三元组”表示法来表示稀疏矩阵,该表示方法一般由三个向量组成:第一个向量是由矩阵中非零元素组成的向量,其长度一般为 nzmax,即矩阵中所有非零元素的个数;第二个向量是非零元素的行序号,该向量的长度也为
nzmax;第三个向量是非零元素的列序号,该向量的长度也为
nzmax。
第二章 matlab 基础 计算机仿真与模拟例如对于下面的稀疏矩阵:
0 0 0 28 0 0
0 0 0 0 0 91
0 0 0 0 0 0
0 0 6 0 0 0
0 0 0 3 11 0
15 0 22 0 0 15
S
因此,表示矩阵的三个向量分别为
>> data = [15 91 11 3 28 22?6?15];
>> ir = [ 1 5 2 2 6 1 3 1];
>> jc = [1 1 2 3 3 4 4 6];
第二章 matlab 基础 计算机仿真与模拟利用上面的三个矩阵和 sparse函数创建六行六列的稀疏矩阵:
>> S = sparse(ir,jc,data,6,6)
S =
(1,1) 15
(5,1) 91
(2,2) 11
(2,3) 3
(6,3) 28
(1,4) 22
(3,4) -6
(1,6) -15
第二章 matlab 基础 计算机仿真与模拟
>> %将该矩阵还原成满阵
>> full(S)
ans =
15 0 0 22 0 -15
0 11 3 0 0 0
0 0 0 -6 0 0
0 0 0 0 0 0
91 0 0 0 0 0
0 0 28 0 0 0
第二章 matlab 基础 计算机仿真与模拟
>> whos
Name Size Bytes Class
S 6x6 124 double array (sparse)
ans 6x6 288 double array
data 1x8 64 double array
ir 1x8 64 double array
jc 1x8 64 double array
Grand total is 68 elements using 604 bytes
第二章 matlab 基础 计算机仿真与模拟注意:
在不同的语言或者数学计算工具软件中,表示稀疏矩阵的方法可能不尽相同 。
MATLAB专门提供了若干函数用于稀疏矩阵的运算,在表
2-9中对这些函数进行了总结 。
提示:
在 MATLAB命令行窗口中键入指令 help sparfun可以得到稀疏矩阵运算函数的列表。
第二章 matlab 基础 计算机仿真与模拟表 2-9 稀疏矩阵的常用函数创建稀疏矩阵
spe ye 创建单位稀疏矩阵
spra nd 创建均匀分布的随机数稀疏矩阵
spra ndn 创建正态分布的随机数稀疏矩阵满阵和稀疏矩阵之间的转换
spa rse 创建稀疏矩阵或者将满阵转变为稀疏矩阵
full 将稀疏矩阵转变为满阵
find 获取非零元素的索引向量稀疏矩阵的操作函数
nnz 获取矩阵的非零元素的个数
noz er os 获取矩阵的非零元素向量
nz m ax 获取矩阵的各个向量的最大长度
spon es 将稀疏矩阵中的元素用数字 1 替代
isspar se 判断输入 参数是否为稀疏矩阵第二章 matlab 基础 计算机仿真与模拟
2.1.7 多 维 数 组
1 创建多维数组多维数组的创建也有多种方法:第一种方法是使用直接赋值的方法来创建;第二种方法是使用部分 MATLAB的函数创建多维数组 。 具体的做法结合例子讲述 。
例子 2-24 使用直接赋值的方法创建多维数组。
第二章 matlab 基础 计算机仿真与模拟在 MATLAB的命令行中,键入下面的指令:
>> A = pascal(4)
A =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
>> A(:,:,2) = eye(4)
A(:,:,1) =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
第二章 matlab 基础 计算机仿真与模拟
A(:,:,2) =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
>> A(:,:,3) = magic(5)
Subscripted assignment dimension mismatch,
在例子 2-24中,首先创建了一个矩阵 ——帕斯卡矩阵,也可以将其看作二维数组,然后,使用全下标的形式创建了三维数组的第二页,第二页上的矩阵是一个单位阵,接着在创建新的一页时使用了五阶方阵作为输入,由于维数不匹配所以系统报错。
第二章 matlab 基础 计算机仿真与模拟例子 2-25 使用直接赋值的方法创建多维数组。
在 MATLAB的命令行中,键入下面的指令:
>> B(3,3,3) = 1
B(:,:,1) =
0 0 0
0 0 0
0 0 0
B(:,:,2) =
0 0 0
0 0 0
0 0 0
B(:,:,3) =
0 0 0
0 0 0
0 0 1
第二章 matlab 基础 计算机仿真与模拟例子 2-26 使用函数创建多维数组。
在 MATLAB命令行中,键入下面的指令:
>> rand(3,3,3)
ans(:,:,1) =
0.9501 0.4860 0.4565
0.2311 0.8913 0.0185
0.6068 0.7621 0.8214
ans(:,:,2) =
0.4447 0.9218 0.4057
0.6154 0.7382 0.9355
0.7919 0.1763 0.9169
ans(:,:,3) =
0.4103 0.3529 0.1389
0.8936 0.8132 0.2028
0.0579 0.0099 0.1987
第二章 matlab 基础 计算机仿真与模拟例子 2-27 使用函数 cat构造多维数组。
在 MATLAB命令行中,键入下面的指令:
>> A = magic(3);
>> B = eye(3);
>> C = pascal(3);
>> cat(3,A,B,C)
ans(:,:,1) =
8 1 6
3 5 7
4 9 2
第二章 matlab 基础 计算机仿真与模拟
ans(:,:,2) =
1 0 0
0 1 0
0 0 1
ans(:,:,3) =
1 1 1
1 2 3
1 3 6
第二章 matlab 基础 计算机仿真与模拟在本例子中利用 cat函数将三个三阶方阵组合构成一个三维数组 。
有关构造数组的函数的具体使用方法可参阅 MATLAB的帮助文档或在线帮助 。
访问多维数组的元素和访问向量或者矩阵元素的方法一致,
不仅可以使用相应的索引作为下标访问多维数组的元素,而且也可以使用单下标的方式来访问 。
在前面曾经提及了两个函数可以用于全下标和单下标之间的转换,这两个函数分别为 sub2ind和 ind2sub,在例子 2-28中演示了这两个函数的使用方法。
第二章 matlab 基础 计算机仿真与模拟例子 2-28 单下标和全下标之间的转换。
>> %创建多维数组
>> A = rand(3,3,4);
>> %全下标向单下标转换
>> sub2ind(size(A),2,3,2)
ans =
17
>> %单下标向全下标转换
>> ind2sub(size(A),17)
第二章 matlab 基础 计算机仿真与模拟
ans =
17
>> [i,j,k] = ind2sub(size(A),17)
i =
2
j =
3
k =
2
第二章 matlab 基础 计算机仿真与模拟
2 多维数组的操作函数在 MATLAB中有一组函数专门用于处理多维数组,见表 2-10。
表 2-10 多维数组的操作函数函 数 说 明
n d g ri d 根据输入的向量产生用于函数和插值运算的多维数组
p e rm u te 改变多维数组的维数顺序
ip e rm u te p e rm u te 函数的逆运算
sh if td im 平移多维数组的维数
c ir c sh if t 循环平移多维数组的行或列元素
sq u e e z e 进行数组降维操作,将多维数组中维数为 1 的页消除第二章 matlab 基础 计算机仿真与模拟例子 2-28 permute函数和 ipermute函数的使用示例 。
在 MATLAB命令行中,键入下面的指令:
>> a = rand(2,3,4);
>> size(a)
ans =
2 3 4
>> b = permute(a,[ 2 1 3]);
>> size(b)
ans =
3 2 4
>> c = ipermute(b,[2 1 3]);
>> size(c)
ans =
2 3 4
第二章 matlab 基础 计算机仿真与模拟在本例子中,首先创建了一个二行三列四页的三维数组,
然后使用 permute函数将三维数组转变成为了一个三行二列四页的三维数组 。 ipermute函数是 permute函数的逆运算,在例 2-28
中最后得到的三维数组 c和三维数组 a是完全一致的 。
注意:
permute函数和 ipermute函数的第二个参数是一个向量,向量内的元素是多维数组各个维的序号。
第二章 matlab 基础 计算机仿真与模拟例子 2-29 shiftdim函数的使用示例。
在 MATLAB命令行中,键入下面的指令:
>> a = rand(1,2,3,4,5);
>> size(a)
ans =
1 2 3 4 5
>> size(shiftdim(a))
ans =
2 3 4 5
>> size(shiftdim(a,2))
ans =
3 4 5 1 2
>> size(shiftdim(a,?2))
ans =
1 1 1 2 3 4 5
第二章 matlab 基础 计算机仿真与模拟例子 2-30 squeeze函数的使用示例 。
在 MATLAB命令行中,键入下面的指令:
>> a = rand(1,2,1,3,1,4,1,5);
>> size(a)
ans =
1 2 1 3 1 4 1 5
>> size(squeeze(a))
ans =
2 3 4 5
squeeze函数的作用是将多维数组中尺寸为 1的页删除,以缩减多维数组的维数,同时保持数组的元素个数不变。
第二章 matlab 基础 计算机仿真与模拟
2.2 数 据 类 型
2.2.1 概述
2.2.2 MATLAB基本数值类型
2.2.3 逻辑类型和关系运算
2.2.4 字符串
2.2.5 元胞数组
2.2.6 结构第二章 matlab 基础 计算机仿真与模拟
2.2.1 概 述
MATLAB的早期版本只有非常简单的二维数组和字符类型的数据,目前的 MATLAB版本中不仅有多达十几种的基本数据类型,在不同的专业工具箱中还有特殊的数据类型,并且
MATLAB还支持面向对象的编程技术,支持用户自定义的数据类型 。
MATLAB支持的基本数据类型见图 3-1。
第二章 matlab 基础 计算机仿真与模拟图 2-6 MATLAB的数据类型
M A T L A B 数据类型基本数值类型 字符串 元胞数组 结构内嵌对象函数句柄 J a v a 对象 逻辑类型双精度类型 单精度类型 整数类型 用户自定义类
i n t 8,u i n t 8
i n t 1 6,u i n t 1 6
i n t 3 2,u i n t 3 2
i n t 6 4,u i n 6 4
第二章 matlab 基础 计算机仿真与模拟获取 MATLAB的数据类型列表可以在 MATLAB命令行窗口中键入 help datatypes命令 。
在图 2-6中所示的各种数据类型都可以用于创建向量、矩阵或者多维数组。用户自定义的数据类型也是图示的各种数据类型的组合。在不同的 MATLAB工具箱中具有自定义的数据类型,
例如控制系统工具箱中定义的 LTI对象,在滤波器设计工具箱中定义的滤波器对象,在符号数学工具箱中定义的符号类型数据等。这些工具箱中包含的特殊数据对象也都使用这些基本的数据类型组合构成。
第二章 matlab 基础 计算机仿真与模拟需要指出一点,MATLAB的基本数据类型是双精度数据类型和字符类型。 MATLAB的 M语言和其他高级编程语言不同的是,MATLAB没有具体的变量或对象声明和定义过程,任何数据类型的变量或对象都可以利用面向对象编程技术中构造函数的方法或者数据类型转换的方法来创建其他数据类型对象和变量。 MATLAB和 Java语言,C++语言类似,所有数据类型就是相应的类,具有一定的面向对象的特点。 MATLAB的不同数据类型的变量或对象占用的内存空间不尽相同,不同的数据类型的变量或对象也具有不同的操作函数。在本节中,将详细讲述
MATLAB的基本数值类型、逻辑类型、字符串、元胞数组和结构的使用方法,其中,元胞数组是 MATLAB中常用的一种独有的数据类型。
第二章 matlab 基础 计算机仿真与模拟
2.2.2 MATLAB基本数值类型
1 基本数值类型入门表 2-11 MATLAB的基本数值类型数据类型 说 明 字节数 取 值 范 围
dou ble 双精度数据类型 8
spa rse 稀疏矩阵数据类型 N/A
single 单精度数据类型 4
uint8 无符号 8 位整数 1 0 ~ 255
uint1 6 无符号 16 位整数 2 0 ~ 65 535
uint3 2 无符号 32 位整数 4 0 ~ 4 294 967 295
uint6 4 无符号 64 位整数 8 0 ~ 18 446 744 073 709 551 615
int8 有符号 8 位整数 1? 128 ~ 127
int16 有符号 16 位整数 2? 32 768 ~ 32 767
int32 有符号 32 位整数 4? 2 147 4 83 648 ~ 2 147 483 647
int64 有符号 64 位整数 8? 9 223 3 72 036 854 775 808 ~ 9 223 372 036 854 775 807
第二章 matlab 基础 计算机仿真与模拟说明:
表格中所指的字节数是指使用该数据类型创建数组或者矩阵时,每一个元素占用的内存字节数,稀疏矩阵则不同,由于稀疏矩阵使用了特殊的存储数据方法,所以稀疏矩阵对象占用的内存字节数比较特殊 。
复数数据类型也相对特殊,复数可以用表格中所示的各种数据类型创建,但是由于复数由实部数据和虚部数据组成,所以占用的字节数为构成复数的数据类型的两倍,例如复数 z =
1+i,在 MATLAB中占用了 16个字节的内存。
第二章 matlab 基础 计算机仿真与模拟例子 2-31 使用不同的数据类型。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = [ 1 2 3];
>> class(A)
ans =
double
>> whos
Name Size Bytes Class
A 1x3 24 double array
ans 1x6 12 char array
Grand total is 9 elements using 36 bytes
第二章 matlab 基础 计算机仿真与模拟
>> B = int16(A);
>> class(B)
ans =
int16
>> whos
Name Size Bytes Class
A 1x3 24 double array
B 1x3 6 int16 array
ans 1x5 10 char array
Grand total is 11 elements using 40 bytes
第二章 matlab 基础 计算机仿真与模拟在例子 2-31中,使用了 int16,即 16位的有符号整数类型,
作为示例,并且使用 class函数获取不同变量或者对象的数据类型。向量 B是从向量 A通过数据类型转换得到的,可以看出,A
和 B向量包含同样的数据,但是由于两个向量的数据类型不同,
所以它们占据的内存字节数不同,其中双精度类型的向量 A占用了 24个字节,而 16位整数类型的向量 B仅占用了 6个字节。
第二章 matlab 基础 计算机仿真与模拟注意:
MATLAB和 C语言在处理数据类型和变量时不同 。 在 C语言中,任何变量在使用之前都必须声明,然后赋值,在声明变量时就指定了变量的数据类型 。 但是在 MATLAB中,任何数据变量都不需要预先的声明,MATLAB将自动地将数据类型设置为双精度类型,若需要使用其他类型的数据,则必须通过数据类型的转换完成 。 MATLAB的数据类型名称同样就是数据类型转换的函数,利用这些函数来完成相应的数据类型转化的工作 。
关于数据类型转换函数的使用可以参阅相应的在线帮助。
第二章 matlab 基础 计算机仿真与模拟例子 2-32 使用不同的数据类型。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = [ 1 2 3];
>> b = [ 3 4 5];
>> c = a+b;
>> whos
Name Size Bytes Class
a 1x3 24 double array
b 1x3 24 double array
c 1x3 24 double array
Grand total is 9 elements using 72 bytes
>> c=int16(a)+b
Error using ==> plus
Integers can only be combined with integers of the
same class,or scalar doubles.
第二章 matlab 基础 计算机仿真与模拟
2 整数类型数据运算
MATLAB运算的基本数据类型为双精度的数据类型,
MATLAB还另外提供了一些函数可以进行整数类型数据的运算,
在表 2-12中总结了这些函数。
表 2-12 整数类型数据的运算函数函 数 说 明
bitand 数据位“与”运算
bitcmp 按照指定的数据位数求数据的补码
bitor 数据位“或”操作
bitmax 最大的浮点整数数值,一般为 2
53
1=9 007 199 254 740 991
bitxor 数据位“异或”操作
bits et 将指定的数据位设置为 1
bitget 获取指定的数据位数值
bits hift 数据位移操作第二章 matlab 基础 计算机仿真与模拟注意:
整数类型数据运算函数的操作数一般为无符号的整数,不同的函数会有所不同,函数运算的结果必须小于 bitmax代表的数值 。
提示:数据位运算了解计算机中数据的二进制表达是进行二进制位运算的基础。在计算机中的任何数据都是由二进制数来保存的,计算机最初能够处理的也只有二进制的数据。对于整数可以使用原码、
反码、补码来表示。
第二章 matlab 基础 计算机仿真与模拟字节和位字节这个概念对于计算机用户来讲并不陌生,计算机中的存储器就是由许许多多被称为,字节,(byte)的单元组成的 。
一般地,内存的最小度量单位是位 (bit),有些地方叫作比特 。 而一个字节就是由 8个二进制位组成的,其中,最右边的一位叫最低位,最左边的一位叫作最高位 。 所以在本章前面小节介绍的 16位整数占用两个字节的内存,依次类推,32位整数就需要占用四个字节的内存 。
在计算机中表示数据可以有不同的方法,一般有原码,反码和补码三种形式 。
为了便于表述,这里所有的数字都将按照数字在八位计算机内的表示方式来表示。
第二章 matlab 基础 计算机仿真与模拟原码将最高位作为符号位 (以数字 0表示正,以数字 1表示负 ),
其他的数字位代表数值本身的绝对值,这种表示数字的方式叫作原码 。
例如,数字 7在八位计算机中的原码为 0000 0111;而数字 -
7在八位计算机中的原码为 1000 0111。
如果这两个数字在我们日常使用的 32位计算机中用原码表示,则无非再多几个数字 0。例如在 32位的计算机中用原码表示数字 7,则为 0000 0000 0000 0000 0000 0000 0000 0111。
第二章 matlab 基础 计算机仿真与模拟反码用反码表示数字的规则是,如果是正数,则用这个数字的原码来表示,如果是负数,则保持符号位为 1,然后将这个数字的原码按照每位取反,得到这个数字的反码 。
例如,数字 7在八位计算机中的反码就是它的原码,为 000
0111;而数字 -7在八位计算机中的反码是 1111 1000。
第二章 matlab 基础 计算机仿真与模拟补码计算机中表示数据的一般方式是补码,补码是这样规定的:
一个正数的补码就是其原码,例如整数 7在八位计算机中的补码是 0000 0111。
对于负数的补码是将数字的反码加上 1,就得到了这个数字的补码 。 例如 -7在 8位计算机中的补码是 1111 1001。
关于数字在计算机中二进制表示的详细解释请参阅相应的计算机原理方面的书籍。
第二章 matlab 基础 计算机仿真与模拟
MATLAB整数类型数据运算和 C语言整数位运算比较类似,
所不同的是 MATLAB中没有相应的运算符,而只有这些函数可用,并且这些整数运算的数据都必须大于 0。 这里结合具体的示例讲解表 2-12所列函数的用法 。
第二章 matlab 基础 计算机仿真与模拟例子 2-33(a) 数据位,与,操作。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = 86; B = 77;
>> C = bitand(A,B)
C =
68
>> a = uint16(A);b = uint16(B);
>> c = bitand(a,b)
c =
68
>> whos
第二章 matlab 基础 计算机仿真与模拟
Name Size Bytes Class
A 1x1 8 double array
B 1x1 8 double array
C 1x1 8 double array
a 1x1 2 uint16 array
b 1x1 2 uint16 array
c 1x1 2 uint16 array
Grand total is 6 elements using 30 bytes
第二章 matlab 基础 计算机仿真与模拟注意例子 2-33(a)运算得到结果的数据类型,数据 a,b为无符号的 16位整数,所以进行操作的结果也是无符号的 16位整数,
但数据 A,B为双精度类型的数据 (注意这些数据都是非负整数 ),
结果运算的结果是双精度类型 。
运算的过程大体如下:
(68)
86 的补码
77 的补码
010 1 01 10
010 0 1 101
“与”运算的结果 010 0 010 0
第二章 matlab 基础 计算机仿真与模拟例子 2-33(b) 整数数据位的运算。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = 86;
>> dec2bin(A)
ans =
1010110
>> B = bitset(A,6);
>> dec2bin(B)
ans =
1110110
>> C = bitset(A,7,0);
>> dec2bin(C)
第二章 matlab 基础 计算机仿真与模拟
ans =
10110
>> D = bitshift(A,-4);
>> dec2bin(D)
ans =
10101100000
>> E = bitshift(A,-4);
>> dec2bin(E)
ans =
101
>> a = uint16(A);
>> e = bitshift(A,-4);
>> dec2bin(e)
ans =
101
第二章 matlab 基础 计算机仿真与模拟
>> whos
Name Size Bytes Class
A 1x1 8 double array
B 1x1 8 double array
C 1x1 8 double array
D 1x1 8 double array
E 1x1 8 double array
a 1x1 2 uint16 array
ans 1x3 6 char array
e 1x1 8 double array
Grand total is 10 elements using 56 bytes
第二章 matlab 基础 计算机仿真与模拟说明:
dec2bin函数是将十进制整数转变成二进制整数字符串的函数,该函数将在后面字符串转换函数中详细讲述 。
在例子 2-33(b)中,使用了 bitset函数和 bitshift函数,其中
bitshift函数类似于 C语言的,>>”运算符和,<<”运算符,如果函数输入的第二个参数为正数,则进行左位移操作,否则为右位移操作。 bitset函数根据输入的第二个参数设置相应的数据位的数值,若不指定第三个参数,则将相应的数据位设置为,1”,
否则根据输入的第三个参数 (0或者 1)设置相应的数据位。另外,
注意一些函数运算的结果,有些函数的运算结果是双精度数据类型。
第二章 matlab 基础 计算机仿真与模拟
3 MATLAB的常量表 2-13 MATLAB的常量常 量 说 明
ans 最近运算的结果
eps 浮点数相对精度
realm ax MA TL AB 能够表示的实数的最大绝对值
realm in MA TL AB 能够表示的实数的最小绝对值
pi 常数 π
i,j 复数的虚部数据最小单位
I nf 无穷大
NaN 非数 (Not a Numbe r)
第二章 matlab 基础 计算机仿真与模拟说明:
eps,realmax 和 realmin 三个常量具体的数值与运行
MATLAB的计算机相关,不同的计算机系统可能具有不同的数值,例如,在 我 的 计 算 机 上,这 三 个 数 值 分 别 为
eps=2.2204× 10-16,realmax=1.7977× 10308,
realmin=2.2251× 10-308。
和其他的高级编程语言所定义的常量不同,MATLAB的常量数值是可以修改的。例如,在 MATLAB命令行窗口中可以键入如下的指令,pi=100,这样 pi这个常量的数值就变成了 100。
但是,如果用 clear指令清除变量后,pi将变成原有的常量数值。
第二章 matlab 基础 计算机仿真与模拟
Inf也可以写作 inf,它为 IEEE定义的算术数据无穷大数值,
在 MATLAB中进行诸如 1.0/0.0或者 exp(1000)的操作时都会得到这个数值 。 如果将 inf应用于函数,则计算结果可能为 inf或者
NaN。
NaN也可以写作 nan,它为 IEEE规定的某种运算得到的结果,例如 0/0的运算得到的结果就是 NaN。 NaN参与运算的结果也为 NaN(关系运算除外 )。
第二章 matlab 基础 计算机仿真与模拟例子 2-34 NaN和 Inf运算示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = inf;
>> class(a)
ans =
double
>> b = int16(a)
b =
32767
>> c = sin(a)
c =
NaN
第二章 matlab 基础 计算机仿真与模拟
>> sin(c)
ans =
NaN
>> class(c)
ans =
double
>> int64(c)
ans =
0
第二章 matlab 基础 计算机仿真与模拟说明:
MATLAB中所有的数据默认类型均为双精度类型,包括像
NaN和 Inf在内的上述若干常数 。
对 NaN和 Inf进行数据转化时要注意,Inf将获取相应数据类型的最大值,而 NaN往往返回相应整数数据类型的数值 0,浮点数类型则仍然为 NaN。
在运算中使用 NaN可以避免因为执行了 0/0这类能够产生错误的应用程序中断,可以辅助调试应用程序。
第二章 matlab 基础 计算机仿真与模拟例子 2-35 最小复数单位的使用。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = i
a =
0 + 1.0000i
>> i = 1
i =
1
>> b = i+j
b =
1.0000 + 1.0000i
>> clear
>> c = i+j
c =
0 + 2.0000i
第二章 matlab 基础 计算机仿真与模拟通过例子 2-35可以看出,MATLAB的常量是可以赋予新的数值的。一旦被赋予了新的数值,则常量代表的就不是原有的数值,而是新的数值,除非执行 clear命令。就像创建变量 c的时候,由于执行了 clear指令,将工作空间中的变量清除干净,
于是在执行 c = i+j的时候,MATLAB认为这是在进行两个最小复数运算单位的计算,所以得到了 c = 2i。
第二章 matlab 基础 计算机仿真与模拟
4 空数组所谓空数组,就是指那些某一个维或者某些维的长度为 0
的数组 。 它是为了完成某些 MATLAB操作和运算而专门设计的一种数组 。 利用空数组可以修改数组的大小,但是不能修改数组的维数 。
下面通过具体的例子来说明空数组创建和使用的过程 。
例子 2-36 创建空数组 。
和创建普通的数组 (矩阵 )一样,创建空数组也有不同的方法,在 MATLAB命令行窗口中键入下面的命令:
第二章 matlab 基础 计算机仿真与模拟
>> A = []
A =
[]
>> B = ones(2,3,0)
B =
Empty array,2-by-3-by-0
>> C = randn(2,3,4,0)
C =
Empty array,2-by-3-by-4-by-0
>> whos
Name Size Bytes Class
A 0x0 0 double array
B 2x3x0 0 double array
C 4-D 0 double array
Grand total is 0 elements using 0 bytes
第二章 matlab 基础 计算机仿真与模拟空数组并不意味着什么都没有,使用 whos命令可以看到空数组类型的变量在 MATLAB的工作空间中确实存在。在数组编辑器中也可以对空数组进行编辑,填充矩阵的元素。图 2-7为空数组在数组编辑器中显示的状况。
第二章 matlab 基础 计算机仿真与模拟图 2-7 空数组在数组编辑器中的显示情况第二章 matlab 基础 计算机仿真与模拟例子 2-37 使用空数组的例子。
在 MATLAB命令行窗口中,键入下面的指令:
>> A (2,2,3) = 1
A(:,:,1) =
0 0
0 0
A(:,:,2) =
0 0
0 0
A(:,:,3) =
0 0
0 1
>> A(:,:,3) = []
第二章 matlab 基础 计算机仿真与模拟
A(:,:,1) =
0 0
0 0
A(:,:,2) =
0 0
0 0
>> B = reshape(1:24,4,6)
B =
1 5 9 13 17 21
2 6 10 14 18 22
3 7 11 15 19 23
4 8 12 16 20 24
>> B(:,[2 3 4]) = []
B =
1 17 21
2 18 22
3 19 23
4 20 24
第二章 matlab 基础 计算机仿真与模拟
2.2.3 逻辑类型和关系运算
1 逻辑数据类型所谓逻辑数据类型就是仅具有两个数值的一种数据类型,
其中,一个数 值为 TRUE,另外 一个 数值为 FALSE 。 在
MATLAB中,参与逻辑运算或者关系运算的并不一定必须有逻辑类型的数据,任何数值都可以参与逻辑运算 。 这时,
MATLAB将所有非零值看作逻辑真,将零值看作逻辑假 。 一般地,1表示逻辑真,0表示逻辑假 。
和一般的数值类型类似,逻辑类型的数据只能通过数值类型转换,或者使用特殊的函数生成相应类型的数组或者矩阵。
第二章 matlab 基础 计算机仿真与模拟表 2-14 创建逻辑类型数据的函数函 数 说 明
logical 将任意类型的数组转变成为逻辑类型数组,其中,非零元素为真,零元素为假
T rue 产生逻辑真值数组
F alse 产生逻辑假值数组第二章 matlab 基础 计算机仿真与模拟例子 2-38 创建逻辑类型数组。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = eye(3);
>> B = logical(A)
B =
1 0 0
0 1 0
0 0 1
>> C = true(size(A))
C =
1 1 1
1 1 1
1 1 1
第二章 matlab 基础 计算机仿真与模拟
>> D = false([size(A),2])
D(:,:,1) =
0 0 0
0 0 0
0 0 0
D(:,:,2) =
0 0 0
0 0 0
0 0 0
第二章 matlab 基础 计算机仿真与模拟
>> whos
Name Size Bytes Class
A 3x3 72 double array
B 3x3 9 logical array
C 3x3 9 logical array
D 3x3x2 18 logical array
Grand total is 45 elements using 108 bytes
第二章 matlab 基础 计算机仿真与模拟使用 logical函数,true函数和 false函数的过程都比较简单,
通过最后的比较可以看出,逻辑类型的数组每一个元素仅占用一个字节的内存空间,所以矩阵 B尽管和矩阵 A看上去一致,但是内存占用上有相当大的差距,并且属于不同的数据类型,也就有不同的操作函数和方法 。
第二章 matlab 基础 计算机仿真与模拟逻辑类型的数组元素仅能有两个取值,1或者 0,分别表示逻辑真和逻辑假 。
另外,在 MATLAB中还有若干函数以 is开头,这类函数是用来完成某种判断功能的函数,例如函数 isnan判断输入参数是否为 NaN,而 isnumeric函数判断输入参数是否为某种数值类型,
见例子 2-39。
第二章 matlab 基础 计算机仿真与模拟例子 2-39 isnumeric函数的使用示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> a =true
a =
1
>> isnumeric(a)
ans =
0
>> b = 1;
>> isnumeric(b)
ans =
1
第二章 matlab 基础 计算机仿真与模拟注意:
在使用 true或者 false函数创建逻辑类型数组时,若不指明参数,则创建一个逻辑类型的标量 。
此外,能够产生逻辑数据类型结果的运算还有关系运算,
关系运算将在后面详细讨论 。
第二章 matlab 基础 计算机仿真与模拟
2 逻辑运算表 2-15 MATLAB的逻辑运算运 算 符 说 明
&& 具有短路作用的逻辑与操作,仅能处理标量
|| 具有短路作用的逻辑或操作,仅能处理标量
& 元素与操作
| 元素或操作
~ 逻辑非操作
xor 逻辑异或操作
any 当向量中的元素有非零元素时,返回真
all 当向量中的元素都是非零元素时,返回真第二章 matlab 基础 计算机仿真与模拟说明:
参与逻辑运算的操作数不一定必须是逻辑类型的变量或常数,也可以使用其他类型的数据进行逻辑运算,但是运算的结果一定是逻辑类型的数据 。
所谓具有短路作用是指,在进行 &&或 ||运算时,若参与运算的变量有多个,例如 a && b && c && d,若 a,b,c,d四个变量中 a为假,则后面的三个都不再被处理,运算结束,并返回运算结果逻辑假。
第二章 matlab 基础 计算机仿真与模拟例子 2-40 逻辑运算示例 。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = eye(3);
>> b = a;b(3,1) =1;
>> a && b
Operands to the || and && operators must be convertible to
logical scalar values.
>> a & b
第二章 matlab 基础 计算机仿真与模拟
ans =
1 0 0
0 1 0
0 0 1
>> whos
Name Size Bytes Class
a 3x3 72 double array
ans 3x3 9 logical array
b 3x3 72 double array
Grand total is 27 elements using 153 bytes
第二章 matlab 基础 计算机仿真与模拟例子 2-40中,首先参与逻辑运算的是两个双精度类型的矩阵,这两个矩阵进行 &&运算时,MATLAB报告了相应的错误,
因为参与 &&或者 ||运算的操作数必须为标量。另外,从例子也能够看出,尽管参与运算的是两个双精度类型的矩阵,运算的结果却是逻辑类型的矩阵。
第二章 matlab 基础 计算机仿真与模拟例子 2-41 函数 all和 any使用示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = [1 0 1;1 0 0 ;1 1 0;1 1 1]
a =
1 0 1
1 0 0
1 1 0
1 1 1
>> all(a)
ans =
1 0 0
>> any(a)
ans =
1 1 1
第二章 matlab 基础 计算机仿真与模拟
3 关系运算关系运算是用来判断两个操作数关系的运算,MATLAB中的关系运算和 C语言的关系运算基本一致,主要有六种,见表
2-16。
表 2-16 MATLAB中的关系运算符 运算符 说明 运算符 说明
= = 等于 > 大于
~= 不等于 <= 小于等于
< 小于 >= 大于等于第二章 matlab 基础 计算机仿真与模拟参与关系运算的操作数可以使用各种数据类型的变量或者常数,运算的结果是逻辑类型的数据。标量也可以和矩阵或者数组进行比较,比较的时候将自动扩展标量,返回的结果是和数组同维的逻辑类型数组。如果进行比较的是两个数组,则数组必须是同维的,且每一维的尺寸也必须一致。
第二章 matlab 基础 计算机仿真与模拟例子 2-42 关系运算示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = reshape(1:9,3,3);
>> B = magic(3);
>> A > B
ans =
0 1 1
0 0 1
0 0 1
>> A = = B
ans =
0 0 0
0 1 0
0 0 0
第二章 matlab 基础 计算机仿真与模拟例子 2-43 复杂的关系运算。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = reshape(-4:4,3,3)
A =
-4 -1 2
-3 0 3
-2 1 4
>> B = ~(A>=0)
B =
1 1 0
1 0 0
1 0 0
第二章 matlab 基础 计算机仿真与模拟
>> C = (A>0)&(A<3)
C =
0 0 1
0 0 0
0 1 0
在例子 2-43中,使用逻辑运算和关系运算从矩阵 A中分别标识出不大于 0的数据和大于 0且小于 3的数据索引位置 。
将逻辑类型的数据应用于索引就构成了逻辑索引,利用逻辑索引,可以方便地从矩阵或者数组中找到某些符合条件的元素,见例子 2-44。
第二章 matlab 基础 计算机仿真与模拟例子 3-44 逻辑索引示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = [-2 10 NaN 30 0 -11 -Inf 31];
>> pos = A<0
pos =
1 0 0 0 0 1 1 0
>> B = A(pos)
B =
-2 -11 -Inf
>> pos = (A>=0)&(isfinite(A))
pos =
0 1 0 1 1 0 0 1
>> C = A(pos)
C =
10 30 0 31
第二章 matlab 基础 计算机仿真与模拟在例子 2-43中,首先从向量 A中获取了全部小于 0的元素构成向量 B,然后从向量 A中获取了不小于 0且有穷的向量元素 。
可以看出,逻辑索引数组可以非常方便地获取数组中满足条件的元素,这种操作在处理大数组时非常有效 。
第二章 matlab 基础 计算机仿真与模拟
4 运算符的优先级到本小节为止,MATLAB的基本运算符都已经介绍完毕了 。
在 M语言中可以将这些不同的运算符组合起来创建复杂的运算表达式 。 M语言的运算符和普通的高级编程语言类似,也具有相应的计算优先级 。 这里将 M语言的运算以及相应的计算优先级进行了总结:
(1) 括号 ( )。
(2) 数组转置 (.'),数组幂 (.^),复转置 ('),矩阵幂 (^)。
(3) 一元加 (+),一元减 (?),逻辑非 (~)。
(4) 数组乘法 (.*),数组除法 (./),数组左除 (.\),矩阵乘法 (*),
矩阵右除 (/),矩阵左除 (\)。
(5) 加法 (+),减法 (?)。
第二章 matlab 基础 计算机仿真与模拟
(6) 冒号运算符 (:)。
(7) 小于 (<),小于等于 (<=),大于 (>),大于等于 (>=),等于 (= =),不等于 (~=)。
(8) 元素与 (&)。
(9) 元素或 (|)。
(10) 短路逻辑与 (&&)。
(11) 短路逻辑或 (||)。
第二章 matlab 基础 计算机仿真与模拟上面的运算符优先级是由高到低排列的,例如括号运算符的优先级最高,数组转置等次之。如果同一级别的运算符出现在表达式中,则按照运算符在表达式中出现的次序,由左向右排列。在使用 M语言编写程序时,需要灵活使用这些运算符来具体实现不同的算法。
第二章 matlab 基础 计算机仿真与模拟
2.2.4 字 符 串
1 字符串入门例子 3-15 字符串的创建 。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = 127
a =
127
>> class(a)
ans =
double
>> size(a)
ans =
1 1
第二章 matlab 基础 计算机仿真与模拟
>> b = '127'
b =
127
>> class(b)
ans =
char
>> size(b)
ans =
1 3
>> whos
Name Size Bytes Class
a 1x1 8 double array
ans 1x2 16 double array
b 1x3 6 char array
Grand total is 6 elements using 30 bytes
第二章 matlab 基础 计算机仿真与模拟创建字符串时,只要将字符串的内容用单引号包含起来就可以了,若需要在字符串内容中包含单引号,则需要在键入字符串内容时,连续键入两个单引号即可,例如
>> c = 'Isn''t it?'
c =
Isn't it?
另外,使用 char函数可以创建一些无法通过键盘输入的字符,该函数的作用是将输入的整数参数转变成为相应的字符,
一般地转换成为相应的 Unicode字符。同样字符串也可以转变成为相应的双精度数据。关于 char函数的使用将在后续章节中讲述。
第二章 matlab 基础 计算机仿真与模拟
2 基本字符串操作本小节详细介绍字符串的基本操作,结合具体的例子将详细讲解字符串元素索引,字符串的拼接,字符串与数值之间的转换等操作 。
例子 2-46 字符串元素索引 。
字符串实际上也是一种 MATLAB的向量或者数组,所以,
一般利用索引操作数组的方法都可以用来操作字符串。在
MATLAB命令行窗口中,键入下面的指令:
第二章 matlab 基础 计算机仿真与模拟
>> a = 'This is No.2-46 Example!'
a =
This is No.2-46 Example!
>> b = a(1:4)
b =
This
>> c = a(12:15)
c =
2-46
>> d = a(17:end)
d =
Example!
第二章 matlab 基础 计算机仿真与模拟本例子使用了索引获取字符串 a的子串,直观上在字符串中使用索引和在数组或向量中使用索引是没有任何区别的 。
字符串还可以利用,[]”运算符进行拼接,不过拼接字符串时需要注意以下两点:
● 若使用,,,作为不同字符串之间的间隔,则相当于扩展字符串成为更长的字符串向量 。
● 若使用“;”作为不同字符串之间的间隔,则相当于扩展字符串成为二维或者多维的数组,这时,不同行上的字符串必须具有同样的长度,见例子 3-17。
第二章 matlab 基础 计算机仿真与模拟例子 2-47 字符串的拼接。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = 'Hello';
>> b = 'MOTO!';
>> length(a) == length(b)
ans =
1
>> c = [a,' ',b]
c =
Hello MOTO!
>> d = [ a ; b]
第二章 matlab 基础 计算机仿真与模拟
d =
Hello
MOTO!
>> size(c)
ans =
1 11
>> size(d)
ans =
2 5
第二章 matlab 基础 计算机仿真与模拟在例子 2-46中,首先创建了两个长度一致的字符串,然后利用,[]”运算符将两个字符串分别组合成为了向量 c和矩阵 d。
不过在创建矩阵 d时,各个行字符串必须具有相同的长度 。
拼接字符串还可以使用部分函数完成 。
如前文所述,在 MATLAB中使用了 Unicode作为字符集,
所以每一个字符占用了两个字节的存储空间 。 字符串和一般的数值之间也可以进行相应的转换,在例子 2-48中,将使用字符向数值转换的方法察看相应字符的 Unicode数值 。
第二章 matlab 基础 计算机仿真与模拟例子 2-48 字符串和数值的转换。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = 'Hello MOTO!';
>> b = double(a)
b =
Columns 1 through 8
72 101 108 108 111 32 77 79
Columns 9 through 11
84 79 33
>> c = '您好! ';
>> d = double(c)
d =
50426 47811 41889
>> char(d)
ans =
您好!
第二章 matlab 基础 计算机仿真与模拟3 字符串操作函数表 2-17 常用的字符串操作函数函 数 说 明
ch ar 创建字符串,将数值转变成为字符串
dou ble 将字符串转变成 Un ico de 数值
bla nks 创建空白的字符串 ( 由空格组成 )
de bla nk 将字符串尾部的空格删除
isch ar 判断变量是否是字符类型
strca t 水平组合字符串,构成更长的字符向量
strvc at 垂直组合字符串,构成字符串矩阵
strcm p 比较字符串,判断字符串是否一致
strnc m p 比较字符串前 n 个字符,判断是否一致
strcm pi 比较字符串,比较时忽略字符的大小写
s trnc m pi 比较字符串前 n 个字符,比较时忽略字符的大小写
find str 在较长的字符串中查寻较短的字符串出现的索引
strfind 在第一个字符串中查寻第二个字符串出现的索引
strjust 对齐排列字符串
strre p 替换字符串中的子串
strm atc h 查询匹配的字符串
upp er 将字符串的字符都转变成为大写字符
low er 将字符串的字符都转变成为小写字符第二章 matlab 基础 计算机仿真与模拟例子 2-49 组合字符串示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = 'Hello';
>> b = 'MOTO!';
>> c = strcat(a,b)
c =
HelloMOTO!
>> d =strvcat(a,b,c)
d =
Hello
MOTO!
HelloMOTO!
>> whos
第二章 matlab 基础 计算机仿真与模拟
Name Size Bytes Class
a 1x5 10 char array
b 1x5 10 char array
c 1x10 20 char array
d 3x10 60 char array
Grand total is 50 elements using 100 bytes
在例子 2-49中,使用 strcat函数和 strvcat函数进行了字符串的组合。其中,与前一小节介绍的字符串组合不同,strvcat函数允许将不同长度的字符串组合成为字符矩阵,并且将短字符串扩充为与长字符串相同的长度。
第二章 matlab 基础 计算机仿真与模拟例子 2-50 字符串比较函数应用示例。
在 MATLAB命令行窗口中,键入如下的指令:
>> a = 'The first string';
>> b = 'The second string';
>> c = strcmp(a,b)
c =
0
>> d = strncmp(a,b,4)
d =
1
第二章 matlab 基础 计算机仿真与模拟
>> whos
Name Size Bytes Class
a 1x16 32 char array
b 1x17 34 char array
c 1x1 1 logical array
d 1x1 1 logical array
Grand total is 35 elements using 68 bytes
第二章 matlab 基础 计算机仿真与模拟在例子 2-50中,使用两种不同函数进行了字符串比较,
strcmp比较两个字符串的全部字符,所以第一次比较时,系统返回了逻辑假值,而 strncmp只比较指定字符串中的前 n个字符,
所以在第二次比较时,系统返回了逻辑真值 。
另外,使用 isequal函数也可以比较两个或两个以上字符串是否一致。
第二章 matlab 基础 计算机仿真与模拟例子 2-51 findstr函数和 strfind函数使用示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> S1 = 'A friend in need is a friend indeed';
>> S2 = 'friend';
>> a = findstr(S2,S1)
a =
3 23
>> b = strfind(S2,S1)
b =
[]
第二章 matlab 基础 计算机仿真与模拟
>> whos
Name Size Bytes Class
S1 1x35 70 char array
S2 1x6 12 char array
a 1x2 16 double array
b 0x0 0 double array
Grand total is 43 elements using 98 bytes
第二章 matlab 基础 计算机仿真与模拟在例子 2-51中,分别使用 findstr函数和 strfind函数在字符串中查寻子串的索引位置。注意两个函数的区别,findstr函数从长字符串中查寻短字符串的索引位置,而 strfind是在第一个字符串参数中查寻第二个字符串参数的索引。所以,在例子 2-51中两次操作获取了不同的运算结果。
第二章 matlab 基础 计算机仿真与模拟
4 字符串转换函数在 MATLAB中允许不同类型的数据和字符串类型的数据之间进行转换,这种转换需要使用不同的函数完成。另外,
同样的数据,特别是整数数据有很多种表示的格式,例如十进制、二进制或者十六进制。在 C语言中,printf函数通过相应的格式字符串就可以输出不同格式的数据。而在 MATLAB
中,则直接提供了相应的函数完成数制的转换。在表 2-18和表 2-19中,分别列举了这些函数。
第二章 matlab 基础 计算机仿真与模拟表 2-18 数字和字符之间的转换函数函 数 说 明
num2str 将数字转变成为字符串
int2str 将整数转变成为字符串
ma t2st r 将矩阵转变成为可被 eval 函数使用的字符串
str2doubl e 将字符串转变为双精度类型的数据
str2num 将字符串转变为数字
sprint f 格式化输出数据到命令行窗口
ss canf 读取格式化字符串第二章 matlab 基础 计算机仿真与模拟表 2-19 不同数值之间的转换函数函 数 说 明
hex2num 将十六进制整数字符串转变成为双精度数据
hex2dec 将十六进制整数字符串转变成为十进制整数
dec2he x 将十进制整数转变成为十六进制整数字符串
bin2dec 将二进制整数字符串转变成为十进制整数
dec2bin 将十进制整数转变成为二进制整数字符串
base2dec 将指定数制类型的数字字符串转变成为十进制整数
dec2ba se 将十进制整数转变成为指定数制类型的数字字符串第二章 matlab 基础 计算机仿真与模拟例子 2-52 num2str函数和 str2num函数的用法示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> S = ['1 2';'2 3'];
>> A = str2num(S)
A =
1 2
2 3
>> B = str2num('1 + 2i')
B =
1.0000 + 2.0000i
>> C = str2num('1 +2i')
C =
1.0000 0 + 2.0000i
第二章 matlab 基础 计算机仿真与模拟
>> D = num2str(rand(2,2),5)
D =
0.95013 0.60684
0.23114 0.48598
>> whos
Name Size Bytes Class
A 2x2 32 double array
B 1x1 16 double array (complex)
C 1x2 32 double array (complex)
D 2x19 76 char array
S 2x3 12 char array
Grand total is 51 elements using 168 bytes
第二章 matlab 基础 计算机仿真与模拟在使用 str2num函数时需要注意如下几点:
● 被转换的字符串仅能包含数字,小数点,字符,e”或者,d”,数字的正号或者负号,以及复数虚部字符,i”或者
,j”,此外不可以包含其他字符 。
● 使用该字符转换函数时需要注意空格 。 例如在本例子中转换生成变量 B和 C时得到了不同的结果,主要原因是在变量 C中,字符,1”和字符,+2i”之间存在空格,而加号,+”和数字 2之间没有空格,所以转化的结果与生成变量 B时不同,
创建变量 B的时候,在数字 1,加号,+”和数字 2之间都存在空格 。
● 为了避免上述问题,可以使用 str2double函数,但是该函数仅能转换标量,不能转换矩阵或者数组 。
第二章 matlab 基础 计算机仿真与模拟例子 2-53 数制转换函数示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> a = 255;
>> h = dec2hex(a)
h =
FF
>> b = dec2bin(a)
b =
11111111
>> c = dec2base(a,5)
c =
2010
>> b(end) = '0';
>> bin2dec(b)
第二章 matlab 基础 计算机仿真与模拟
ans =
254
>> whos
Name Size Bytes Class
a 1x1 8 double array
ans 1x1 8 double array
b 1x8 16 char array
c 1x4 8 char array
h 1x2 4 char array
Grand total is 16 elements using 44 bytes
第二章 matlab 基础 计算机仿真与模拟在例子 2-53中,使用了部分数制转换的函数,其中比较特殊的一个是 dec2base函数,它和 base2dec函数类似,这两个函数的输入参数为两个,第二个参数表示相应的数制,比如在例子
2-53中调用的函数,是将十进制数据 a转变成为了五进制数据的字符串 。
注意需要注意各种数制转换函数的输入参数类型和输出参数类型,请仔细阅读 MATLAB的帮助文档和本书中的例子。
第二章 matlab 基础 计算机仿真与模拟
5 格式化输入输出和 C语言一致,MATLAB也能够进行格式化的输入、输出,
这是一种高级编程语言所必备的一种能力。 MATLAB继承了标准 C语言中用于 printf函数的格式化字符,也就是说,用于 C语言的格式化字符串都可以用于 MATLAB的格式化输出函数。在本小节将详细讲述 MATLAB的格式化输入、输出函数的使用方法。表 2-20中总结了可以应用在格式化输出函数的格式化字符。
第二章 matlab 基础 计算机仿真与模拟表 2-20 格式化字符字 符 说 明
%c 显示内容为单一的字符
%d 有符号的整数
%e 科学技术法,使用小写的字符 e
%E 科学技术法,使用大写的字符 E
%f 浮点数据
%g 不定,在 %e 或者 %f 之间选择一种形式
%G 不定,在 %E 或者 %f 之间选择一种形式
%o 八进制表示
%s 字符串
%u 无符号的整数
%x 十六进制表示,使用小写的字符
%X 十六进制表示,使用大写的字符第二章 matlab 基础 计算机仿真与模拟除了这些格式化字符外,MATLAB还支持那些在 C语言中就包含的特殊字符,例如回车符,制表符等,这里就不再赘述 。
在 MATLAB中,主要有两个函数用来进行格式化的输入和输出,这两个函数分别为 sscanf和 sprintf。
sscanf函数用来从字符串中获取数据,它的基本语法结构为
A = sscanf(s,format)
A = sscanf(s,format,size)
在 sscanf函数的参数中,s为包含数据的字符串,format是转换字符串数据的格式化字符串,而 size是需要转换的字符矩阵的大小。函数的使用方法参见下面的例子。
第二章 matlab 基础 计算机仿真与模拟例子 2-54 sscanf函数的例子。
在 MATLAB命令行窗口中,键入下面的指令:
>> S1 = '2.7183 3.1416';
>> S2 = '2.7183e3 3.1416e3';
>> S3 = '0 2 4 8 16 32 64 128';
>> A = sscanf(S1,'%f')
A =
2.7183
3.1416
>> B = sscanf(S2,'%e')
B =
1.0e+003 *
2.7183
3.1416
第二章 matlab 基础 计算机仿真与模拟
>> C = sscanf(S3,'%d')
C =
0
2
4
8
16
32
64
128
>> whos
第二章 matlab 基础 计算机仿真与模拟
Name Size Bytes Class
A 2x1 16 double array
B 2x1 16 double array
C 8x1 64 double array
S1 1x14 28 char array
S2 1x17 34 char array
S3 1x20 40 char array
Grand total is 63 elements using 198 bytes
第二章 matlab 基础 计算机仿真与模拟在使用 sscanf函数进行格式化的输入时,需要注意输入数据格式与格式化字符串之间的匹配,否则得到的结果可能不正确 。
格式化的输出函数是 sprintf函数,该函数的基本语法如下:
s = sprintf(format,A,.........)
其中,format是格式化字符串,A为输出的数据,而 s则是函数格式化得到的输出结果,熟悉 C语言的读者理解 sprintf函数应该没有任何问题。
第二章 matlab 基础 计算机仿真与模拟例子 2-55 sprintf函数的例子。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = 1/eps; B = -eps;
>> C = [ 65,66,67,pi];
>> D = [pi,65,66,67];
>> s1 = sprintf('%+15.5f',A)
s1 =
+4503599627370496.00000
>> s2 = sprintf('%+.5e',B)
s2 =
-2.22045e-016
>> s3 = sprintf('%s %f',C)
s3 =
ABC 3.141593
第二章 matlab 基础 计算机仿真与模拟
>> s4 = sprintf('%s %f %s',D)
s4 =
3.141593e+000 65.000000 BC
>> whos
Name Size Bytes Class
A 1x1 8 double array
B 1x1 8 double array
C 1x4 32 double array
D 1x4 32 double array
s1 1x23 46 char array
s2 1x13 26 char array
s3 1x12 24 char array
s4 1x26 52 char array
Grand total is 84 elements using 228 bytes
第二章 matlab 基础 计算机仿真与模拟从例子 2-54中可以看出,利用格式化字符串输出数据的时候有如下几点需要注意:
● 格式化字符串若包含了,+”,则表示在输出的字符串中包含数据的符号,如输出字符串 s1和 s2时的结果 。
● 对于整数数值进行格式化输出时,可以直接将向量转变成为字符串,例如字符串 s3的输出结果 。
● 如果输出的数据与相应的格式化字符串不匹配,则输出数值最常见的一种形式,如字符串 s4的输出结果。
第二章 matlab 基础 计算机仿真与模拟作为编程语言,必须能够和用户的输入进行交互,所以
MATLAB也提供了相应的函数用来完成获取用户输入数据的功能,这个函数就是 input函数,它的基本用法如下:
A = input(prompt);
A = input(prompt,'s')
其中,prompt为提示用的字符串,若具有第二个参数 s,则输入数据为字符串,否则为双精度数据,参见例子 3-26。
第二章 matlab 基础 计算机仿真与模拟例子 2-56 input函数的例子。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = input('随便输入数字,')
随便输入数字,123↙
A =
123
>> whos
Name Size Bytes Class
A 1x1 8 double array
Grand total is 1 element using 8 bytes
>> A = input('随便输入数字,','s')
第二章 matlab 基础 计算机仿真与模拟随便输入数字,123↙
A =
123
>> whos
Name Size Bytes Class
A 1x3 6 char array
Grand total is 3 elements using 6 bytes
注意比较两次输入得到的变量 A数据类型可以看出,在
input函数中,第二个参数若指定为 s的时候,则输入数据默认为字符串的格式。
第二章 matlab 基础 计算机仿真与模拟
2.2.5 元 胞 数 组
1 元胞数组的创建组成元胞数组的内容可以是任意类型的数据,所以创建元胞数组之前需要创建相应的数据 。 本小节结合具体的实例讲述创建元胞数组的方法和步骤 。
例子 2-57(a) 创建元胞数组 。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = {zeros(2,2,2),'Hello' ; 17.35,1:100}
A =
[2x2x2 double] 'Hello'
第二章 matlab 基础 计算机仿真与模拟
[ 17.3500] [1x100 double]
>> B = [{zeros(2,2,2)},{'Hello'};{17.35},{1:100}]
B =
[2x2x2 double] 'Hello'
[ 17.3500] [1x100 double]
>> C = {1}
C =
[1]
>> C(2,2) = {3}
C =
[1] []
[] [3]
>> isequal(A,B)
第二章 matlab 基础 计算机仿真与模拟
ans =
1
>> whos
Name Size Bytes Class
A 2x2 1122 cell array
B 2x2 1122 cell array
C 2x2 144 cell array
ans 1x1 1 logical array
Grand total is 243 elements using 2389 bytes
第二章 matlab 基础 计算机仿真与模拟创建元胞数组需要使用运算符花括号 ——“{}”,例如在创建数组 A的时候,使用花括号将不同类型和尺寸的数据组合在一起构成了一个元胞数组,在这个数组中有标量、多维数组、向量和字符串。注意创建数组 B时使用了不同的方法,该方法是将数组的每一个元素都使用花括号括起来,然后再用数组创建的符号方括号 ——“[]”将数组的元素括起来,这时创建的数组 B
和前面创建的数组 A完全一致,通过 isequal函数的运行就可以看出。还有一种创建元胞数组的方法,如创建数组 C时所用的方法,MATLAB能够自动扩展数组的尺寸,没有被明确赋值的元素作为空元胞数组存在。
第二章 matlab 基础 计算机仿真与模拟注意:
元胞数组占用的内存空间和元胞数组的内容相关,不同的元胞数组占用的内存空间不尽相同 。 另外,在显示元胞数组内容时,对于内容较多的元胞,显示的内容为元胞的数据类型和尺寸,例如显示数组 A时的三维数组和长度为 100的向量 。 另外仔细察看例子 2-57创建元胞数组的不同方法 。
一般的来说,构成元胞数组的数据类型可以是字符串、双精度数、稀疏矩阵、元胞数组、结构或其他 MATLAB数据类型。
每一个元胞数据也可以为标量、向量、矩阵,N维数组。
第二章 matlab 基础 计算机仿真与模拟例子 2-57(b) 创建元胞数组 。
在 MATLAB中还有一个函数 ——cell可以用来创建元胞数组,
本例子将使用这个函数创建元胞数组 。 在 MATLAB命令行窗口中,键入下面的指令:
>> A = cell(1)
A =
{[ ]}
>> B = cell(3,2)
B =
[ ] [ ]
[ ] [ ]
第二章 matlab 基础 计算机仿真与模拟
[ ] [ ]
>> C = cell(2,2,2)
C(:,:,1) =
[ ] [ ]
[ ] [ ]
C(:,:,2) =
[ ] [ ]
[ ] [ ]
>> whos
Name Size Bytes Class
A 1x1 4 cell array
B 3x2 24 cell array
C 2x2x2 32 cell array
Grand total is 15 elements using 60 bytes
第二章 matlab 基础 计算机仿真与模拟
cell函数的作用是用来创建空元胞数组,该函数可以创建一维,二维或者多维元胞数组,但是创建的数组都为空元胞 。
这里需要注意区别空数组和空元胞之间内存占用的区别,从例子 2-57(b)可以看出,元胞数组的每个空元胞占用四个字节的内存空间 。
注意:
使用 cell函数创建空元胞数组的主要目的是为数组预先分配连续的存储空间,节约内存的占用,提高程序执行的效率。
有关空元胞数组的元胞赋值将在第 2小节中讲述。
第二章 matlab 基础 计算机仿真与模拟
2 元胞数组的基本操作所谓元胞数组的基本操作主要包括对元胞数组元胞和元胞数据的访问、修改,元胞数组的扩展、收缩或者重组。和操作一般的数值数组类似,操作数值数组的函数也可以应用在元胞数组上。本小节将结合具体的示例讲述元胞数组的基本操作。
第二章 matlab 基础 计算机仿真与模拟例子 2-58(a) 元胞数组的访问。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = {zeros(2,2,2),'Hello' ; 17.35,1:10};
>> B = A(1,2)
B =
'Hello'
>> class(B)
ans =
cell
>> whos
Name Size Bytes Class
A 2x2 402 cell array
B 1x1 70 cell array
ans 1x4 8 char array
Grand total is 38 elements using 480 bytes
第二章 matlab 基础 计算机仿真与模拟例子 2-58(b) 元胞元素的访问。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = {zeros(2,2,2),'Hello' ; 17.35,1:10};
>> C = A{1,2}
C =
Hello
>> class C
ans =
char
>> whos
Name Size Bytes Class
A 2x2 402 cell array
C 1x5 10 char array
ans 1x4 8 char array
Grand total is 37 elements using 420 bytes
第二章 matlab 基础 计算机仿真与模拟在例子 2-58(b)中,使用花括号,{}”可以直接获取元胞数组的元胞内容,和例子 2-58(a)比较,变量 B的类型为元胞,但是变量 C的类型为字符串,这就是访问元胞数组的两种操作符 ——“{}”和,()”之间的不同之处。
第二章 matlab 基础 计算机仿真与模拟例子 2-58(c) 元胞元素的访问 。
若需要访问元胞元素内部的成员,则需要将,{}”运算符和
,()”结合起来使用 。 在 MATLAB命令行窗口中,键入下面的指令:
>> A = {zeros(2,2,2),'Hello' ; 17.35,1:10};
>> D = A{1,2}(4)
D =
l
>> E = A{2,2}(5:end)
E =
5 6 7 8 9 10
>> class(E)
ans =
double
第二章 matlab 基础 计算机仿真与模拟
>> F = A{4}([1 3 5])
F =
1 3 5
>> whos
Name Size Bytes Class
A 2x2 402 cell array
D 1x1 2 char array
E 1x6 48 double array
F 1x3 24 double array
ans 1x6 12 char array
Grand total is 44 elements using 488 bytes
第二章 matlab 基础 计算机仿真与模拟将不同的括号 ——花括号,圆括号和方括号结合起来可以访问元胞元素的内部成员 。 特别是在例子 2-58(c)中,创建变量 F
的时候使用了三种括号访问了向量的元素 。
元胞数组的扩充、收缩和重组的方法和数值数组大体相同,
见下面的例子。
例子 2-59(a) 元胞数组的扩充。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = {zeros(2,2,2),'Hello' ; 17.35,1:10};
>> B = cell(2,2);
>> B(:,1) = {char('Hello','Welcome'); 10,-1:5}
B =
[2x7 char ] []
[1x6 double] []
>> C = [ A,B]
第二章 matlab 基础 计算机仿真与模拟
C =
[2x2x2 double] 'Hello' [2x7 char ] [ ]
[ 17.3500] [1x10 double] [1x6 double] [ ]
>> D = [ A,B ; C]
D =
[2x2x2 double] 'Hello' [2x7 char ] [ ]
[ 17.3500] [1x10 double] [1x6 double] [ ]
[2x2x2 double] 'Hello' [2x7 char ] [ ]
[ 17.3500] [1x10 double] [1x6 double] [ ]
>> whos
Name Size Bytes Class
A 2x2 402 cell array
B 2x2 204 cell array
C 2x4 606 cell array
D 4x4 1212 cell array
Grand total is 208 elements using 2424 bytes
第二章 matlab 基础 计算机仿真与模拟例子 2-59(b) 元胞数组的收缩和重组。
接上例,在 MATLAB命令行窗口中,键入下面的指令:
>> D(2,:) = []
D =
[2x2x2 double] 'Hello' [2x7 char ] [ ]
[2x2x2 double] 'Hello' [2x7 char ] [ ]
[ 17.3500] [1x10 double] [1x6 double] [ ]
>> E = reshape(D,2,2,3)
E(:,:,1) =
[2x2x2 double] [17.3500]
[2x2x2 double] 'Hello'
第二章 matlab 基础 计算机仿真与模拟
E(:,:,2) =
'Hello' [2x7 char]
[1x10 double] [2x7 char]
E(:,:,3) =
[1x6 double] [ ]
[ ] [ ]
>> whos
Name Size Bytes Class
A 2x2 402 cell array
B 2x2 204 cell array
C 2x4 606 cell array
D 3x4 892 cell array
E 2x2x3 892 cell array
Grand total is 270 elements using 2996 bytes
第二章 matlab 基础 计算机仿真与模拟
3 元胞数组的操作函数表 2-21 元胞数组的操作函数函 数 说 明
cell 创建空的元胞数组
cellfun 为元胞数组的每个元胞执行指定的函数
celldisp 显示所有元胞的内容
cellplot 利用图形方式显示元胞数组
cell2m at 将元胞数组转变成为普通的矩阵
ma t2cell 将数值矩阵转变成为元胞数组
num2c ell 将数值数组转变成为元胞数组
deal 将输入参数赋值给输出
cell2struct 将元胞数组转变成为结构
struct2cell 将结构转变成为元胞数组
iscell 判断输入是否为元胞数组第二章 matlab 基础 计算机仿真与模拟例子 2-60 cellfun函数示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = {rand(2,2,2),'Hello',pi; 17,1+i,magic(5)}
A =
[2x2x2 double] 'Hello' [ 3.1416]
[ 17] [1.0000+ 1.0000i] [5x5 double]
>> B = cellfun('isreal',A)
B =
1 1 1
1 0 1
第二章 matlab 基础 计算机仿真与模拟
>> C = cellfun('length',A)
C =
2 5 1
1 1 5
>> D = cellfun('isclass',A,'double')
D =
1 0 1
1 1 1
>> whos
Name Size Bytes Class
A 2x3 666 cell array
B 2x3 6 logical array
C 2x3 48 double array
D 2x3 6 logical array
Grand total is 65 elements using 726 bytes
第二章 matlab 基础 计算机仿真与模拟表 2-32 在 cellfun函数中可用的函数函 数 说 明
isempty 若元胞元素为空,则返回逻辑真
isl ogical 若元胞元素为逻辑类型,则返回逻辑真
isreal 若元胞元素为实数,则返回逻辑真
length 元胞元素的长度
ndims 元胞元素的维数
prodofsi ze 元胞元素包含的元素个数第二章 matlab 基础 计算机仿真与模拟此外,cellfun函数还有以下两种用法:
● cellfun('size',C,k)用来获取元胞数组元素第 k维的尺寸。
● cellfun('isclass',C,classname)用来判断元胞数组的数据类型。
第二章 matlab 基础 计算机仿真与模拟例子 2-61 显示元胞数组的内容。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = {rand(2,2,2),'Hello',pi;17,1+i,magic(5)}
A =
[2x2x2 double] 'Hello' [ 3.1416]
[ 17] [1.0000+ 1.0000i] [5x5 double]
>> celldisp(A)
A{1,1} =
(:,:,1) =
0.9355 0.4103
0.9169 0.8936
第二章 matlab 基础 计算机仿真与模拟
(:,:,2) =
0.0579 0.8132
0.3529 0.0099
A{2,1} =
17
A{1,2} =
Hello
A{2,2} =
1.0000 + 1.0000i
A{1,3} =
3.1416
第二章 matlab 基础 计算机仿真与模拟
A{2,3} =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
>> cellplot(A)
cellplot函数的运行结果如图 2-8所示。
第二章 matlab 基础 计算机仿真与模拟图 2-8 cellplot函数的运行结果第二章 matlab 基础 计算机仿真与模拟
2.2.6 结 构和 C语言类似,MATLAB也具有结构类型的数据 。 结构
(struct)是包含一组记录 (records)的数据类型,而记录则存储在相应的字段 (fields)中 。 和元胞数组类似,结构的字段可以是任意一种 MATLAB数据类型的变量或者对象 。 结构类型的变量也可以是一维的,二维的或者多维的数组 。 不过,在访问结构类型数据的元素时,需要使用下标配合字段的形式 。
在 MATLAB中,结构和元胞数组有诸多类似之处,在表 2-
23中进行了比较。
第二章 matlab 基础 计算机仿真与模拟表 2-23 元胞数组和结构数组的异同不同的数组对象内容元胞数组对象 结构数组对象基本元素 元胞 (c e ll) 结构 (str uc t)
基本索引 全下标方式、单下标方式 全下标方式、单下标方式可包含的数据类型 任何数据类型 任何数据类型数据的存储 元胞 (c e ll) 字段 (fi e ld )
访问元素的方法 花括号和索引 圆括号、索引和字段名第二章 matlab 基础 计算机仿真与模拟
1 结构的创建创建结构数组对象可以使用两种方法,一种是直接赋值的方法,另外一种方法是利用 struct函数创建 。 这里结合具体的操作示例讲解创建结构的方法 。
例子 3-32(a) 直接赋值法创建结构 。
在 MATLAB命令行窗口中,键入下面的指令:
>> Student.name = 'Way';
>> Student.age = 26;
>> Student.grade = uint16(1);
>> whos
Name Size Bytes Class
第二章 matlab 基础 计算机仿真与模拟
Student 1x1 388 struct array
Grand total is 8 elements using 388 bytes
>> Student
Student =
name,'Way'
age,26
grade,1
第二章 matlab 基础 计算机仿真与模拟在例子 2-62(a)中,创建了具有一个记录的 Student结构数组,
该数组具有一个元素 (记录 ),结构同时具有三个字段,分别为姓名 (name),年龄 (age)和级别 (grade),这三个字段分别包含了字符串,双精度和无符号整数数据类型 。
创建结构的时候,直接用结构的名称 (如例子 2-62(a)中的
Student),配合操作符,.”和相应字段的名称完成创建,创建是直接给字段赋具体的数值。
第二章 matlab 基础 计算机仿真与模拟例子 2-62(b) 直接赋值法创建结构数组。
接例子 3-32(a),在 MATLAB命令行窗口中,键入下面的指令:
>> Student(3).name = 'Deni';
>> Student(3).grade = 2;
>> whos
Name Size Bytes Class
Student 1x3 540 struct array
Grand total is 19 elements using 540 bytes
>> Student(2)
ans =
name,[ ]
age,[ ]
grade,[ ]
>> Student(3).age
ans =
[ ]
第二章 matlab 基础 计算机仿真与模拟例子 2-63 利用函数 struct创建结构 。
在 MATLAB命令行窗口中,键入下面的指令:
>> Student = struct('name','Way','age',26,'grade',uint16(1))
Student =
name,'Way'
age,26
grade,1
>> whos
Name Size Bytes Class
Student 1x1 388 struct array
Grand total is 8 elements using 388 bytes
第二章 matlab 基础 计算机仿真与模拟
>> Student = struct('name',{'Deni','Sherry'},'age',{22,24},'grade',
{2,3})
Student =
1x2 struct array with fields:
name
age
grade
>> whos
Name Size Bytes Class
Student 1x2 604 struct array
Grand total is 20 elements using 604 bytes
>> Student = struct('name',{},'age',{},'grade',{})
第二章 matlab 基础 计算机仿真与模拟
Student =
0x0 struct array with fields:
name
age
grade
>> whos
Name Size Bytes Class
Student 0x0 192 struct array
Grand total is 0 elements using 192 bytes
>> Student = repmat(struct('name','Way',' age',26,'grade',1),1,3)
Student =
第二章 matlab 基础 计算机仿真与模拟
1x3 struct array with fields:
name
age
grade
>> Student(3)
ans =
name,'Way'
age,26
grade,1
第二章 matlab 基础 计算机仿真与模拟在例子 2-63中讲述了使用 struct函数创建结构的方法 。 struct
函数的基本语法为
struct_name = struct(field1,val1,field2,val2,......)
struct_name = struct(field1,{val1},filed2,{val2},......)
其中,这两种创建结构的方法在例子 2-63中均有体现,而且利用 struct函数还可以创建空结构数组。例子 2-63最后使用了
repmat函数,将结构制作了复本,从而创建了 1× 3结构数组。
第二章 matlab 基础 计算机仿真与模拟
2 结构的基本操作对于结构的基本操作其实是对结构数组元素包含的记录的操作 。 主要有结构记录数据的访问,字段的增加和删除等 。 本小节结合具体的例子讲述有关结构操作的基本方法 。
访问结构数组元素包含的记录的方法非常简单,直接使用结构数组的名称和字段的名称以及操作符,,”完成相应的操作 。
不过,在访问结构数组的元素时可以使用所谓的,动态,字段的形式,其基本语法结构是
struct_name.(expression)
其中,expression是代表字段的表达式,可以是字段名称的字符串。利用动态字段形式访问结构数组元素,便于利用函数完成对结构字段数据的重复操作。
第二章 matlab 基础 计算机仿真与模拟例子 2-64 结构字段数据的访问 。
在 MATLAB命令行窗口中,键入下面的指令:
>> Student = struct('name',{'Deni','Sherry'},'age',{22,24},'grade',{2,3},...
'score',{rand(3)*10,randn(3)*10});
>> %察看结构字段
>> Student
Student =
1x2 struct array with fields:
name
age
grade
score
第二章 matlab 基础 计算机仿真与模拟
>> %访问结构记录的数据
>> Student(2).score
ans =
4.3256 2.8768 11.8916
16.6558?11.4647?0.3763
1.2533 11.9092 3.2729
>> %访问结构记录的一部分数据
>> Student(1).score(1,:)
ans =
9.5013 4.8598 4.5647
>> %访问结构某一字段的所有数据
>> Student.name
第二章 matlab 基础 计算机仿真与模拟
ans =
Deni
ans =
Sherry
>> %使用动态字段形式访问数据
>> Student.('name')
ans =
Deni
ans =
Sherry
第二章 matlab 基础 计算机仿真与模拟在例子 2-64中使用了各种访问结构记录数据的方法,特别是在例子的最后,使用动态字段的形式访问了字段记录的数据 。
利用这种形式可以通过编写函数对结构记录的数据进行统一的运算操作 。
结构是管理数据的一种方式,在使用结构的时候,可以直接通过字段名称来访问数据,参见例子 2-65。
第二章 matlab 基础 计算机仿真与模拟例子 2-65 对结构字段数据进行运算。
接例子 2-64,在 MATLAB命令行窗口中键入下面的指令:
>> mean(Student(1).score)
ans =
5.9604 7.1313 4.3213
>> mean(Student.score)
Error using ==> sum
Dimension argument must be a positive integer scalar.
Error in ==> I:\MATLAB6p5\toolbox\matlab\datafun\mean.m
On line 28 ==> y = sum(x,dim)/size(x,dim);
>> mean([Student.score])
ans =
5.9604 7.1313 4.3213 -6.5761 1.1071 4.9294
第二章 matlab 基础 计算机仿真与模拟
mean函数为 MATLAB内建的数学函数之一,用来求解列向量的平均值 。
在例子 2-65中,首先对结构数组第一个元素的字段 score代表的数据求平均值,其实该操作和使用 MATLAB普通的变量没有什么区别 。 然后后面的操作就专属于结构了 。 注意,最后的操作相当于对结构数组的某一个字段所有的数据进行同一种操作,不过,这个时候需要使用,[]”符号将字段包含起来,否则会出现错误提示 。
如前文所述,MATLAB结构数组的字段可以包含任何一种数据,自然也可以包含结构。当结构的字段记录了结构时,则称其为内嵌 (nest)的结构。创建内嵌结构可以使用直接赋值的方法,同样也可以使用 struct函数完成。
第二章 matlab 基础 计算机仿真与模拟例子 2-66 内嵌的结构。
>> Student = struct('name',{'Deni','Sherry'},'age',{22,24},'grade',{2,3},...
'score',{rand(3)*10,randn(3)*10});
>> Class.number = 1;
>> Class.Student = Student;
>> whos
Name Size Bytes Class
Class 1x1 1188 struct array
Student 1x2 932 struct array
Grand total is 83 elements using 2120 bytes
第二章 matlab 基础 计算机仿真与模拟
>> Class
Class =
number,1
Student,[1x2 struct]
>> %使用 struct函数创建内嵌的结构
>> Class = struct('number',1,'Student',struct('name',{'Way','Deni'}))
Class =
number,1
Student,[1x2 struct]
第二章 matlab 基础 计算机仿真与模拟
3 结构操作函数和其他的各种数据类似,MATLAB也提供了部分函数用于针对结构的操作,在表 2-24中将这些函数进行了总结。
第二章 matlab 基础 计算机仿真与模拟表 2-24 结构操作函数函 数 说 明
struct 创建结构或将其他数据类型转变成结构
fieldnam es 获取结构的字段名称
getfield 获取结构字段的数据
setfield 设置结构字段的数据
rmfield 删除结构的指定字段
isfi eld 判断给定的字符串是否为结构的字段名称
iss truct 判断给定的数据对象是否为结构类型
oderfields 将结构字段排序第二章 matlab 基础 计算机仿真与模拟例子 2-67 结构操作函数的使用示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> S.name = 'Deni';S.ID = 0;
>> S(2,2).name = 'Way';S(2,2).ID = 1;
>> S2 = setfield(S,{2,1},'name','Sherry');
>> S.name
ans =
Deni
ans =
[ ]
ans =
[ ]
ans =
Way
>> S2.name
ans =
Deni
第二章 matlab 基础 计算机仿真与模拟
ans =
Sherry
ans =
[ ]
ans =
Way
>> fieldnames(S)
ans =
'name'
'ID'
>> S3 = orderfields(S)
S3 =
2x2 struct array with fields:
ID
name
第二章 matlab 基础 计算机仿真与模拟在例子 2-67中,主要讲述了 setfield,fieldnames和 orderfields
函数的使用 。 setfield函数是为结构字段进行赋值的函数,对应的可以使用 getfield函数获取结构字段的数值 。 利用 setfiled函数和 struct函数可以有效地创建结构数组 。 fieldnames函数用来获取结构中的字段名称,由字段的名称组成元胞数组,其中元胞就是字段名称字符串 。 orderfileds函数是用来将字段进行排序的,
该函数能够将结构的字段按照字符序号排列 。 例如在例子 2-67
中,orderfileds函数就将字段 ID和 name进行了排序,该函数不会修改结构中包含的内容 。
第二章 matlab 基础 计算机仿真与模拟例子 2-68 结构操作函数的使用示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> S.name = 'Deni';S.ID = 0;
>> S(2).name = 'Way';S(2).ID = 1;
>> C = struct2cell(S)
C(:,:,1) =
'Deni'
[ 0]
C(:,:,2) =
'Way'
[ 1]
>> C = squeeze(C)
C =
'Deni' 'Way'
第二章 matlab 基础 计算机仿真与模拟
[ 0] [ 1]
>> fields = {'Name','ID'};
>> S2 = cell2struct(C',fields,2)
S2 =
2x1 struct array with fields:
Name
ID
>> whos
Name Size Bytes Class
C 2x2 270 cell array
S 1x2 398 struct array
S2 2x1 398 struct array
fields 1x2 132 cell array
Grand total is 47 elements using 1198 bytes
第二章 matlab 基础 计算机仿真与模拟例子 2-68主要演示了 cell2struct函数和 struct2cell函数的使用方法。从表现形式、用途以及保存的数据类型等方面看,结构和元胞非常的类似,因此 MATLAB提供了将这两种数据类型进行相互转换的函数。在将元胞数组转换为结构的时候需要指定结构的字段名称。函数 squeeze是用来删除多维数组中维数为 1
的那一维的函数。
第二章 matlab 基础 计算机仿真与模拟例子 2-69 结构操作函数的使用示例。
>> clear all
>> X = 3;
>> [y1,y2,y3] = deal(X)
y1 =
3
y2 =
3
y3 =
3
>> X = {rand(3),'2',1};
>> [y1,y2,y3] = deal(X{:})
第二章 matlab 基础 计算机仿真与模拟
y1 =
0.8462 0.6721 0.6813
0.5252 0.8381 0.3795
0.2026 0.0196 0.8318
y2 =
2
y3 =
1
>> X,num = rand(3);X.str = '2'; X.ID = 1;
>> X(2).num = rand(3);X(2).str = '3'; X(2).ID = 2;
>> [y1,y2] = deal(X(:).num)
第二章 matlab 基础 计算机仿真与模拟
y1 =
0.5028 0.3046 0.6822
0.7095 0.1897 0.3028
0.4289 0.1934 0.5417
y2 =
0.1509 0.8600 0.4966
0.6979 0.8537 0.8998
0.3784 0.5936 0.8216
第二章 matlab 基础 计算机仿真与模拟例子 2-69主要演示了函数 deal的使用方法。 deal函数的主要作用是进行数据的复制。该函数不仅能够操作一般的数值类型数据,还可以处理结构或者元胞。在例子 2-69中,deal函数处理了标量、元胞和结构。在 deal函数处理标量的时候,函数将标量的数值依次赋值给函数的输出,所以第一次使用 deal函数的时候 y1,y2和 y3都被赋值为数值 3。不过在处理元胞或者结构的时候,该函数执行的效果则不同。它能够将元胞数组中的元胞或者结构中的某个字段的数据依次赋值给相应的输出,
所以利用该函数可以非常方便地将结构或者元胞中的实际数据解析 (分离 )出来,例如在例子 2-69中所完成的操作。