官术网_书友最值得收藏!

第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表示的是按照排列的所有非零元素構成的向量。i,j分別表示的是非零元素的行下標和列下標向量。

例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除了可以處理常見的數值對象信息之外,還可以處理非數值對象的信息。本章主要講解了如何創建和處理稀疏矩陣、字符串數組和構架數組。其中,字符串數組和構架數組在工程應用中有廣泛應用。因此,了解如何創建和處理這些非數值數組,是后面章節講解數值分析的基礎。

主站蜘蛛池模板: 耿马| 兰考县| 六盘水市| 瑞安市| 扎囊县| 疏勒县| 肥东县| 沅江市| 新疆| 霞浦县| 清水河县| 犍为县| 顺平县| 鄢陵县| 城固县| 如皋市| 兰州市| 海南省| 望奎县| 合川市| 桑植县| 武功县| 海林市| 革吉县| 永川市| 丰镇市| 织金县| 慈利县| 民丰县| 平山县| 台北县| 措美县| 弥勒县| 通山县| 射洪县| 合水县| 建平县| 灯塔市| 孟津县| 太湖县| 彩票|