购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 数组及其函数

所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分它们的变量的集合,这个名字成为数组名,编号成为下标。组成数组的各变量成为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种形式,这些按序排列的同类数据元素的集合称为数组。

MATLAB的一个重要功能就是能够进行向量和矩阵运算,因此,向量和矩阵MATLAB具有非常重要作用。MATLAB中向量和矩阵主要用数组来表示,数组是MATLAB的核心数据结构。

2.2.1 数组的建立

数组的创建包括一维数组和二维数组的创建。一维数组的创建包括一维行向量和一维列向量的创建。创建一维行向量和一维列向量的主要区别在于创建数组时,数组元素是行排列还是列排列。

创建一维行向量即以左方括号开始,以空格或逗号为间隔输入元素值,最后以右方括号结束。由于数组元素值以空格隔开,复数作为数组元素时中间不能键入空格。

MATLAB中可以利用冒号生成等差数组。语法为数组名=起始值:增量:结束值。增量为正,代表递增,增量为负,代表递减,默认增量为1。

创建一维列向量,则需要把所有数组元素用分号隔开,并用方括号把数组元素括起来,也可通过转置运算符’将已经创建好的行向量转置为列向量。

创建二维数组与创建一维数组的方式类似。在创建二维数组时,用逗号或空格区分同一行的不同元素,用分号或回车区分不同行。

【例2-64】 创建二维数组。

    >> A=[1,2,3,4,5,6,7,8,9]
    A =
         1     2     3     4     5     6     7     8     9
    >> A=1:9
    A =
         1     2     3     4     5     6     7     8     9
    >> A=1:2:9
    A =
         1     3     5     7     9
    >>A=[1;2;3;4;5;6]
    A =
         1
         2
         3
         4
         5
         6
    >> A=[1 1+i 2-i 3 5];
    >> B=A'
    B =
       1.0000
       1.0000 - 1.0000i
       2.0000 + 1.0000i
       3.0000
       5.0000
    >> A=[1,2,3;4,5,6]
    A =
         1     2     3
         4     5     6

MATLAB还提供了大量的库函数用于生成特殊的数组,如表2-15所示。

表2-15 生成特殊数组的函数

2.2.2 数组的操作

1.数组寻址

数组中包含多个元素,因此,对数组的单个元素或多个元素进行访问操作时,需要对数组进行寻址操作。在MATLAB中,数组寻址通过对数组下标的访问实现,MATLAB中提供end参数表示数组的末尾。

MATLAB在内存中以列的方向保存二维数组,对于一个m行n列的数组,i、j分别表示行、列的索引,二维数组的寻址可表示为A(i,j);如果采用单下标寻址,则数组中元素的下标k表示为(j-1)*m+i。

【例2-65】 数组寻址样例。

    >> A=randn(1,6)
    A =
        0.8156    0.7119    1.2902    0.6686    1.1908   -1.2025
    >> A(5)
    ans =
        1.1908
    >> A([1 3 4 6])
    ans =
        0.8156    1.2902    0.6686   -1.2025
    >> A(3:5)
    ans =
        1.2902    0.6686    1.1908
    >> A(3:end)
    ans =
        1.2902    0.6686    1.1908   -1.2025
 
    >> A=randn(3,4)
    A =
       -0.0198    0.2573   -0.8051   -0.9219
       -0.1567   -1.0565    0.5287   -2.1707
       -1.6041    1.4151    0.2193   -0.0592
    >>  A ( 6 )
    ans =
        1.4151
    >> A(3,2)
    ans =
        1.4151

2.数组的扩展与裁剪

数组的扩展指改变数组现有的大小,增加新的数组元素,使得数组的行数或列数增加;而数组的裁剪指从现有的数组中抽出部分数组元素,组成一个维数更小的新数组。

(1)数组的扩展

赋值扩展是数组扩展中较为常用的方法。如果有一个m行n列的数组A,要通过赋值来扩展该数组,可以使用超出目前数组大小的索引数字,并对该位置的数组元素进行赋值来完成对数组的扩展,同时未指定的新位置默认赋值为0。

