MATLAB宝典
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第3章 矩阵和架构

本章包括

◆ 创建稀疏矩阵

◆ 分析稀疏矩阵的信息

◆ 创建字符串数组

◆ 处理字符串数组的信息

◆ 创建构架数组

◆ 访问构架数组的数据

在第2章中,重点讲解了数值数组这种数据类型。在MATLAB中,除了使用数组来保存数据类型,还有其他的数据类型保存方法。其中,矩阵是另外一种重要的形式。同时,MATLAB除了处理数值数组之外,还可以处理非数值的数组,例如字符串数组或者其他综合数据类型数组等。在本章中,将重点讲解矩阵和非数值数组这部分的内容。

3.1 稀疏矩阵

在MATLAB中,系统使用两种方法来存储数据,也就是满矩阵的形式和稀疏矩阵的形式,简称满矩阵和稀疏矩阵。在很多情况下一个矩阵中只有少数元素是非零的,对于满矩阵MATLAB是会使用相同的空间来储存零元素和非零元素,这种储存方法对于大多数元素为0的稀疏矩阵而言,将会造成大量的浪费。因此,对于稀疏矩阵,MATLAB提供了特殊的存储方法,同时提供了特殊的操作函数和运算法则,下面详细介绍。

3.1.1 稀疏矩阵的存储方式

在MATLAB中,一般使用3个矩阵来存储稀疏矩阵,假设有一个m × n的矩阵,其中有nnz个非零元素,存储在长度为nz max的矩阵中。

◆ 第一个矩阵用来存储所有的非零元素,该矩阵的长度为nz max。

◆ 第二个矩阵用来存储所有的非零元素的行指标,该矩阵的长度也是nz max。

◆ 第三个矩阵用来存储每一列的开始处指针和一个标志着这3个矩阵结束的指针,该矩阵的长度为n+1。

根据上面的介绍可知,一个稀疏矩阵需要存储nz max个浮点数和nz max+n+1个整数,因此,存储一个稀疏矩阵需要8*nz max+4*(nz max+n+1)个字节的单元。对于稀疏矩阵和满矩阵的存储差异,MATLAB提供了下面的转换命令:

SM=sparse(A)将其他存储方式转换为其他的稀疏矩阵形式。

FM=fuII(A)把矩阵存储方式从任何一个存储形式转换为满矩阵形式。

3.1.2 创建稀疏矩阵——使用sparse命令

由于满矩阵的运算得到的结果还是满矩阵,因此如果不通过相应的命令将不会创建稀疏矩阵。在MATLAB中,提供了多个命令来创建稀疏矩阵,经常使用的有sparse和spdiags两种。其中,sparse命令的调用格式如下:

            S = sparse(i,j,s,m,n,nzmax)

该命令表示使用[i,j,s]的行创建m×n维稀疏矩阵S;在这条命令中,s表示的是按照排列的所有非零元素构成的向量。ij分别表示的是非零元素的行下标和列下标向量。

例3.1 使用sparse命令创建稀疏矩阵。

step 1 在MATLAB的命令窗口中输入以下代码:

            A = [ 0   0   0   5
                  0   2   0   0
                  1   3   0   0
                  0   0   4   0];
            S1 = sparse(A);
            B=full(S1);
            n=5;
            D = sparse(1:n,1:n,-2*ones(1,n),n,n);
            E = sparse(2:n,1:n-1,ones(1,n-1),n,n);
            S2 = E+D+E';

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            S1 =
              (3,1)       1
              (2,2)       2
              (3,2)       3
              (4,3)       4
              (1,4)       5
            B =
                0    0    0    5
                0    2    0    0
                1    3    0    0
                0    0    4    0
            D =
              (1,1)      -2
              (2,2)      -2
              (3,3)      -2
              (4,4)      -2
              (5,5)      -2
            E =
              (2,1)       1
              (3,2)       1
              (4,3)       1
              (5,4)       1
            S2 =
              (1,1)      -2
              (2,1)       1
              (1,2)       1
              (2,2)      -2
              (3,2)       1
              (2,3)       1
              (3,3)      -2
              (4,3)       1
              (3,4)       1
              (4,4)      -2
              (5,4)       1
              (4,5)       1
              (5,5)      -2

