matlab x7 7什么意思啊,MATLAB基础教程第七章

MATLAB基础教程第七章

郑碧波翻译 Matlab 中文论坛首发 http:/www.iLoveM 第七章 稀疏矩阵 单元阵列 结构.3 7.1 稀疏矩阵.3 7.1.1 sparse 数据类型.4 例 7.1.6 7.2 单元阵列(cell array).8 7.2.1 创建单元阵列.9 7.2.2 单元创建者大括号()的应用 .10 7.2.3 查看单元阵列的内容.10 7.2.4 对单元阵列进行扩展.11 7.2.5 删除阵列中的元素.12 7.2.6 单元阵列数据的应用.12 7.2.7 字符串单元阵列.12 7.2.8 单元阵列的重要性.13 7.2.9 单元阵列函数总结.16 7.3 结构数组.16 7.3.2 增加域到结构.17 7.3.3 删除结构中的域.18 7.3.4 结构数组中数组的应用.18 7.3.5 函数 getfield 和函数 setfield.20 7.3.6 对结构数组应用 size 函数.20 7.3.8 struct 函数总结.21 测试 7.1.21 7.4 总结.22 7.4.1 好的编程习惯总结.22 7.4.2 MATLAB 函数命令总结 .22 7.5 练习.23 7.1.23 7.2.23 7.3.23 7.4.23 7.5.24 7.6.24 郑碧波翻译 Matlab 中文论坛首发 http:/www.iLoveM 第七章第七章 稀疏矩阵稀疏矩阵 单元阵列单元阵列 结构结构 在本章中我们要学习三种数据类型:稀疏矩阵,单元阵列和结构。稀疏矩阵是矩阵的一 种特殊形式,在这个矩阵中只对非零元素分配内存。单元阵列也是一种矩阵,它的每一个元 素可以是 MATLAB 任何一种数据类型。它们广泛应用于 MATLAB 用户图象界面(GUI) 函数。最后,结构提供了一种在单个变量中存储了不同类型的数据的方法,在这个变量中的 每一个数据项目都有一个独立的名字。 7.1 稀疏矩阵稀疏矩阵 我们在第二章中已经学过了普通的 MATLAB 数组。当一个普通的数组被声明后, MATLAB 将会为每一个数组元素分配内存。例如函数 a = eye(10)要创建了 100 个元素,按 1010 的结构分配,对角线上的元素均为 1,其余的元素为 0。注意这些数组其中的 90 个元 素为 0。这个包含有一百个元素的矩阵,只有 10 个元素包含非零值。这是稀疏矩阵或稀疏 数组的一个例子。稀疏矩阵是指一个很大的矩阵,且大多数的元素为 0。 a=2*eye(10) a = 2 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 2 现在假如我们要创建一个 1010 的矩阵,定义如下 b = 1 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 若 a,b 两矩阵相乘得到的结果为 c = a * b c = 2 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 2 0 0 郑碧波翻译 Matlab 中文论坛首发 http:/www.iLoveM 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 2 这两个稀疏矩阵相乘需要 1900 次相加和相乘,但是在大多数时侯相加和相乘的结果为 0,所以我们做了许多的无用功。这个问题会随着矩阵大小的增大而变得非常的严重。例如, 假设我们要产生两个 200200 的稀疏矩阵,如下所示 a = 5 * eye(200); b = 3 * eye(200); 每一个矩阵有 20000 个元素,其中 19800 个元素是 0。进一步说,对这两个矩阵相乘需 要 7980000 次加法和乘法。 我们可以看出对大规模稀疏矩阵进行存储和运算 (其中大部分为 0) 是对内存空间和 cpu 资源的极大浪费。不巧的是,在现实中的许多问题都需要稀疏矩阵,我们需要一些有效的方 示来解决这个问题。 大规模供电系统是现实世界中涉及到稀疏矩阵一个极好的例子。 大规模供电系统可以包 括上千条或更多的母线,用来产生,传输,分配电能到子电站。如果我们想知道这个系统的 电压,电流和功率,我们必须首先知道每一条母线的电压。如果这个系统含有一千个母线, 这就要用到含有 1000 个未知数的联立方程组,包括一个方程,也就是说我们要创建含有 1000000 个元素的矩阵。解出这个矩阵,需要上百万次的浮点运算。 但是,在这个系统中,一条母线平均只它的三条母线相连,而在这个矩阵中每一行其他 的 996 个元素将为 0,所以在这个矩阵的加法和乘法运算中将会产生 0。如果在求解的过程 中这些 0 可以忽略,那么这个电力系统的电压和电流计算将变得简单而高效。 7.1.1 sparse 数据类型数据类型 在 MATLAB 中有一个专门的数据类型,用来对稀疏进行运算。sparse 数据类型不同于 doulbe 数据,它在内存中只存储非零元素。实际上,sparse 数据类型只存储每一个非零元素 的三个值:元素值,元素的行号和列号。尽管非零元素这三个值必须存储在这内存,但相对 于存储稀疏矩阵的所有元素来说要简单高效得多。 我们用 1010 的方阵来说明稀疏矩阵的应用。 a = eye(10) a = 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 如果这个矩阵被转化为稀疏矩阵,它的结果是 as = sparse(a) as = (1,1) 1 (2,2) 1 (3,3) 1 (4,4) 1 (5,5) 1 (6,6) 1 (7,7) 1 郑碧波翻译 Matlab 中文论坛首发 http:/www.iLoveM (8,8) 1 (9,9) 1 (10,10) 1 注意在稀疏矩阵存储的是行列地址和这一点所对应的非零数据值。 只要一个矩阵的大部 分数都是 0,这种方法用来存储数据就是高效的,但是如果非零元素很多的话,那么用占用 更多的空间,因为稀疏矩阵需要存储蓄地址。函数 issparse 通常用作检测一个矩阵是否为稀 疏矩阵。如果这个矩阵是稀疏的,那么这个函数将会返回 1。 稀疏矩阵的优点可以通过下面的描述体现出来,考虑一个 10001000 的矩阵平均每一 行只有 4 个非零元素。如果这个矩阵以全矩阵的形式储存,那么它要战胜 8000000 个字节。 从另一方面说,如果它转化为一个稀疏矩阵,那么内存的使用将会迅速下降。 7.1.1.1 产生稀疏矩阵产生稀疏矩阵 MATLAB 可以通过 sparse 函数把一个全矩阵转化为一个稀疏矩阵, 也可以用 MATLAB 函数 speye, sprand 和 sprandn 直接产生稀疏矩阵, 它们对应的全矩阵为 eye, rand, 和 randn。 例如,表达式 a = speye(4)将产生一个 44 的稀疏矩阵。 a = speye(4) a = (1,1) 1 (2,2) 1 (3,3) 1 (4,4) 1 表达式 b = full(a)把稀疏矩阵转化相应的全矩阵。 b = full(a) b = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 7.1.1.2 稀疏矩阵的运算稀疏矩阵的运算 如果一个矩阵是稀疏的, 那么单个元素可以通过简单的赋值语句添加或删除, 例如下面 的语句产生一个 44 的稀疏矩阵,然后把其他的非零元素加入其中。 a = speye(4) a = (1,1) 1 (2,2) 1 (3,3) 1 (4,4) 1 a(2,1) = -2 a = (1,1) 1 (2,1) -2 (2,2) 1 (3,3) 1 (4,4) 1 MATLAB 允许全矩阵与稀疏的混合运算。它们产生的结果可以是全矩阵也可以是稀疏 矩阵,这取决于那种结果更高效。更重要的是,任何的适用全矩阵算法同样地也适合稀疏矩 阵。 郑碧波翻译 Matlab 中文论坛首发 http:/www.iLoveM 表 7.1 列出的是一些普通的稀疏矩阵。 表 7.1 普通的 MATLAB 稀疏矩阵函数 类别 函数 描述 speye 创建一个单位稀疏矩阵 sprand 创建一个稀疏矩阵,元素是符合平均分布的随机数 创建一个稀 疏矩阵 sprandn 创建一个稀疏矩阵,元素是普通的随机数 sparse 把一个全矩阵转化为一个稀疏矩阵 full 把一个稀疏矩阵转化为全矩阵 全矩阵和稀 疏矩阵的转 换函数 find 找出矩阵中非零元素和它对应的上下标 nnz 非零元素的个数 nonzeros 返回一个向量,其中的元素为矩阵中非零元素 spones 用 1 代替矩阵中的非零元素 spalloc 一个稀疏矩阵所占的内存空间 issparse 如果是稀疏矩阵就返回 1 spfun 给矩阵中的非零元素提供函数 对稀疏矩阵 进行操作的 函数 spy 用图象显示稀疏矩阵 例例 7.1 用稀疏矩阵解决联立方程组 为了解说明稀疏矩阵在 MATLAB 中应用, 我们将用全矩阵和稀疏矩阵来解决下面的联 立方程组。 1.0 x1 + 0.0 x2 + 1.0 x3 + 0.0 x4 + 0.0 x5 + 2.0 x6 + 0.0 x7 - 1.0 x8 = 3.0 0.0 x1 + 1.0 x2 + 0.0 x3 + 0.4x4 + 0.0 x5 + 0.0 x6 + 0.0 x7 + 0.0 x8 = 2.0 0.5x1 + 0.0 x2 + 2.0 x3 + 0.0 x4 + 0.0 x5 + 0.0 x6 - 1.0 x7 + 0.0 x8 = -1.5 0.0 x1 + 0.0 x2 + 0.0 x3 + 2.0 x4 + 0.0 x5 + 1.0 x6 + 0.0 x7 + 0.0 x8 = 1.0 0.0 x1 + 0.0 x2 + 1.0 x3 + 1.0 x4 + 1.0 x5 + 0.0 x6 + 0.0 x7 + 0.0 x8 = -2.0 0.0 x1 + 0.0 x2 + 0.0 x3 + 1.0 x4 + 0.0 x5 + 1.0 x6 + 0.0 x7 + 0.0 x8 = 1.0 0.5x1 + 0.0 x2 + 0.0 x3 + 0.0 x4 + 0.0 x5 + 0.0 x6 + 1.0 x7 + 0.0 x8 = 1.0 0.0 x1 + 1.0 x2 + 0.0 x3 + 0.0 x4 + 0.0 x5 + 0.0 x6 + 0.0 x7 + 1.0 x8 = 1.0 答案 为了解决这一问题, 我们将创建一个方程系数的全矩阵, 并用 sparse 函数把他转化为稀 疏矩阵。我们用两种方法解这个方程组,比较它们的结果和所需的内存。 代码如下: % Script file: simul.m % % Purpose: % This program solves a system of 8 linear equations in 8 % unknowns (a*x = b), using both full and sparse matrices. % % Record of revisions: % Date Programmer Description of change % = = = % 10/14/98 S. J. Chapman Original code % % Define variables: % a -Coefficients of x (full matrix) % as -Coefficients of x (sparse matrix) % b -Constant coefficients (full matrix) % bs -Constant coefficients (sparse matrix) % x -Solution (full matrix) 郑碧波翻译 Matlab 中文论坛首发 http:/www.iLoveM % xs -Solution (sparse matrix) % Define coefficients of the equation a*x = b for % the full matrix solution. a = 1.0 0.0 1.0 0.0 0.0 2.0 0.0 -1.0; . 0.0 1.0 0.0 0.4 0.0 0.0 0.0 0.0; . 0.5 0.0 2.0 0.0 0.0 0.0 -1.0 0.0; . 0.0 0.0 0.0 2.0 0.0 1.0 0.0 0.0; . 0.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0; . 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0; . 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.0; . 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 ; b = 3.0 2.0 -1.5 1.0 -2.0 1.0 1.0 1.0; % Define coefficients of the equation a*x = b for % the sparse matrix solution. as = sparse(a); bs = sparse(b); % Solve the system both ways disp (Full matrix solution:); x = ab disp (Sparse matrix solution:); xs = asbs % Show workspace disp(Workspace contents after the solutions:) whos 运行这个程序,结果如下 simul Full matrix solution: x = 0.5000 2.0000 -0.5000 -0.0000 -1.5000 1.0000 0.7500 -1.0000 Sparse matrix solution: xs = (1,1) 0.5000 (2,1) 2.0000 (3,1) -0.5000 (5,1) -1.5000 (6,1) 1.0000 (7,1) 0.7500 (8,1) -1.0000 Workspace contents after the solutions: Name Size Bytes Class a 8x8 512 double array as 8x8 276 double array (sparse) b 8x1 64 double array bs 8x1 104 double array (sparse) x 8x1 64 double array xs 8x1 92 double array (sparse) Grand total is 115 elements using 1112 bytes 郑碧波翻译 Matlab 中文论坛首发 http:/www.iLoveM 两种算法得到了相同的答案。注意用稀疏矩阵产生的结果不包含 x4,因为它的值为 0。 注意 b 的稀疏形式占的内存空间比全矩阵形式还要大。 这种情况是因为稀疏矩阵除了元素值 之外必须存储它的行号和列号, 所以当一个矩阵的大部分元素都是非零元素, 用稀疏矩阵将 降低运算效率。 7.2 单元阵列单元阵列(cell array) 单元阵列是 MATLAB 中特殊一种数组,它的元素被称为单元(cells),它可以存储其它 类型的 MATLAB 数组。例如,一个单元阵列的一个单元可能包含一个实数数组或字符型数 组,还可能是复数组(图 7.1 所示)。 在一个编程项目中,一个单元阵列的每一个元素都是一个指针,指向其他的数据结构, 而这些数据结构可以是不同的数据类型。 单元阵列为选择问题信息提供极好的方示, 因为所 有信息都聚集在一起, 并可以通边一单个名字访问。 单元阵列用大括号替代小括号来选择 和显示单元的内容。 这个不同是由于单元的内容用数据结构代替了内容。 假设一单元阵列如 图 7.2 所示。元素 a(1,1)是数据结构 33 的数字数组。a(1,1)的含义为显示这个单元的内 容,它是一个数据结构。 图 7.1 一个单元阵列的一个单元可能包含一个实数数组或字符型数组,还可能是复数组 图 7.2 单元阵列中的每一个元素都是指向其他数据结构的指针, 指向的数据结构可能都不相 同 a(1,1) ans = cell 1,1 1 3 -7 2 06 0 51 cell 1,2 This is a string cell 2,1 3+i4-5 -i10 3-i4 cell 2,2 1 3 -7 2 06 0 51 a(1,1) a(1,2) a(2,2) a(2,1) This is a text string. 3+i4-5 -i10 3-i4 郑碧波翻译 Matlab 中文论坛首发 http:/www.iLoveM 3x3 double 相对地,a1,1的含义为显示这个数据结构的内容。 a1,1 ans = 1 3 -7 2 0 6 0 5 1 总起来说,标识 a1,1反映的是数据结构 a(1,1)内容,而标识 a(1,1)是一个数据结构。 好的编程习惯 当你访问一单元阵列时,不要把()与混淆。它们完全不同的运算。 7.2.1 创建单元阵列创建单元阵列 创建单元阵列有两种方法 ? 用赋值语句 ? 用函数 cell 创建 最简单的创建单元阵列的方法是直接把数据结构赋值于独立的单元,一次赋一个单元。 但用 cell 函数创建将会更加地高效,所以我们用 cell 创建大的单元数组。 7.2.1.1 用赋值语句创建单元阵列用赋值语句创建单元阵列 你可以用赋值语句把值赋于单元阵列的一个单元, 一次赋一个单元。 这里有两种赋值的 方法,即内容索引(content indexing)和单元索引(cell indexing)。 内容索引要用到大括号,还有它们的下标,以及单元的内容。例如下面的语句创建了 一个 22 的单元阵列,如图 7.2 所示。 a1,1 = 1 3 -7; 2 0 6; 0 5 1; a1,2 = This is a text string.; a2,1 = 3+4*i -5; -10*i 3-4*i; a2,2 = ; 索引的这种类型定义了包含在一个单元中的数据结构的内容。 单元索引把存储于单元中的数据用大括号括起来, 单元的下标用普通下标标记法。 例如 下面的语句将创建一个 22 的单元阵列,如图 7.2 所示。 a(1,1) =1 3 -7; 2 0 6;0 5 1; a(1,2) = This is a text string.; a(2,1) = 3+4*i -5; -10*i 3-4*i; a(2,2) = ; 索引的这种类型创建了包含有指定值的一个数据结构,并把这个数据结构赋于一个单 元。 这两种形式是完全等价的,你可以在你的程序任选其一。 常见编程错误 不要创建一个与已存在的数字数组重名的元阵列。如果得名了,MATLAB 会认为你把 单元阵列的内容赋值给一个普通的数组,这将会产生一个错误信息。在创建单元阵列之前, 确保同名的数字数字数组已经被删除。 郑碧波翻译 Matlab 中文论坛首发 http:/www.iLoveM 7.2.1.2 用用 cell 函数创建单元阵列函数创建单元阵列 函数 cell 允许用户创建空单元阵列,并指定阵列的大小。例如,下面的语句创建一个 2 2 的空单元阵列。 a = cell(2, 2) 一旦单元阵列被创立,你就可以用赋值语句对单元阵列进行赋值。 7.2.2 单元创建者大括号单元创建者大括号()的应用的应用 如果在单个大括号中列出所有单元的内容, 那么就定义了许多的单元, 在一行中的独立 单元用逗号分开,行与行之间用分号隔开。例如下面的语句创建一个 23 单元阵列。 b = 1 2, 17, 2;4; 3-4*i, Hello, eye(3) 7.2.3 查看单元阵列的内容查看单元阵列的内容 MATLAB 可以把单元阵列每一个元素的数据结构缩合在一行中显示出来。如果全部的 数据结构没有被显示出来,那么显示就是一个总结。例如,单元阵列 a 和 b 显示如下 a a = 3x3 double 1x22 char 2x2 double b b = 1x2 double 17 2x1 double 3.0000- 4.0000i Hello 3x3 double 注意 MATLAB 显示的只是数据结构, 包括中括号和省略号, 而不包含数据结构的内容。 如果你想要知道看到单元阵列的所有内容,要用到 celldisp 函数。这个函数显示的是每 一个单元中的数据结构的内容。 celldisp(a) a1,1 = 1 3 -7 2 0 6 0 5 1 a2,1 = 3.0000 + 4.0000i -5.0000 0 -10.0000i 3.0000 - 4.0000i a1,2 = This is a text string. a2,2 = 如果要用高质量的图象显示数据结构的内容, 要用到函数 cellplot。 例如, 函数 cellplot(b) 产生了一个图象,如图 7.3 所示。 郑碧波翻译 Matlab 中文论坛首发 http:/www.iLoveM 图 7.3 用函数 cellplot 显示单元阵列 b 数据结构的内容 7.2.4 对单元阵列进行扩展对单元阵列进行扩展 一个值赋值于一个单元阵列中的元素, 如果这个元素现在不存在, 那么这个元素就会被 自动的建立,其他所需的元素也会被自动建立。例如,假设定义了一个 22 单元阵列,如 图 7.1 所示。如果我们执行下面的语句 a3, 3 = 5 单元阵列将会自动扩展为 33 单元阵列,如图 7.4 所示。 图 7.4 把一个值赋值于 a(3,3)产生的结果。注意其他的空元素也是自动创建的。 cell 1,1 cell 1,2 cell 1,3 cell 2,1 cell 2,2 cell 2,3 cell 3,1 cell 3,2 cell 3,3 1 3 -7 2 05 0 51 This is a text string. 3+i4-5 -i10 3-i4 5 郑碧波翻译 Matlab 中文论坛首发 http:/www.iLoveM 7.2.5 删除阵列中的元素删除阵列中的元素 如果要删除阵列中的所有元素,我们要用 clear 命令。如果要删除单元阵列中的部分元 素,我们把空值赋值于这一部分元素。例如,假设 a 的定义如下 a a = 3x3 double 1x22 char 2x2 double 5 我们可以用下面的语句删除第三行 a(3,:)= a = 3x3 double 1x22 char 2x2 double 7.2.6 单元阵列数据的应用单元阵列数据的应用 在一个单元阵列中,数据结构中数据可以随时用内容索引或单元索引调用。 例如假设单元阵列 c 的定义如下 c = 1 2; 3 4,dogs;cats,i 存储于 c(1,1)的内容可由下面的语句调用 c1,1 ans = 1 2 3 4 同样 c(2,1)中的元素可由下面的元素调用 c2,1 ans = cats 一个单元内容的子集可由两套下标得到。例如,假设我们要得到单元 c(1,1)中的元素 (1,2)。为了达到此目的,我们可以用表达式 c1,1(1,2),它代表单元 c(1,1)中的元素(1,2)。 c1,1(1,2) ans = 2 7.2.7 字符串单元阵列字符串单元阵列 在一个单元阵列中存储一批字符串与在标准的字符数组中存储相比是非常方便的, 因为 在单元阵列中每一个字符串的长度可以是不相同的, 而在标准字符数组的每一行的长度都必 须相等。这就意味着在单元阵列中的字符串没的必要增加多余的空格。许多的 MATLAB 用 户图形界面函数均使用单元阵列,正是基于这个原因,我们将在第十章看到。 字符串单元阵列可以由两种方法创建。 我们可以用方括号把独立的字符串插入到单元阵 列,我们也可以函数 cellstr 把一个二维字符数组转化为相应的字符串单元阵列。 下面的例子用第一种方法创建了一个字符串单元阵列, 并显示出这个阵列的结果。 注意 下面的每一个字符串具有不同的长度。 cellstring1 = Stephen J. Chapman; cellstring2 = Male; cellstring3 = SSN 999-99-9999; cellstring 郑碧波翻译 Matlab 中文论坛首发 http:/www.iLoveM cellstring = Stephen J. Chapman Male SSN 999-99-9999 我们可以利用函数 cellstr 把一个二维字符数据转化为相应的字符串单元阵列。 考虑下面 的字符数组。 data = Line 1 ;Additional Line data = Line 1 Additional Line 相应的字符串单元阵列为 c = cellstr(data) c = Line 1 Additional Line 我们还可以用 char 函数它转化回去 newdata = char(c) newdata = Line 1 Additional Line 7.2.8 单元阵列的重要性单元阵列的重要性 单元阵列是非常灵活的,因为各种类型的大量数据可以存储在每一个单元中。所以,它 经常当作中间 MATLAB 数据结构来用。我们必须理解它,因为在第十章中 MATLAB 图形 用户界面要用到它的许多特性。 还有, 单元阵列的灵活性可能使它们具有函数普通特性, 这个函数是指带有输入参数和 输出参数的变量个数的函数。一种特别的输入参数 varargin 可以在自定义函数中得到,这种 函数支持输入参数的变量的个数。 这个参数显在输入参数列表的最后一项, 它返回一个单元 阵列,所以一个输入实参可以包括任意数目的实参。每一个实参都变成了由 varagin 返回的 单元阵列元素。如果它被应用,varagin 必须是函数中的最后一个输入参数。 例如,假设我们要编写一个函数,它可能需要任意个数的输入参数。这个函数执行如下 所示 function test1(varargin) disp(There are int2str(nargin) arguments.); disp(The input arguments are:); disp(varargin); 我们用不同的数目参数来执行这个函数,结果如下 test1 There are 0 arguments. The input arguments are: test1(6) There are 1 arguments. The input arguments are: 6 test1(1,test 1,1 2,3 4) There are 3 arguments. The input arguments are: 1 test 1 1x4 double 正如我们所看到的,参数变成了函数中的单元阵列元素。 下面是一个简单函数例子, 这个函数拥有不同的参数数目。 函数 plotline 任意数目的 12 行向量,每一个向量包含一个点(x,y)。函数把这些点连成线。注意这个函数也接受直线类型 字符串,并把这些字符串转递给 plot 的函数。 function plotline(varargin) 郑碧波翻译 Matlab 中文论坛首发 http:/www.iLoveM %PLOTLINE Plot points specified by x,y pairs. % Function PLOTLINE accepts an arbitrary number of % x,y points and plots a line connecting them. % In addition, it can accept a line specification % string, and pass that string on to function plot. % Define variables: % ii -Index variable % jj -Index variable % linespec -String defining plot characteristics % msg -Error message % varargin -Cell array containing input arguments % x -x values to plot % y -y values to plot % Record of revisions: % Date Programmer Description of change % = = = % 10/20/98 S. J. Chapman Original code % Check for a legal number of input arguments. % We need at least 2 points to plot a line. msg = nargchk(2,Inf,nargin); error(msg); % Initialize values jj = 0; linespec = ; % Get the x and y values, making sure to save the line % specification string, if one exists. for ii = 1:nargin % Is this argument an x,y pair or the line % specification? if ischar(vararginii) % Save line specification linespec = vararginii; else % This is an x,y pair. Recover the values. jj = jj + 1; x(jj) = vararginii(1); y(jj) = vararginii(2); end end % Plot function. if isempty(linespec) plot(x,y); else plot(x,y,linespec); end 我们用下面的参数调用这个函数,产生的图象如图 7.5 所示。用相同的数目的参数调用 函数,看它产生的结果为什么? 也有专门的输出参数,vargout,它支持不同数目的输出参数。这个参数显示在输出参数 列表的最后一项。它返回一个单无阵列,所示单个输出实参支持任意数目的实参。每一个实 参都是这个单无阵列的元素,存储在 varargout。如果它被应用,varargout 必须是输出参数 列表中最后一项,在其它输入参数之后。存储在 varargout 中的变量数由函数 nargout 确定, 这个函数用指定于任何一个已知函数的输出实参。例如,我们要编写一函数,它返回任意数 目的随机数。我们的函数可以用函数 nargout 指定输出函数的数目,并把这些数目存储在单 元阵列 varargout 中。 郑碧波翻译 Matlab 中文论坛首发 http:/www.iLoveM 图 7.5 函数 plotline 产生的图象 function nvals, varargout = test2(mult) % nvals is the number of random values returned % varargout contains the random values returned nvals = nargout - 1; for ii = 1:nargout-1 varargoutii =randn * mult; end 当这个函数被执行时,产生的结果如下 test2(4) ans = -1 a b c d = test2(4) a = 3 b = -1.7303 c = -6.6623 d = 0.5013 好的编程习惯 应用单元阵列 varargin 和 varargout 创建函数,这个函数支持不同数目的输入或输出参 数。 郑碧波翻译 Matlab 中文论坛首发 http:/www.iLoveM 7.2.9 单元阵列函数总结单元阵列函数总结 支持单元阵列的一些普通函数总结在表 7.2 中。 表 7.2 普通的单元阵列函数 函数 描述 cell 对单元阵列进行预定义 celldisp 显示出单元阵列的内容 cellplot 画出单元阵列的结构图 cellstr 把二维字符数组转化为相应的字符串单元阵列 char 把字符串单元阵列转化相应的字符数组 7.3 结构数组结构数组 一个数组是一个数据类型, 这种数组类型有一个名字, 但是在这个数组中的单个元素只 能通过已知的数字进行访问。数组 arr 中的第五个元素可由 arr(5)访问。注意在这个数组中 的所有元素都必须是同一类型(数字或字符)。一个单元阵列也是一种数据类型,也有一个名 字, 单个元素也只能通过已知的数字进行访问。 但是这个单元阵列中元素的数据类型可以是 不同的。相对地,一个结构结构也是一种数据类型,它的每一个元素都有一

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值