【例2-66】 将数组的扩展样例。

    >> X=[1 2 3;4 5 6;7 8 9];          %数组的赋值扩展
    >> X(4,4)=10
    X =
         1     2     3     0
         4     5     6     0
         7     8     9     0
         0     0     0    10
    >> X(:,5)=20
    X =
         1     2     3     0    20
         4     5     6     0    20
         7     8     9     0    20
         0     0     0    10    20
    >>  xx=X(:,[1:5,1:5])                 %多次寻址扩展
    xx =
         1     2     3     0    20     1     2     3     0    20
         4     5     6     0    20     4     5     6     0    20
         7     8     9     0    20     7     8     9     0    20
         0     0     0     10   20     0     0     0     10   20
    >> Y=ones(2,5)
    Y =
         1     1     1     1     1
         1     1     1     1     1
    >> xy_r=[X;Y]                           %列合成扩展
    xy_r =
         1     2     3     0    20
         4     5     6     0    20
         7     8     9     0    20
         0     0     0    10   20
         1     1     1     1     1
         1     1     1     1     1
    >> xy_c=[X,Y(:,1:4)']                %行合成扩展
    xy_c =
         1     2     3     0    20     1     1
         4     5     6     0    20     1     1
         7     8     9     0    20     1     1
         0     0     0     10   20     1     1

(2)数组的裁剪

MATLAB中通常采用冒号操作符裁剪数组,冒号操作符的使用方法为

    B=A([x1,x2,…],[y1,y2,…])

其中,[x1,x2,…]表示行索引向量,[y1,y2,…]表示列索引向量,该式表示提取数组A的x1,x2,…等行,y1,y2,…等列,组成一个新的数组。当某一索引值的位置上不是数字,而是冒号,则表示提取此索引位置的所有数组元素。

3.数组元素的删除

删除数组元素,可以通过将该位置的数组元素赋值为空方括号[],一般配合冒号使用,将数组中的某些行、列元素删除。注意,在进行数组元素的删除时,索引值必须是完整的行或列,而不能是数组内部的元素块或单个元素。

【例2-67】 数组元素的删除样例。

    >> X=rand(6,6)
    X =
        0.9501    0.4565    0.9218    0.4103    0.1389    0.0153
        0.2311    0.0185    0.7382    0.8936    0.2028    0.7468
        0.6068    0.8214    0.1763    0.0579    0.1987    0.4451
        0.4860    0.4447    0.4057    0.3529    0.6038    0.9318
        0.8913    0.6154    0.9355    0.8132    0.2722    0.4660
        0.7621    0.7919    0.9169    0.0099    0.1988    0.4186
    >> X(3,:)
    ans =
        0.6068    0.8214    0.1763    0.0579    0.1987    0.4451
    >> X(1:2:6,2:2:6)              %圆括号中表示为初值、步长、终值
    ans =
        0.4565    0.4103    0.0153
        0.8214    0.0579    0.4451
        0.6154    0.8132    0.4660
    >> X([1,2,5],[2,3,6])               %方括号中表示取值
    ans =
        0.4565    0.9218    0.0153
        0.0185    0.7382    0.7468
        0.6154    0.9355    0.4660
    >> X([1,2],:)=[]
    X =
        0.6068    0.8214    0.1763    0.0579    0.1987    0.4451
        0.4860    0.4447    0.4057    0.3529    0.6038    0.9318
        0.8913    0.6154    0.9355    0.8132    0.2722    0.4660
        0.7621    0.7919    0.9169    0.0099    0.1988    0.4186
    >> X(1:2:4,:)=[]
    X =
        0.4860    0.4447    0.4057    0.3529    0.6038    0.9318
        0.7621    0.7919    0.9169    0.0099    0.1988    0.4186
    >> X(:,[1,2,3,4])=[]
    X =
        0.6038    0.9318
        0.1988    0.4186

4.数组的查找和排序

1)数组的查找

MATLAB提供数组查找函数find,它能够查找数组中的非零数组元素,并返回其数组索引值。find函数的语法为

  • indices = find(X)
  • indices = find(X, k)
  • indices = find(X, k, 'first')
  • indices = find(X, k, 'last')
  • [i,j] = find(...)
  • [i,j,v] = find(...)

其中,indices表示非零元素的下标值,i,j分别表示行下标向量和列下标向量,v表示非零元素向量。

在MATLAB的实际应用中,经常通过多重逻辑关系组合产生逻辑数组,判断数组元素是否满足某种比较关系,然后通过find函数返回符合比较关系的元素索引,从而实现数组元素的查找。

2)数组的排序

MATLAB提供数组排序函数sort,该函数可对任意给定的数组进行排序。sort函数的语法为

  • B = sort(A)
  • B = sort(A,dim)
  • B = sort(...,mode)
  • [B,IX] = sort(...)

其中,B为返回的排序后的数组,A为输入待排序数组,当A为多维数组时,用dim指定需要排序的维数(默认为1);mode为排序的方式,可以取值为ascend和descend,分别表示升序和降序,默认为升序;IX用于存储排序后的下标数组。

【例2-68】 数组的查找和排序样例。

    >> X = [3 2 0; -5 0 7; 0 0 1]
    >> [i,j]=find((X>2)&(X<9))
    i =
         1
         2
    j =
         1
         3
    >> sort(X,1)   %以列维方向排序
    ans =
        -5     0     0
         0     0     1
         3     2     7
    >> sort(X,1,‘descend’)     %’1’表示列维降序排序
    ans =
         3     2     7
         0     0     1
        -5     0     0
    >>  [B,IX] = sort(X,2)       %’2’表示列维降序排序
    B =
         0     2     3
        -5     0     7
         0     0     1
    IX =
         3     2     1
         1     2     3
         1     2     3