step 3 查看存储信息。为了加强对稀疏矩阵的存储信息的理解,可以使用whos命令查看各变量的信息:

            >> whos
              Name     Size                 Bytes  Class
              A        4x4                    128  double array
              B        4x4                    128  double array
              D        5x5                     84  double array (sparse)
              E        5x5                     72  double array (sparse)
              S1       4x4                     80  double array (sparse)
              S2       5x5                    180  double array (sparse)
              n        1x1                      8  double array
            Grand total is 60 elements using 680 bytes

3.1.3 创建稀疏矩阵——使用spdiags命令

在MATLAB中,spdiags命令的调用格式如下:

            A = spdiags(B,d,m,n)

该调用命令的功能是抽取和创建带状对角稀疏矩阵。在上面的参数中,mn分别表示指定矩阵的行和列的维数。d表示的是长度为p的整数向量,B是满矩阵,用来指定A矩阵的对角线位置上的元素。

说明

在MATLAB中,还提供了从外部数据转换为稀疏矩阵的命令spconvert,用户可以首先通过load命令加载外部数据,然后使用该命令创建稀疏矩阵。

例3.2 使用spdiags命令来创建稀疏矩阵。

step 1 在MATLAB的命令窗口中输入以下代码:

            >> B = [ 41   11    0
                  52   22    0
                  63   33   13
                  74   44   24 ];
            >> d = [-3
                  0
                  2];
            >> S=spdiags(B,d,7,4);
            >> D=full(S);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            S =
              (1,1)       11
              (4,1)       41
              (2,2)       22
              (5,2)       52
              (1,3)       13
              (3,3)       33
              (6,3)       63
              (2,4)       24
              (4,4)       44
              (7,4)       74
            D =
                11    0   13    0
                0   22     0   24
                0     0   33    0
                41    0    0   44
                0   52     0    0
                0     0   63    0
                0     0    0   74

说明

在MATLAB中,还提供了创建特殊稀疏矩阵的各种命令,例如speye、spones、sprand、sprandsym等,关于这些命令的详细使用方法可以查看相应的帮助文件。

3.1.4 查看稀疏矩阵的信息

由于稀疏矩阵的维度一般比较大,直接查看系数矩阵不利于用户查看系数矩阵的信息,为此MATLAB提供了查看稀疏矩阵定量信息和图形化信息的函数,主要用来查看稀疏矩阵的非零元素信息和图形化稀疏矩阵信息。

n=nnz(x) 查看稀疏矩阵中的非零元素个数。

s=nonzeros(A) 返回稀疏矩阵中的非零元素数值。

n=nzmax(S) 返回稀疏矩阵中存储非零元素的空间长度。

例3.3 查看某稀疏矩阵的元素信息。

step 1 在MATLAB的命令窗口中输入以下代码:

            >> load west0479
            >> S=west0479;
            >> n1=nnz(S);
            >> s1=nonzeros(S);
            >> n2=nzmax(S);
            >> format short e

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            n1 =
                  1887
            n2 =
                  1887
            s1 =
             1.0000e+000
             -3.7648e-002
             -3.4424e-001
              1.0000e+000
             -2.4523e-002
             -3.7371e-001
              1.0000e+000
             -3.6613e-002
             …………………//省略了部分数据
              3.6044e-001
              2.0539e-002
              7.1093e-001
              3.1305e+000
              1.3574e-001
              1.0000e+000
              2.8831e-001
              7.1490e-002

说明

从结果中可以看出,在默认的情况下,稀疏矩阵中非零元素的个数和存储非零元素的长度相同。

3.1.5 稀疏矩阵的图形化信息

除了信息查询函数之外,MATLAB还提供了查看稀疏矩阵的图形化命令spy,其具体的调用格式如下:

            spy(S,'LineSpec',markersize)

其中S表示的是稀疏矩阵,LineSpec表示的是线型属性的字符串,markersize则表示的是标记大小。

例3.4 查看稀疏矩阵的图形化信息。

step 1 在MATLAB的命令窗口中输入以下代码:

            >> load west0479
            >>S=west0479;
            >> spy(S)

step 2 按“Enter”键,得到的图形如图3.1所示。

图3.1 稀疏矩阵S的图形

step 3 在MATLAB的命令窗口中输入以下代码:

            >> B=bucky;
            >> C=B^2;
            >> D=B^4;
            >> E=B^6;
            >>subplot(221);
            >>spy(B)
            >>subplot(222);
            >>spy(C)
            >>subplot(223);
            >>spy(D)
            >>subplot(224);
            >>spy(E)

step 4 按“Enter”键,得到的图形如图3.2所示。

图3.2 稀疏矩阵的图形

3.2 字符串数组

尽管在MATLAB的主要运算对象是数值数组,但是在实际运用中也会经常需要处理字符串对象,因此在MATLAB中也提供了有关字符串数组操作的函数。正是因为字符串和数值属于不同的数据类型,所以在创建和操作中有许多地方和数值数组有明显的差异,在本节中将分别介绍字符串数组的相关操作情况。

3.2.1 创建字符串数组——直接输入法

在MATLAB中,可以使用多种方法创建字符串数组,在本节中将以各种简单的实例来说明如何创建各种要求的字符串数组。

例3.5 通过直接输入法来创建字符串数组。

step 1 在MATLAB的命令窗口中输入以下代码:

            a='Char';
            b='字符串数组';
            c='Example''2.1''';
            d=[b,' ',c,'.'];

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            a =
            Char
            b =
            字符串数组
            c =
            Example'2.1'
            d =
            字符串数组Example'2.1'.

从以上程序代码可以得知创建字符串数组的基本方法:

◆ 直接在单引号对内输入字符串的内容。

◆ 当字符串文字中包含单引号时,每个单引号符号需要使用连续的2个单引号字符。

◆ 可以使用小的字符串构成长的字符串。

3.2.2 创建字符串数组——使用ASCII码

例3.6 通过ASCII码的转换来创建字符串数组。

step 1 在MATLAB的命令窗口中输入以下代码:

            >> b='字符串数组';
            >> ascii_b=double(b);
            >> c=char(ascii_b);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            b =
            字符串数组
            ascii_b =
                  23383      31526      20018      25968      32452
            c =
            字符串数组

说明

从上面的结果可以看出,在MATLAB中,可以使用char和double在字符串数组和数值数组之间转换,其中数值数组就是字符串对应的ASCII码。

step 3 通过ASCII码实现字符串变量大小写的转换。在命令窗口中输入以下代码:

            >> charA='Matlab 7.0 String Data';
            >>w=find(charA>='a'&charA<='z');
            >>asciiA=double(charA);
            >>asciiA(w)=asciiA(w)-32;
            >> charB=char(asciiA);

step 4 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            charA =
            Matlab 7.0 String Data
            charB =
            MATLAB 7.0 STRING DATA

提示

在MATLAB中,大小写字符串的ASCII码相差32,因此使用数值数组之间的加法或者减法来实现大小写变换。

3.2.3 创建字符串数组——使用函数

例3.7 通过数组创建函数来创建字符串数组。

step 1 在MATLAB的命令窗口中输入如下代码:

            >> ch1=char('Matlab 7.0','String Data');
            >> ch2=str2mat('Matlab','7.0','','String','Data');
            >> t1 = 'first';
            >> t2 = 'string';
            >> t3= 'matrix';
            >> t4 = 'second';
            >> S1 = strvcat(t1, t2, t3);
            >> S2 = strvcat(t4, t2, t3);
            >> S3 = strvcat(S1, S2);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            ch1 =
            Matlab 7.0
            String Data^
            ch2 =
            Matlab
            7.0
            String
            Data^
            S1 =
            first
            string
            matrix^
            S2 =^
            second
            string
            matrix^
            S3 =^
            first
            string
            matrix
            second
            string
            matrix

说明

在MATLAB中,使用上面三个函数来创建字符串时,不需要注意每个字符串变量的长度是否相等,同时应该注意空串和空格串的差别。

3.2.4 处理字符串数组的空格