5.数组的运算

MATLAB中数组的加减乘除运算是按元素对元素方式进行的。数组的加减法为数组对应元素的加减法,利用运算符“+”和“–”实现该运算。相加或相减的两个数组必须有相同的维数,或者是数组同标量相加减。

数组的乘除法为对应数组元素的乘除,通过运算符“.*”和“./”实现。相乘或相除的两个数组必须具有相同的维数,或者是数组同标量相加减。

数组幂运算用符号“.^”实现,表示对元素的幂。数组幂运算以三种方式进行:底为数组、底为标量和底与指数均为数组。当底和指数均为数组时,要求两个数组具有相同的维数。

【例2-69】 数组的加减乘除等运算样例。

    >> A=ones(3,3)
    A =
         1     1     1
         1     1     1
         1     1     1
    >> B=rand(3)
    B =
        0.8462    0.6721    0.6813
        0.5252    0.8381    0.3795
        0.2026    0.0196    0.8318
    >> C1=A+B
    C1 =
        1.8462    1.6721    1.6813
        1.5252    1.8381    1.3795
        1.2026    1.0196    1.8318
    >> C2=A-B
    C2 =
        0.1538    0.3279    0.3187
        0.4748    0.1619    0.6205
        0.7974    0.9804    0.1682
    >> C3=A. *B
    C3 =
        0.8462    0.6721    0.6813
        0.5252    0.8381    0.3795
        0.2026    0.0196    0.8318
    >> C4=A./B
    C4 =
        1.1817    1.4878     1.4678
        1.9042    1.1931     2.6352
        4.9347   50.9178     1.2022
    >> A=[1 2 3 4;5 6 7 8;9 10 11 12];
    >> B=[1 1 1 1;2 2 2 2;3 3 3 3];
    >> A.^2
    ans =
         1        4        9       16
        25       36       49       64
        81      100      121     144
    >> 2.^A
    ans =
         2        4       8      16
        32       64     128     256
       512     1024    2048    4096
    >> A.^B
    ans =
         1        2       3       4
        25       36      49      64
       729    1000    1331    1728

6.数组操作函数

MATLAB中提供了大量库函数对数组进行特定的操作,如表2-16所示。

表2-16 对数组进行特定操作的库函数

【例2-70】 操作数组函数样例。 2B5mnAbtybQuRXdsvlaKEbytU0a5ylrzpOouMWX3HLGiSWa1QN6ShfZX0anOZ9c1

    >> A=[1,2;3,4];
    >> B=[5,6;7,8];
    >> cat(1,A,B)
    ans =
         1     2
         3     4
         5     6
         7     8
    >> cat(2,A,B)
    ans =
         1     2     5     6
         3     4     7     8
    >> A=rand(5)
    A =
        0.0592    0.8744    0.7889    0.3200    0.2679
        0.6029    0.0150    0.4387    0.9601    0.4399
        0.0503    0.7680    0.4983    0.7266    0.9334
        0.4154    0.9708    0.2140    0.4120    0.6833
        0.3050    0.9901    0.6435    0.7446    0.2126
    >> x=diag(A,1)
    x =
        0.8744
        0.4387
        0.7266
        0.6833
    >> B=diag(x,1)
    B =
              0    0.8744         0          0          0
              0         0    0.4387          0          0
              0         0         0     0.7266          0
              0         0         0          0     0.6833
              0         0         0          0          0
    A =
        0.0592    0.8744    0.7889    0.3200    0.2679
        0.6029    0.0150    0.4387    0.9601    0.4399
        0.0503    0.7680    0.4983    0.7266    0.9334
        0.4154    0.9708    0.2140    0.4120    0.6833
        0.3050    0.9901    0.6435    0.7446    0.2126
    >> C=flipud(B)
    C =
              0          0          0          0          0
              0          0          0          0     0.6833
              0          0          0     0.7266          0
              0          0     0.4387          0          0
              0     0.8744          0          0          0
    >> D=fliplr(B)
    D =
              0          0          0     0.8744          0
              0          0     0.4387          0          0
              0     0.7266          0          0          0
         0.6833          0          0          0          0
              0          0          0          0          0
    >> A=randn(2)
    A =
       -0.4326    0.1253
       -1.6656    0.2877
    >> B=repmat(A,1,2)
    B =
       -0.4326    0.1253   -0.4326    0.1253
       -1.6656    0.2877   -1.6656    0.2877
    >> C=reshape(B,4,2)
    C =
       -0.4326   -0.4326
       -1.6656   -1.6656
        0.1253    0.1253
        0.2877    0.2877
    >> size(C)
    ans =
         4     2
    >> size(C,1)
    ans =
         4
点击中间区域
呼出菜单
上一章
目录
下一章
×