为了方便用户操作字符串数组,MATLAB提供了多种字符串的操作函数,包括对字符串进行转换、裁减、连接、查找等功能,这些函数内容繁多,在本章中将主要介绍比较常见的字符串操作函数,其他具体函数请读者自行查阅帮助文件。

例3.8 使用不同的方法来处理字符串中的空格。

step 1 在MATLAB的命令窗口中输入如下代码:

            >> A{1,1} = 'MATLAB   ';
            >> A{1,2} = 'SIMULINK   ';
            >> A{2,1} = 'Toolboxes   ';
            >> A{2,2} = 'The MathWorks   ';
            >> B=deblank(A);
            >> cstr = {'    Trim leading white-space';
            'Trim trailing white-space    '};
            >>cstrim=strtrim(cstr);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            A =
                'MATLAB   '       'SIMULINK   '
                'Toolboxes    '   'The MathWorks   '
            B =
                'MATLAB'      'SIMULINK'
                'Toolboxes'   'The MathWorks'
            cstr =
                '    Trim leading white-space'
                'Trim trailing white-space    '
            cstrim =
                'Trim leading white-space'
                'Trim trailing white-space'

说明

从上面的结果可以看出,两个不同的命令都可以用于清除字符串中的空格,但是具体的用法和功能还是略有不同的,strtrim命令的功能主要是清除字符串前后的空格,deblank命令的功能则是清除字符串尾部的空格。

3.2.5 读取字符串数组的信息

例3.9 使用函数查找、替代和读取字符串中的信息。

step 1 替代字符串。在MATLAB的命令窗口中输入如下代码:

            >> s1 = 'This is a good example.';
            >>str = strrep(s1, 'good', 'great');

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            s1 =
            This is a good example.
            str =
            This is a great example.

说明

在上面的结果中,字符串变量str通过命令strrep将字符串变量s1中的“good”替换为“great”。

step 3 读取字符串数组的信息。在MATLAB的命令窗口中输入如下代码:

            >> str = '<table border=5 width="100%" cellspacing=0>';
            [border width space] = strread(str, ...
              '%*s%*s %c %*s "%4s" %*s %c', 'delimiter', '= ');

step 4 查看程序结果。按“Enter”键,可以得到如下结果:

            border =
            5
            width =
                '100%'
            space =
            0

说明

在上面的程序代码中,通过使用strread命令从原始的字符串中读取各种具体有效的数值信息。

step 5 查找字符串中的“<>”符号,得出有效信息。在MATLAB的命令窗口中输入如下代码:

            >> s = sprintf('%s%s%s', ...
            '<ul class=continued><li class=continued><pre>', ...
            '<a name="13474"></a>token = strtok(''str'', delimiter)', ...
            '<a name="13475"></a>token = strtok(''str'')');
            rem = s;
            for k=1:11
              [t{k}, rem] = strtok(rem, '<>');
              if isempty(t{k}),  break;  end
              disp(sprintf('%s',t{k}))
              end

step 6 查看程序结果。按“Enter”键,可以得到如下结果:

            ul class=continued
            li class=continued
            pre
            a name="13474"
            /a
            token = strtok('str', delimiter)
            a name="13475"
            /a
            token = strtok('str')

说明

在上面的程序代码中,首先将某个HTML代码中的字符串添加到变量s中,然后将这个字符串切断为各个部分,并删除“<”和“>”字符串,最后使用循环语句来将各个字符串信息显示出来。

3.3 构架数组

在MATLAB中,构架数组是一个比较特殊的数组类型,在该数组中可以存放各种不同类型的数据。构架数组的基本组成部分是构架,数组中的每个构架都是平等的,它们主要用下标进行区分。构架必须在划分了“域”之后才能使用,数据不能直接存放在构架数组中,而只能直接存放在构架的域中。而构架中的“域”可以存放任何类型、任何大小的数组,而且不同构架数组中的同名域中可以存放不同的内容。

鉴于构架数组具有上面这些特殊之处,在本节中将介绍如何在MATLAB中创建、操作和运用构架数组。

3.3.1 创建单构架数组——使用直接法

构架数组实质上具有面向对象的数据结构功能,具有属性名称、属性数值两个主要对象域,对此MATLAB提供了多种创建方法来构建构架数组,在本节中,将以具体的实例来说明如何创建构架数组。

例3.10 使用直接法来创建某个关于病人的构架数组。

step 1 创建维度为1×1的构架数组。在MATLAB的命令窗口中输入如下代码:

            >> patient.name = 'John Doe';
            >>patient.billing = 127.00;
            >>patient.test = [79 75 73; 180178 177.5; 220210 205];
            >> patient.medi_information.city='NewYork';
            >> patient.medi_information.date='2006/7/1';

step 2 查看该构架数组的存储信息。使用whos命令查看数组信息,其具体的信息如下:

            >> whos patient
              Name         Size                 Bytes  Class
              patient      1x1                    870  struct array^
            Grand total is 39 elements using 870 bytes

step 3 查看该构架数组的具体信息。在MATLAB的命令窗口中输入下面的代码:

            >> patient
            patient =
                          name: 'John Doe'
                        billing: 127
                          test: [3x3 double]
                medi_information: [1x1 struct]
            >> patient.medi_information^
            ans =
                city: 'NewYork'
                date: '2006/7/1'
            >> patient.test
            ans =
              79.0000   75.0000   73.0000
              180.0000  178.0000  177.5000
              220.0000  210.0000  205.0000
            >> patient.medi_information.city
            ans =
            NewYork

在以上代码中,patient只有一个构架,其总共有4 个数值域:name、biIIing、test和medi_information,其中medi_information又有两个子域:city和date。向子域中直接添加数值是创建构架数组的最常用方法。

提示

当用户在命令窗口中直接输入构架名称的时候,MATLAB只会显示构架的域名以及对应的信息,如果需要查看各个构架数组中具体名域的数值,则需要引用对应的具体名称。

3.3.2 创建二维构架数组

例3.11 沿用上面的实例,创建二维构架数组。

step 1 直接扩充构架数组的维度。在MATLAB的命令窗口中输入如下代码:

            >> patient(2).name = 'Ann Lane';
            >>patient(2).billing = 28.50;
            >>patient(2).test = [68 70 68; 118118 119; 172170 169];
            >> patient(2).medi_information.city='Chicago';
            >> patient(2).medi_information.date='2006/8/1';
            >> patient(3).name = 'Ann Smitch';
            >>patient(3).billing = 504.70;
            >>patient(3).test = [80 80 68; 153153 154; 181190 182];
            >> patient(3).medi_information.city='Boston';
            >>patient(3).medi_information.date='2006/9/1';

step 2 查看该构架数组的存储信息。使用whos命令查看数组信息,其具体的信息如下:

            >> whos patient
              Name         Size                 Bytes  Class
              patient      1x3                   2100  struct array^
            Grand total is 118 elements using 2100 bytes

step 3 利用上面的数组创建新数组。在MATLAB的命令窗口中输入如下代码:

            >>mypatient=patient(1:2);

step 4 查看程序结果。在命令窗口中输入变量名称,可以得到下面的程序结果:

            >> mypatient
            mypatient =^
            1x2 struct array with fields:
                name
                billing
                test
                medi_information

step 5 访问构架数组的信息。在MATLAB的命令窗口中输入如下代码:

            >> mypatient(1)
            ans =^
                            name: 'John Doe'
                        billing: 127
                            test: [3x3 double]
                medi_information: [1x1 struct]
            >> name=mypatient(2).name
            name =
            Ann Lane
            >> test=mypatient(2).test
            test =^
                68   70   68
                118   118   119
                172   170   169

提示

从上面的结果中可以看出,对于高维构架数组也可以使用直接对子域进行赋值的方法进行创建,同时可以使用高维构架数组来创建低维构架数组。

3.3.3 创建三维构架数组

例3.12 沿用上面的实例,创建三维构架数组。

step 1 直接扩充构架数组的维度。在MATLAB的命令窗口中输入如下代码:

            patient(1,1,1).name = 'John Doe';patient(1,1,1).billing = 127.00;
            patient(1,1,1).test = [79 75 73; 180178 177.5; 220210 205];
            patient(1,2,1).name = 'Ann Lane';patient(1,2,1).billing = 28.50;
            patient(1,2,1).test = [68 70 68; 118118 119; 172170 169];
            patient(1,1,2).name = 'Al Smith';patient(1,1,2).billing = 504.70;
            patient(1,1,2).test = [80 80 80; 153153 154; 181190 182];
            patient(1,2,2).name = 'Dora Jones';patient(1,2,2).billing = 1173.90;
            patient(1,2,2).test = [73 73 75; 103103 102; 201198 200];

step 2 查看该构架数组的存储信息。使用whos命令查看数组信息,其具体的信息如下:

            >> patient
            patient =^
            1x3x2 struct array with fields:
                name
                billing
                test
                medi_information

step 3 查看该构架数组的结构图。由于三维构架数组比较难以理解,下面的图形列出了具体的结构图,如图3.3所示。

图3.3 三维构架数组的图形化结构

3.3.4 使用命令创建构架数组

例3.13 使用struct命令创建构架数组。

step 1 调用struct命令,创建构架数组。在MATLAB的命令窗口中输入如下代码:

            >>W = struct('city', {'Bos','Chi','Lin','Dnv','Vgs','SFr'}, ...
                      'temp', {43, 34, 25, 15, 31, 52}, ...
                      'heatix', {32, 27, 17, -5, 22, 47}, ...
                      'wspeed', {8, 3, 11, 9, 4, 18}, ...
                      'wchill', {37, 30, 16, 0, 35, 42});

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            >> W
            W =^
            1x6 struct array with fields:
                city
                temp
                heatix
                wspeed
                wchill

说明

在MATLAB中,创建构架数组的命令struct的调用格式为s = struct('field1', values1, 'field2', values2, …),其中field表示的是构架数组的域,values表示数组域的数值。

3.3.5 访问构架数组的数据

由于构架数组比较特殊,因此如果希望在其他的应用程序或者模块中使用构架数组,则需要能够访问构架数组中的数据,下面使用例子来说明如何访问构架数组的数据。

例3.14 访问构架数组的数据。

step 1 在MATLAB的命令窗口中输入如下代码:

            >> my1=mypatient(1);
            >> test2b = patient(3).test(2,2);
            >> bills = [patient.billing];
            >> tests = {patient(1:2).test};

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            >> my1
            my1 =^
                          name: 'John Doe'
                        billing: 127
                          test: [3x3 double]
                medi_information: [1x1 struct]^
            test2b =
              153^
            bills =
              127.0000   28.5000  504.7000
            tests =^
                [3x3 double]   [3x3 double]

说明

在以上代码中,patient和mypatient变量是前面小节中创建的构架数组,这里演示了不同的引用方法。

例3.15 在程序代码中调用构架数组中的数据,并绘制对应的图形。

step 1 创建构架数组。在MATLAB的命令窗口中输入如下代码:

            test(1).lead = .007;
            test(2).lead = .031;
            test(3).lead = .019;
            test(1).mercury = .0021;
            test(2).mercury = .0009;
            test(3).mercury = .0013;
            test(1).chromium = .025;
            test(2).chromium = .017;
            test(3).chromium = .1

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            test =^
            1x3 struct array with fields:
                lead
                mercury
            chromium

step 3 编写绘图函数命令。选择命令窗口编辑栏中的“FiIe”→“New”→“M-FiIe”命令,打开M文件编辑器,在其中输入如下代码:

            function [r1, r2] = concen(toxtest);
            % 计算变量之间的相对比例
            r1 = [toxtest.mercury] ./ [toxtest.lead];
            r2 = [toxtest.lead] ./ [toxtest.chromium];
            %计算变量数值
            lead = [toxtest.lead];
            mercury = [toxtest.mercury];
            chromium = [toxtest.chromium];
            %绘制三个变量的图形
            plot(lead, 'r','LineWidth',1.5);   hold on
            plot(mercury, 'b','LineWidth',1.5)
            plot(chromium, 'y','LineWidth',1.5);   hold off
            %添加图形图例和标题
            legend('lead','mercury','chromium')
            title('The ratio of mix')
            grid

在输入上面的程序代码后,将其保存为“concen.m”文件。

step 4 运行函数。在MATLAB的命令窗口中输入如下代码:

            >> [a,b]=concen(test)

step 5 查看结果。输入这行代码后,得到的计算结果如下:

            a =
                0.3000   0.0290   0.0684
            b =
                0.2800   1.8235   0.1900

同时,可以得到的图形如图3.4所示。

图3.4 绘制结果的图形

3.3.6 设置构架数组的域属性

由于构架数组的域是存放数据的场所,因此调取和设置构架数组中数据的前提就是了解或者熟悉构架数组的域名,尽管在前面的章节中曾经介绍过访问构架数组域名的方法,但是这种方法并不能获得其他命令能够处理的域名。为了解决这个矛盾,MATLAB提供了关于处理域名的各种命令,在本节中将主要介绍一些常见命令。

            names = fieldnames(s); 获取构架数组的域名
            f = getfield(s,'field'); 获取具体构架数组中的内容
            s = setfield(s, 'field', v) 设置具体构架数组中的内容

例3.16 使用fieIdnames命令获取构架数组的域属性。

step 1 创建构架数组。在MATLAB的命令窗口中输入如下代码:

            mystr(1,1).name = 'alice';
            mystr(1,1).ID = 0;
            mystr(2,1).name = 'gertrude';
            mystr(2,1).ID = 1

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            mystr =
            2x1 struct array with fields:
                name
                ID

step 3 获取域名属性。在MATLAB的命令窗口中输入如下代码:

            n = fieldnames(mystr)

step 4 查看程序结果。按“Enter”键,可以得到如下结果:

            n =
                'name'
                'ID'

step 5 获取其他对象的域名属性。在MATLAB的命令窗口中输入如下代码:

            f = java.awt.Frame;
            fieldnames(f)

step 6 查看程序结果。按“Enter”键,可以得到如下结果:

            ans =
                'DEFAULT_CURSOR'
                'CROSSHAIR_CURSOR'
                'TEXT_CURSOR'
                'WAIT_CURSOR'
                ………………………………//省略了部分数据
                'BOTTOM_ALIGNMENT'
                'LEFT_ALIGNMENT'
                'RIGHT_ALIGNMENT'
                'WIDTH'
                'HEIGHT'
                'PROPERTIES'
                'SOMEBITS'
                'FRAMEBITS'
                'ALLBITS'
                'ERROR'
                'ABORT'

例3.17 使用getfieId命令来获取域属性。

step 1 创建构架数组。在MATLAB的命令窗口中输入如下代码:

            mystr(1,1).name = 'alice';
            mystr(1,1).ID = 0;
            mystr(2,1).name = 'gertrude';
            mystr(2,1).ID = 1

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            mystr =
            2x1 struct array with fields:
                name
                ID

step 3 获取域名属性。在MATLAB的命令窗口中输入如下代码:

            >> for k = 1:2
                name{k} = getfield(mystr,{k,1},'name');
            end

step 4 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            name =^
                'alice'   'gertrude'

例3.18 使用setfieId命令来设置域属性。

step 1 创建构架数组。在MATLAB的命令窗口中输入如下代码:

            >> class = 5;   student = 'John_Doe';
            grades_Doe = [85, 89, 76, 93, 85, 91, 68, 84, 95, 73];
            grades = [];
            grades = setfield(grades, {class}, student, 'Math', ...
              {10, 21:30}, grades_Doe);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            grades =
            1x5 struct array with fields:
                John_Doe

step 3 查看构架数组的信息。在MATLAB的命令窗口中输入如下代码:

            grades(class).John_Doe.Math(10, 21:30)

step 4 查看程序结果。按“Enter”键,可以得到下面的程序结果:

            ans =^
            85   89   76   93   85   91   68   84   95   73

3.4 小结

MATLAB除了可以处理常见的数值对象信息之外,还可以处理非数值对象的信息。本章主要讲解了如何创建和处理稀疏矩阵、字符串数组和构架数组。其中,字符串数组和构架数组在工程应用中有广泛应用。因此,了解如何创建和处理这些非数值数组,是后面章节讲解数值分析的基础。