精华内容
下载资源
问答
  • 由于更多维的数组的显示并不直观,所以本节以三维数组为例来介绍多维数组的使用。8.1 多维数组的创建创建多维数组最常用的方法有以下4种。(1)直接通过“全下标”元素赋值的方式创建多维数组。(2)由若...

    8  多维数组

    在实际应用的过程中,经常需要构造多于二维的数组,我们将多于二维的数组统称为多维数组。

    对于二维数组,人们习惯于把数组的第1维称为“行”,把第2维称为“列”,我们将第3维称为“页”。

    由于更多维的数组的显示并不直观,所以本节以三维数组为例来介绍多维数组的使用。

    8.1  多维数组的创建

    创建多维数组最常用的方法有以下4种。

    (1)直接通过“全下标”元素赋值的方式创建多维数组。

    (2)由若干同样尺寸的二维数组组合成多维数组。

    (3)由函数ones、zeros、rand、randn等直接创建特殊多维数组。

    (4)借助cat、repmat、reshape等函数构建多维数组。

    【例2-26】  采用“全下标”元素赋值方式创建多维数组示例。

    >> A(3,3,3)=1                %  创建3*3*3数组,未赋值元素默认设置为0

    A(:,:,1) =

         0     0    0

         0     0    0

         0     0    0

    A(:,:,2) =

         0    0     0

         0     0    0

         0     0    0

    A(:,:,3) =

         0     0    0

         0     0    0

         0     0    1

    >> B(3,4,:)=1:4              % 创建3*4*4数组

    B(:,:,1) =

         0     0    0     0

         0     0    0     0

         0     0    0     1

    B(:,:,2) =

         0     0    0     0

         0     0    0     0

         0     0    0     2

    B(:,:,3) =

         0     0    0     0

         0     0    0     0

         0     0    0     3

    B(:,:,4) =

         0     0    0     0

         0     0    0     0

         0     0    0     4

    【例2-27】  由二维数组合成多维数组示例。

    >> clear

    >> A(:,:,1)=magic(4);                %  创建数组A1页的数据

    >> A(:,:,2)=ones(4);                 %  创建数组A2页的数据

    >> A(:,:,3)=zeros(4)                 %  创建数组A3页的数据

    A(:,:,1) =

        16     2    3    13

         5    11   10     8

         9    7     6    12

         4    14   15     1

    A(:,:,2) =

         1     1    1     1

         1     1    1     1

         1     1    1     1

         1     1    1     1

    A(:,:,3) =

         0     0    0     0

         0     0    0     0

         0     0    0     0

         0     0    0     0

    【例2-28】  由函数rand直接创建特殊多维数组示例。

    >> rand('state', 0);        % 设置随机种子,便于读者验证

    >> B=rand(3,4,3)

    B(:,:,1) =

       0.9501    0.4860    0.4565   0.4447

       0.2311    0.8913    0.0185   0.6154

       0.6068    0.7621    0.8214   0.7919

    B(:,:,2) =

        0.9218    0.4057   0.4103    0.3529

       0.7382    0.9355    0.8936   0.8132

       0.1763    0.9169    0.0579   0.0099

    B(:,:,3) =

       0.1389    0.6038    0.0153   0.9318

       0.2028    0.2722    0.7468   0.4660

       0.1987    0.1988    0.4451   0.4186

    【例2-29】  借助cat函数构建多维数组示例。

    >>B=cat(3,ones(2,3),ones(2,3)*2,ones(2,3)*3)

    B(:,:,1) =

         1     1    1

         1     1    1

    B(:,:,2) =

         2     2    2

         2     2    2

    B(:,:,3) =

         3     3    3

         3     3    3 

    cat指令第1个输入变量填写的数字“表示扩展方向的维号”。本例第1个输入变量是3,表示“沿第3维方向扩展”。为了对比下面我们分别演示使用cat函数沿其他方向进行扩展的情况。

    >>B=cat(2,ones(2,3),ones(2,3)*2,ones(2,3)*3)        % 沿第2维方向扩展

    B =

         1    1     1     2    2     2     3    3     3

         1    1     1     2    2     2     3    3     3

    >>B=cat(1,ones(2,3),ones(2,3)*2,ones(2,3)*3)       % 沿第1维方向扩展

    B =

         1    1     1

         1    1     1

         2    2     2

         2    2     2

         3    3     3

         3    3     3

    >>B=cat(4,ones(2,3),ones(2,3)*2,ones(2,3)*3)       % 沿第4维方向扩展

    B(:,:,1,1) =

         1    1     1

         1    1     1

    B(:,:,1,2) =

         2    2     2

         2    2     2

    B(:,:,1,3) =

         3    3     3

         3    3     3

    【例2-30】  借助repmat函数构建多维数组示例。

    >> repmat([1,2;3,4;5,6],[1,2,3])

    ans(:,:,1) =

         1     2    1     2

         3     4    3     4

         5     6    5     6

    ans(:,:,2) =

         1     2    1     2

         3     4    3     4

         5     6    5     6

    ans(:,:,3) =

         1     2    1     2

         3     4    3     4

         5     6    5     6

    repmat函数的第1个输入变量是构成多维数组的源数组。第2个输入变量是指定向各维方向上扩展的源数组个数。本例中输入变量[1,2,3]是指将源数组在行方向上扩展为1个,在列方向上扩展为2个,在页方向上扩展为3个。

    【例2-31】  借助reshape函数构建多维数组示例。

    >> A=reshape(1:60,5,4,3)

    A(:,:,1) =

         1     6   11    16

         2     7   12    17

         3     8   13    18

         4     9   14    19

         5    10   15    20

    A(:,:,2) =

        21    26   31    36

        22    27   32    37

        23    28   33    38

        24    29   34    39

        25    30   35    40

    A(:,:,3) =

        41    46   51    56

        42    47   52    57

        43    48   53    58

        44    49   54    59

        45    50   55    60

    >> B=reshape(A,4,5,3)

    B(:,:,1) =

         1     5    9    13    17

         2     6   10    14    18

         3     7   11    15    19

         4     8   12    16    20

    B(:,:,2) =

        21    25   29    33    37

        22    26   30    34    38

        23    27   31    35    39

        24    28   32    36    40

    B(:,:,3) =

        41    45   49    53    57

        42    46   50    54    58

        43    47   51    55    59

        44    48   52    56    60

    reshape的第1个输入变量是源数组,第234个输入变量是要生成的数组的行数、列数和页数。将要生成的数组必须和源数组的元素的个数相同。重组时,元素排列遵循“单下标”编号规则:第1页的第1列接该页的第2列,直至第1页最后一列。在第1页排列结束后,开始排列第2页的第1列,依次类推,直至所有的元素排列结束。

    8.2 多维数组的寻访与重构

    1.多维数组的寻访

    多维数组的寻访和二维数组一样,可以使用“全下标”、“单下标”和“逻辑下标”来寻访。“全下标”和“逻辑下标”两种形式与二维数组相同,是以非常直观的形式来表现的,这里不再赘述。而多维数组的“单下标”就比较复杂一点。本小节对此进行介绍。

    多维数组的“单下标”其实就是二维数组“单下标”的扩展,换句话说,二维数组的“单下标”编排方式是“单下标”的一种简单形式。用语言表示就是:将数组“全下标”格式中的各维按照出现的先后顺序依次循环,直至将所有的数据编排成为一列。

    【例2-32】  多维数组“单下标”排列示例。

    >> a=ones(2,2,2,2)             % 创建全为12*2*2*2四维数组a

    a(:,:,1,1) =

         1     1

         1     1

    a(:,:,2,1) =

         1     1

         1     1

    a(:,:,1,2) =

         1     1

         1     1

    a(:,:,2,2) =

         1     1

         1     1

    >> a(1:16)=1:16                %  按照单下标形式为数组a赋值

    a(:,:,1,1) =

         1     3

         2     4

    a(:,:,2,1) =

         5     7

         6     8

    a(:,:,1,2) =

         9    11

        10    12

    a(:,:,2,2) =

        13    15

        14    16

    从得到结果中的数组a被赋值以后的各元素分布,可以看出多维数组是如何按照“全下标”的各维顺序来存储数据的。

    2.多维数组的重构

    除了前面介绍的可以用来进行多维数组的重构函数catrepmatreshape之外,还有其他一些函数可用来进行多维数组的重构,详见表2-10

    2-10     多维数组重构函数

    函数形式

    函数功能

    函数形式

    函数功能

    permute

    广义非共轭转置

    flipdim

    以指定维交换对称位置上的元素

    ipermute

    广义反转置,permute的反操作

    shiftdim

    维移动函数

    【例2-33】  多维数组元素对称交换函数flipdim使用示例。

    >> A=reshape(1:18,2,3,3)            % 创建演示三维数组

    A(:,:,1) =

         1     3    5

         2     4    6

    A(:,:,2) =

         7     9   11

         8    10   12

    A(:,:,3) =

        13    15   17

        14    16   18

    >> B=flipdim(A,1)                    %  以第1维进行对称变换

    B(:,:,1) =

         2     4    6

         1     3    5

    B(:,:,2) =

         8    10   12

         7     9   11

    B(:,:,3) =

        14    16   18

        13    15   17

    >> C=flipdim(A,3)                    %  以第3维进行对称变换

    C(:,:,1) =

        13    15   17

        14    16   18

    C(:,:,2) =

         7     9   11

         8    10   12

    C(:,:,3) =

         1     3    5

         2     4    6

    从本例可以看出,函数flipdim(A,k)中的输入变量k就是指进行对称变换的维。另外flipdim(A,k)函数也可用于二维数组,读者可以自行验证。

    【例2-34】  多维数组元素维移动函数shiftdim使用示例。

    本例在上例所建立的三维数组A上进行演示。

    >> D=shiftdim(A,1)      %  将各维向左移动1位,使2*3*3数组变成3*3*2数组

    D(:,:,1) =

         1     7   13

         3     9   15

         5    11   17

    D(:,:,2) =

         2     8   14

         4    10   16

         6    12   18

    >> E=shiftdim(A,2)      %  将各维向左移动2位,使2*3*3数组变成3*2*3数组

    E(:,:,1) =

         1     2

         7     8

        13    14

    E(:,:,2) =

         3     4

         9    10

        15    16

    E(:,:,3) =

         5     6

        11    12

        17    18

    运算D=shiftdim(A,1)实现以下操作:D(j,k,i)=A(i,j,k)i, j, k分别是指各维的下标。对于三维数组,D=shiftdim(A,3)的操作就等同于简单的D=A

    【例2-35】  多维数组元素广义非共轭函数permute使用示例。

    本例在上例所建立的三维数组A上进行演示。

    >> F=permute(A,[3 2 1])

    F(:,:,1) =

         1     3    5

         7     9   11

        13    15   17

    F(:,:,2) =

         2     4    6

         8    10   12

        14    16   18

    >> G=permute(A,[3 1 2])

    G(:,:,1) =

         1     2

         7     8

        13    14

    G(:,:,2) =

         3     4

         9    10

        15    16

    G(:,:,3) =

         5     6

        11    12

        17    18

    运算F=permute(A, [3 2 1])实现以下操作:F(k,j,i)=A(i,j,k)i, j, k分别是指各维的下标。函数permute就是函数shiftdim的特殊形式,它可以任意指定维的移动顺序。

     2cd605be81666a99d5af557c2909c354.png

    展开全文
  • 由于更多维的数组的显示并不直观,所以本节以三维数组为例来介绍多维数组的使用。8.1 多维数组的创建创建多维数组最常用的方法有以下4种。(1)直接通过“全下标”元素赋值的方式创建多维数组。(2)由若干同样尺寸...

    8  多维数组

    在实际应用的过程中,经常需要构造多于二维的数组,我们将多于二维的数组统称为多维数组。

    对于二维数组,人们习惯于把数组的第1维称为“行”,把第2维称为“列”,我们将第3维称为“页”。

    由于更多维的数组的显示并不直观,所以本节以三维数组为例来介绍多维数组的使用。

    8.1  多维数组的创建

    创建多维数组最常用的方法有以下4种。

    (1)直接通过“全下标”元素赋值的方式创建多维数组。

    (2)由若干同样尺寸的二维数组组合成多维数组。

    (3)由函数ones、zeros、rand、randn等直接创建特殊多维数组。

    (4)借助cat、repmat、reshape等函数构建多维数组。

    【例2-26】  采用“全下标”元素赋值方式创建多维数组示例。

    >> A(3,3,3)=1                %  创建3*3*3数组,未赋值元素默认设置为0

    A(:,:,1) =

    0     0    0

    0     0    0

    0     0    0

    A(:,:,2) =

    0    0     0

    0     0    0

    0     0    0

    A(:,:,3) =

    0     0    0

    0     0    0

    0     0    1

    >> B(3,4,:)=1:4              % 创建3*4*4数组

    B(:,:,1) =

    0     0    0     0

    0     0    0     0

    0     0    0     1

    B(:,:,2) =

    0     0    0     0

    0     0    0     0

    0     0    0     2

    B(:,:,3) =

    0     0    0     0

    0     0    0     0

    0     0    0     3

    B(:,:,4) =

    0     0    0     0

    0     0    0     0

    0     0    0     4

    【例2-27】  由二维数组合成多维数组示例。

    >> clear

    >> A(:,:,1)=magic(4);                %  创建数组A第1页的数据

    >> A(:,:,2)=ones(4);                 %  创建数组A第2页的数据

    >> A(:,:,3)=zeros(4)                 %  创建数组A第3页的数据

    A(:,:,1) =

    16     2    3    13

    5    11   10     8

    9    7     6    12

    4    14   15     1

    A(:,:,2) =

    1     1    1     1

    1     1    1     1

    1     1    1     1

    1     1    1     1

    A(:,:,3) =

    0     0    0     0

    0     0    0     0

    0     0    0     0

    0     0    0     0

    【例2-28】  由函数rand直接创建特殊多维数组示例。

    >> rand('state', 0);        % 设置随机种子,便于读者验证

    >> B=rand(3,4,3)

    B(:,:,1) =

    0.9501    0.4860    0.4565   0.4447

    0.2311    0.8913    0.0185   0.6154

    0.6068    0.7621    0.8214   0.7919

    B(:,:,2) =

    0.9218    0.4057   0.4103    0.3529

    0.7382    0.9355    0.8936   0.8132

    0.1763    0.9169    0.0579   0.0099

    B(:,:,3) =

    0.1389    0.6038    0.0153   0.9318

    0.2028    0.2722    0.7468   0.4660

    0.1987    0.1988    0.4451   0.4186

    【例2-29】  借助cat函数构建多维数组示例。

    >>B=cat(3,ones(2,3),ones(2,3)*2,ones(2,3)*3)

    B(:,:,1) =

    1     1    1

    1     1    1

    B(:,:,2) =

    2     2    2

    2     2    2

    B(:,:,3) =

    3     3    3

    3     3    3

    cat指令第1个输入变量填写的数字“表示扩展方向的维号”。本例第1个输入变量是3,表示“沿第3维方向扩展”。为了对比下面我们分别演示使用cat函数沿其他方向进行扩展的情况。

    >>B=cat(2,ones(2,3),ones(2,3)*2,ones(2,3)*3)% 沿第2维方向扩展

    B =

    1    1     1     2    2     2     3    3     3

    1    1     1     2    2     2     3    3     3

    >>B=cat(1,ones(2,3),ones(2,3)*2,ones(2,3)*3)% 沿第1维方向扩展

    B =

    1    1     1

    1    1     1

    2    2     2

    2    2     2

    3    3     3

    3    3     3

    >>B=cat(4,ones(2,3),ones(2,3)*2,ones(2,3)*3)% 沿第4维方向扩展

    B(:,:,1,1) =

    1    1     1

    1    1     1

    B(:,:,1,2) =

    2    2     2

    2    2     2

    B(:,:,1,3) =

    3    3     3

    3    3     3

    【例2-30】  借助repmat函数构建多维数组示例。

    >> repmat([1,2;3,4;5,6],[1,2,3])

    ans(:,:,1) =

    1     2    1     2

    3     4    3     4

    5     6    5     6

    ans(:,:,2) =

    1     2    1     2

    3     4    3     4

    5     6    5     6

    ans(:,:,3) =

    1     2    1     2

    3     4    3     4

    5     6    5     6

    repmat函数的第1个输入变量是构成多维数组的源数组。第2个输入变量是指定向各维方向上扩展的源数组个数。本例中输入变量[1,2,3]是指将源数组在行方向上扩展为1个,在列方向上扩展为2个,在页方向上扩展为3个。

    【例2-31】  借助reshape函数构建多维数组示例。

    >> A=reshape(1:60,5,4,3)

    A(:,:,1) =

    1     6   11    16

    2     7   12    17

    3     8   13    18

    4     9   14    19

    5    10   15    20

    A(:,:,2) =

    21    26   31    36

    22    27   32    37

    23    28   33    38

    24    29   34    39

    25    30   35    40

    A(:,:,3) =

    41    46   51    56

    42    47   52    57

    43    48   53    58

    44    49   54    59

    45    50   55    60

    >> B=reshape(A,4,5,3)

    B(:,:,1) =

    1     5    9    13    17

    2     6   10    14    18

    3     7   11    15    19

    4     8   12    16    20

    B(:,:,2) =

    21    25   29    33    37

    22    26   30    34    38

    23    27   31    35    39

    24    28   32    36    40

    B(:,:,3) =

    41    45   49    53    57

    42    46   50    54    58

    43    47   51    55    59

    44    48   52    56    60

    reshape的第1个输入变量是源数组,第2、3、4个输入变量是要生成的数组的行数、列数和页数。将要生成的数组必须和源数组的元素的个数相同。重组时,元素排列遵循“单下标”编号规则:第1页的第1列接该页的第2列,直至第1页最后一列。在第1页排列结束后,开始排列第2页的第1列,依次类推,直至所有的元素排列结束。

    8.2 多维数组的寻访与重构

    1.多维数组的寻访

    多维数组的寻访和二维数组一样,可以使用“全下标”、“单下标”和“逻辑下标”来寻访。“全下标”和“逻辑下标”两种形式与二维数组相同,是以非常直观的形式来表现的,这里不再赘述。而多维数组的“单下标”就比较复杂一点。本小节对此进行介绍。

    多维数组的“单下标”其实就是二维数组“单下标”的扩展,换句话说,二维数组的“单下标”编排方式是“单下标”的一种简单形式。用语言表示就是:将数组“全下标”格式中的各维按照出现的先后顺序依次循环,直至将所有的数据编排成为一列。

    【例2-32】  多维数组“单下标”排列示例。

    >> a=ones(2,2,2,2)             % 创建全为1的2*2*2*2四维数组a

    a(:,:,1,1) =

    1     1

    1     1

    a(:,:,2,1) =

    1     1

    1     1

    a(:,:,1,2) =

    1     1

    1     1

    a(:,:,2,2) =

    1     1

    1     1

    >> a(1:16)=1:16                %  按照单下标形式为数组a赋值

    a(:,:,1,1) =

    1     3

    2     4

    a(:,:,2,1) =

    5     7

    6     8

    a(:,:,1,2) =

    9    11

    10    12

    a(:,:,2,2) =

    13    15

    14    16

    从得到结果中的数组a被赋值以后的各元素分布,可以看出多维数组是如何按照“全下标”的各维顺序来存储数据的。

    2.多维数组的重构

    除了前面介绍的可以用来进行多维数组的重构函数cat、repmat和reshape之外,还有其他一些函数可用来进行多维数组的重构,详见表2-10。

    表2-10     多维数组重构函数函数形式函数功能函数形式函数功能

    permute广义非共轭转置flipdim以指定维交换对称位置上的元素

    ipermute广义反转置,permute的反操作shiftdim维移动函数

    【例2-33】  多维数组元素对称交换函数flipdim使用示例。

    >> A=reshape(1:18,2,3,3)            % 创建演示三维数组

    A(:,:,1) =

    1     3    5

    2     4    6

    A(:,:,2) =

    7     9   11

    8    10   12

    A(:,:,3) =

    13    15   17

    14    16   18

    >> B=flipdim(A,1)                    %  以第1维进行对称变换

    B(:,:,1) =

    2     4    6

    1     3    5

    B(:,:,2) =

    8    10   12

    7     9   11

    B(:,:,3) =

    14    16   18

    13    15   17

    >> C=flipdim(A,3)                    %  以第3维进行对称变换

    C(:,:,1) =

    13    15   17

    14    16   18

    C(:,:,2) =

    7     9   11

    8    10   12

    C(:,:,3) =

    1     3    5

    2     4    6

    从本例可以看出,函数flipdim(A,k)中的输入变量k就是指进行对称变换的维。另外flipdim(A,k)函数也可用于二维数组,读者可以自行验证。

    【例2-34】  多维数组元素维移动函数shiftdim使用示例。

    本例在上例所建立的三维数组A上进行演示。

    >> D=shiftdim(A,1)      %  将各维向左移动1位,使2*3*3数组变成3*3*2数组

    D(:,:,1) =

    1     7   13

    3     9   15

    5    11   17

    D(:,:,2) =

    2     8   14

    4    10   16

    6    12   18

    >> E=shiftdim(A,2)      %  将各维向左移动2位,使2*3*3数组变成3*2*3数组

    E(:,:,1) =

    1     2

    7     8

    13    14

    E(:,:,2) =

    3     4

    9    10

    15    16

    E(:,:,3) =

    5     6

    11    12

    17    18

    运算D=shiftdim(A,1)实现以下操作:D(j,k,i)=A(i,j,k),i, j, k分别是指各维的下标。对于三维数组,D=shiftdim(A,3)的操作就等同于简单的D=A。

    【例2-35】  多维数组元素广义非共轭函数permute使用示例。

    本例在上例所建立的三维数组A上进行演示。

    >> F=permute(A,[3 2 1])

    F(:,:,1) =

    1     3    5

    7     9   11

    13    15   17

    F(:,:,2) =

    2     4    6

    8    10   12

    14    16   18

    >> G=permute(A,[3 1 2])

    G(:,:,1) =

    1     2

    7     8

    13    14

    G(:,:,2) =

    3     4

    9    10

    15    16

    G(:,:,3) =

    5     6

    11    12

    17    18

    运算F=permute(A, [3 2 1])实现以下操作:F(k,j,i)=A(i,j,k),i, j, k分别是指各维的下标。函数permute就是函数shiftdim的特殊形式,它可以任意指定维的移动顺序。

    展开全文
  • 由于更多维的数组的显示并不直观,所以本节以三维数组为例来介绍多维数组的使用。8.1 多维数组的创建创建多维数组最常用的方法有以下4种。(1)直接通过“全下标”元素赋值的方式创建多维数组。(2)由若干同样尺寸...

    8 多维数组

    在实际应用的过程中,经常需要构造多于二维的数组,我们将多于二维的数组统称为多维数组。

    对于二维数组,人们习惯于把数组的第1维称为“行”,把第2维称为“列”,我们将第3维称为“页”。

    由于更多维的数组的显示并不直观,所以本节以三维数组为例来介绍多维数组的使用。

    8.1 多维数组的创建

    创建多维数组最常用的方法有以下4种。

    (1)直接通过“全下标”元素赋值的方式创建多维数组。

    (2)由若干同样尺寸的二维数组组合成多维数组。

    (3)由函数ones、zeros、rand、randn等直接创建特殊多维数组。

    (4)借助cat、repmat、reshape等函数构建多维数组。

    【例2-26】 采用“全下标”元素赋值方式创建多维数组示例。

    >> A(3,3,3)=1 % 创建3*3*3数组,未赋值元素默认设置为0

    A(:,:,1) =

    0 0 0

    0 0 0

    0 0 0

    A(:,:,2) =

    0 0 0

    0 0 0

    0 0 0

    A(:,:,3) =

    0 0 0

    0 0 0

    0 0 1

    >> B(3,4,:)=1:4 % 创建3*4*4数组

    B(:,:,1) =

    0 0 0 0

    0 0 0 0

    0 0 0 1

    B(:,:,2) =

    0 0 0 0

    0 0 0 0

    0 0 0 2

    B(:,:,3) =

    0 0 0 0

    0 0 0 0

    0 0 0 3

    B(:,:,4) =

    0 0 0 0

    0 0 0 0

    0 0 0 4

    【例2-27】 由二维数组合成多维数组示例。

    >> clear

    >> A(:,:,1)=magic(4); % 创建数组A第1页的数据

    >> A(:,:,2)=ones(4); % 创建数组A第2页的数据

    >> A(:,:,3)=zeros(4) % 创建数组A第3页的数据

    A(:,:,1) =

    16 2 3 13

    5 11 10 8

    9 7 6 12

    4 14 15 1

    A(:,:,2) =

    1 1 1 1

    1 1 1 1

    1 1 1 1

    1 1 1 1

    A(:,:,3) =

    0 0 0 0

    0 0 0 0

    0 0 0 0

    0 0 0 0

    【例2-28】 由函数rand直接创建特殊多维数组示例。

    >> rand('state', 0); % 设置随机种子,便于读者验证

    >> B=rand(3,4,3)

    B(:,:,1) =

    0.9501 0.4860 0.4565 0.4447

    0.2311 0.8913 0.0185 0.6154

    0.6068 0.7621 0.8214 0.7919

    B(:,:,2) =

    0.9218 0.4057 0.4103 0.3529

    0.7382 0.9355 0.8936 0.8132

    0.1763 0.9169 0.0579 0.0099

    B(:,:,3) =

    0.1389 0.6038 0.0153 0.9318

    0.2028 0.2722 0.7468 0.4660

    0.1987 0.1988 0.4451 0.4186

    【例2-29】 借助cat函数构建多维数组示例。

    >>B=cat(3,ones(2,3),ones(2,3)*2,ones(2,3)*3)

    B(:,:,1) =

    1 1 1

    1 1 1

    B(:,:,2) =

    2 2 2

    2 2 2

    B(:,:,3) =

    3 3 3

    3 3 3

    cat指令第1个输入变量填写的数字“表示扩展方向的维号”。本例第1个输入变量是3,表示“沿第3维方向扩展”。为了对比下面我们分别演示使用cat函数沿其他方向进行扩展的情况。

    >>B=cat(2,ones(2,3),ones(2,3)*2,ones(2,3)*3) % 沿第2维方向扩展

    B =

    1 1 1 2 2 2 3 3 3

    1 1 1 2 2 2 3 3 3

    >>B=cat(1,ones(2,3),ones(2,3)*2,ones(2,3)*3) % 沿第1维方向扩展

    B =

    1 1 1

    1 1 1

    2 2 2

    2 2 2

    3 3 3

    3 3 3

    >>B=cat(4,ones(2,3),ones(2,3)*2,ones(2,3)*3) % 沿第4维方向扩展

    B(:,:,1,1) =

    1 1 1

    1 1 1

    B(:,:,1,2) =

    2 2 2

    2 2 2

    B(:,:,1,3) =

    3 3 3

    3 3 3

    【例2-30】 借助repmat函数构建多维数组示例。

    >> repmat([1,2;3,4;5,6],[1,2,3])

    ans(:,:,1) =

    1 2 1 2

    3 4 3 4

    5 6 5 6

    ans(:,:,2) =

    1 2 1 2

    3 4 3 4

    5 6 5 6

    ans(:,:,3) =

    1 2 1 2

    3 4 3 4

    5 6 5 6

    repmat函数的第1个输入变量是构成多维数组的源数组。第2个输入变量是指定向各维方向上扩展的源数组个数。本例中输入变量[1,2,3]是指将源数组在行方向上扩展为1个,在列方向上扩展为2个,在页方向上扩展为3个。

    【例2-31】 借助reshape函数构建多维数组示例。

    >> A=reshape(1:60,5,4,3)

    A(:,:,1) =

    1 6 11 16

    2 7 12 17

    3 8 13 18

    4 9 14 19

    5 10 15 20

    A(:,:,2) =

    21 26 31 36

    22 27 32 37

    23 28 33 38

    24 29 34 39

    25 30 35 40

    A(:,:,3) =

    41 46 51 56

    42 47 52 57

    43 48 53 58

    44 49 54 59

    45 50 55 60

    >> B=reshape(A,4,5,3)

    B(:,:,1) =

    1 5 9 13 17

    2 6 10 14 18

    3 7 11 15 19

    4 8 12 16 20

    B(:,:,2) =

    21 25 29 33 37

    22 26 30 34 38

    23 27 31 35 39

    24 28 32 36 40

    B(:,:,3) =

    41 45 49 53 57

    42 46 50 54 58

    43 47 51 55 59

    44 48 52 56 60

    reshape的第1个输入变量是源数组,第2、3、4个输入变量是要生成的数组的行数、列数和页数。将要生成的数组必须和源数组的元素的个数相同。重组时,元素排列遵循“单下标”编号规则:第1页的第1列接该页的第2列,直至第1页最后一列。在第1页排列结束后,开始排列第2页的第1列,依次类推,直至所有的元素排列结束。

    8.2 多维数组的寻访与重构

    1.多维数组的寻访

    多维数组的寻访和二维数组一样,可以使用“全下标”、“单下标”和“逻辑下标”来寻访。“全下标”和“逻辑下标”两种形式与二维数组相同,是以非常直观的形式来表现的,这里不再赘述。而多维数组的“单下标”就比较复杂一点。本小节对此进行介绍。

    多维数组的“单下标”其实就是二维数组“单下标”的扩展,换句话说,二维数组的“单下标”编排方式是“单下标”的一种简单形式。用语言表示就是:将数组“全下标”格式中的各维按照出现的先后顺序依次循环,直至将所有的数据编排成为一列。

    【例2-32】 多维数组“单下标”排列示例。

    >> a=ones(2,2,2,2) % 创建全为1的2*2*2*2四维数组a

    a(:,:,1,1) =

    1 1

    1 1

    a(:,:,2,1) =

    1 1

    1 1

    a(:,:,1,2) =

    1 1

    1 1

    a(:,:,2,2) =

    1 1

    1 1

    >> a(1:16)=1:16 % 按照单下标形式为数组a赋值

    a(:,:,1,1) =

    1 3

    2 4

    a(:,:,2,1) =

    5 7

    6 8

    a(:,:,1,2) =

    9 11

    10 12

    a(:,:,2,2) =

    13 15

    14 16

    从得到结果中的数组a被赋值以后的各元素分布,可以看出多维数组是如何按照“全下标”的各维顺序来存储数据的。

    2.多维数组的重构

    除了前面介绍的可以用来进行多维数组的重构函数cat、repmat和reshape之外,还有其他一些函数可用来进行多维数组的重构,详见表2-10。

    表2-10 多维数组重构函数

    函数形式

    函数功能

    函数形式

    函数功能

    permute

    广义非共轭转置

    flipdim

    以指定维交换对称位置上的元素

    ipermute

    广义反转置,permute的反操作

    shiftdim

    维移动函数

    【例2-33】 多维数组元素对称交换函数flipdim使用示例。

    >> A=reshape(1:18,2,3,3) % 创建演示三维数组

    A(:,:,1) =

    1 3 5

    2 4 6

    A(:,:,2) =

    7 9 11

    8 10 12

    A(:,:,3) =

    13 15 17

    14 16 18

    >> B=flipdim(A,1) % 以第1维进行对称变换

    B(:,:,1) =

    2 4 6

    1 3 5

    B(:,:,2) =

    8 10 12

    7 9 11

    B(:,:,3) =

    14 16 18

    13 15 17

    >> C=flipdim(A,3) % 以第3维进行对称变换

    C(:,:,1) =

    13 15 17

    14 16 18

    C(:,:,2) =

    7 9 11

    8 10 12

    C(:,:,3) =

    1 3 5

    2 4 6

    从本例可以看出,函数flipdim(A,k)中的输入变量k就是指进行对称变换的维。另外flipdim(A,k)函数也可用于二维数组,读者可以自行验证。

    【例2-34】 多维数组元素维移动函数shiftdim使用示例。

    本例在上例所建立的三维数组A上进行演示。

    >> D=shiftdim(A,1) % 将各维向左移动1位,使2*3*3数组变成3*3*2数组

    D(:,:,1) =

    1 7 13

    3 9 15

    5 11 17

    D(:,:,2) =

    2 8 14

    4 10 16

    6 12 18

    >> E=shiftdim(A,2) % 将各维向左移动2位,使2*3*3数组变成3*2*3数组

    E(:,:,1) =

    1 2

    7 8

    13 14

    E(:,:,2) =

    3 4

    9 10

    15 16

    E(:,:,3) =

    5 6

    11 12

    17 18

    运算D=shiftdim(A,1)实现以下操作:D(j,k,i)=A(i,j,k),i, j, k分别是指各维的下标。对于三维数组,D=shiftdim(A,3)的操作就等同于简单的D=A。

    【例2-35】 多维数组元素广义非共轭函数permute使用示例。

    本例在上例所建立的三维数组A上进行演示。

    >> F=permute(A,[3 2 1])

    F(:,:,1) =

    1 3 5

    7 9 11

    13 15 17

    F(:,:,2) =

    2 4 6

    8 10 12

    14 16 18

    >> G=permute(A,[3 1 2])

    G(:,:,1) =

    1 2

    7 8

    13 14

    G(:,:,2) =

    3 4

    9 10

    15 16

    G(:,:,3) =

    5 6

    11 12

    17 18

    运算F=permute(A, [3 2 1])实现以下操作:F(k,j,i)=A(i,j,k),i, j, k分别是指各维的下标。函数permute就是函数shiftdim的特殊形式,它可以任意指定维的移动顺序。

    展开全文
  • MATLAB多维数组

    千次阅读 2019-01-04 12:39:22
    由于更多维的数组的显示并不直观,所以本节以三维数组为例来介绍多维数组的使用。8.1  多维数组的创建创建多维数组最常用的方法有以下4种。(1)直接通过“全下标”元素赋值的方式创建多维数组。...

    8  多维数组在实际应用的过程中,经常需要构造多于二维的数组,我们将多于二维的数组统称为多维数组。对于二维数组,人们习惯于把数组的第1维称为“行”,把第2维称为“列”,我们将第3维称为“页”。由于更多维的数组的显示并不直观,所以本节以三维数组为例来介绍多维数组的使用。8.1  多维数组的创建创建多维数组最常用的方法有以下4种。(1)直接通过“全下标”元素赋值的方式创建多维数组。(2)由若干同样尺寸的二维数组组合成多维数组。(3)由函数ones、zeros、rand、randn等直接创建特殊多维数组。(4)借助cat、repmat、reshape等函数构建多维数组。【例2-26】  采用“全下标”元素赋值方式创建多维数组示例。>> A(3,3,3)=1                %  创建333数组,未赋值元素默认设置为0A(:,:,1) =     0     0    0     0     0    0     0     0    0A(:,:,2) =     0    0     0     0     0    0     0     0    0A(:,:,3) =     0     0    0     0     0    0     0     0    1>> B(3,4,:)=1:4              % 创建344数组B(:,:,1) =     0     0    0     0     0     0    0     0     0     0    0     1B(:,:,2) =     0     0    0     0     0     0    0     0     0     0    0     2B(:,:,3) =     0     0    0     0     0     0    0     0     0     0    0     3B(:,:,4) =     0     0    0     0     0     0    0     0     0     0    0     4【例2-27】  由二维数组合成多维数组示例。>> clear>> A(:,:,1)=magic(4);                %  创建数组A第1页的数据>> A(:,:,2)=ones(4);                 %  创建数组A第2页的数据>> A(:,:,3)=zeros(4)                 %  创建数组A第3页的数据A(:,:,1) =    16     2    3    13     5    11   10     8     9    7     6    12     4    14   15     1A(:,:,2) =     1     1    1     1     1     1    1     1     1     1    1     1     1     1    1     1A(:,:,3) =     0     0    0     0     0     0    0     0     0     0    0     0     0     0    0     0【例2-28】  由函数rand直接创建特殊多维数组示例。>> rand(‘state’, 0);        % 设置随机种子,便于读者验证>> B=rand(3,4,3)B(:,:,1) =   0.9501    0.4860    0.4565   0.4447   0.2311    0.8913    0.0185   0.6154   0.6068    0.7621    0.8214   0.7919B(:,:,2) =    0.9218    0.4057   0.4103    0.3529   0.7382    0.9355    0.8936   0.8132   0.1763    0.9169    0.0579   0.0099B(:,:,3) =   0.1389    0.6038    0.0153   0.9318   0.2028    0.2722    0.7468   0.4660   0.1987    0.1988    0.4451   0.4186【例2-29】  借助cat函数构建多维数组示例。>>B=cat(3,ones(2,3),ones(2,3)2,ones(2,3)3)B(:,:,1) =     1     1    1     1     1    1B(:,:,2) =     2     2    2     2     2    2B(:,:,3) =     3     3    3     3     3    3 cat指令第1个输入变量填写的数字“表示扩展方向的维号”。本例第1个输入变量是3,表示“沿第3维方向扩展”。为了对比下面我们分别演示使用cat函数沿其他方向进行扩展的情况。>>B=cat(2,ones(2,3),ones(2,3)2,ones(2,3)3)        % 沿第2维方向扩展B =     1    1     1     2    2     2     3    3     3     1    1     1     2    2     2     3    3     3>>B=cat(1,ones(2,3),ones(2,3)2,ones(2,3)3)       % 沿第1维方向扩展B =     1    1     1     1    1     1     2    2     2     2    2     2     3    3     3     3    3     3>>B=cat(4,ones(2,3),ones(2,3)2,ones(2,3)3)       % 沿第4维方向扩展B(:,:,1,1) =     1    1     1     1    1     1B(:,:,1,2) =     2    2     2     2    2     2B(:,:,1,3) =     3    3     3     3    3     3【例2-30】  借助repmat函数构建多维数组示例。>> repmat([1,2;3,4;5,6],[1,2,3])ans(:,:,1) =     1     2    1     2     3     4    3     4     5     6    5     6ans(:,:,2) =     1     2    1     2     3     4    3     4     5     6    5     6ans(:,:,3) =     1     2    1     2     3     4    3     4     5     6    5     6repmat函数的第1个输入变量是构成多维数组的源数组。第2个输入变量是指定向各维方向上扩展的源数组个数。本例中输入变量[1,2,3]是指将源数组在行方向上扩展为1个,在列方向上扩展为2个,在页方向上扩展为3个。【例2-31】  借助reshape函数构建多维数组示例。>> A=reshape(1:60,5,4,3)A(:,:,1) =     1     6   11    16     2     7   12    17     3     8   13    18     4     9   14    19     5    10   15    20A(:,:,2) =    21    26   31    36    22    27   32    37    23    28   33    38    24    29   34    39    25    30   35    40A(:,:,3) =    41    46   51    56    42    47   52    57    43    48   53    58    44    49   54    59    45    50   55    60>> B=reshape(A,4,5,3)B(:,:,1) =     1     5    9    13    17     2     6   10    14    18     3     7   11    15    19     4     8   12    16    20B(:,:,2) =    21    25   29    33    37    22    26   30    34    38    23    27   31    35    39    24    28   32    36    40B(:,:,3) =    41    45   49    53    57    42    46   50    54    58    43    47   51    55    59    44    48   52    56    60reshape的第1个输入变量是源数组,第2、3、4个输入变量是要生成的数组的行数、列数和页数。将要生成的数组必须和源数组的元素的个数相同。重组时,元素排列遵循“单下标”编号规则:第1页的第1列接该页的第2列,直至第1页最后一列。在第1页排列结束后,开始排列第2页的第1列,依次类推,直至所有的元素排列结束。8.2 多维数组的寻访与重构1.多维数组的寻访多维数组的寻访和二维数组一样,可以使用“全下标”、“单下标”和“逻辑下标”来寻访。“全下标”和“逻辑下标”两种形式与二维数组相同,是以非常直观的形式来表现的,这里不再赘述。而多维数组的“单下标”就比较复杂一点。本小节对此进行介绍。多维数组的“单下标”其实就是二维数组“单下标”的扩展,换句话说,二维数组的“单下标”编排方式是“单下标”的一种简单形式。用语言表示就是:将数组“全下标”格式中的各维按照出现的先后顺序依次循环,直至将所有的数据编排成为一列。【例2-32】  多维数组“单下标”排列示例。>> a=ones(2,2,2,2)             % 创建全为1的2222四维数组aa(:,:,1,1) =     1     1     1     1a(:,:,2,1) =     1     1     1     1a(:,:,1,2) =     1     1     1     1a(:,:,2,2) =     1     1     1     1>> a(1:16)=1:16                %  按照单下标形式为数组a赋值a(:,:,1,1) =     1     3     2     4a(:,:,2,1) =     5     7     6     8a(:,:,1,2) =     9    11    10    12a(:,:,2,2) =    13    15    14    16从得到结果中的数组a被赋值以后的各元素分布,可以看出多维数组是如何按照“全下标”的各维顺序来存储数据的。2.多维数组的重构除了前面介绍的可以用来进行多维数组的重构函数cat、repmat和reshape之外,还有其他一些函数可用来进行多维数组的重构,详见表2-10。表2-10     多维数组重构函数函数形式函数功能函数形式函数功能permute广义非共轭转置flipdim以指定维交换对称位置上的元素ipermute广义反转置,permute的反操作shiftdim维移动函数【例2-33】  多维数组元素对称交换函数flipdim使用示例。>> A=reshape(1:18,2,3,3)            % 创建演示三维数组A(:,:,1) =     1     3    5     2     4    6A(:,:,2) =     7     9   11     8    10   12A(:,:,3) =    13    15   17    14    16   18>> B=flipdim(A,1)                    %  以第1维进行对称变换B(:,:,1) =     2     4    6     1     3    5B(:,:,2) =     8    10   12     7     9   11B(:,:,3) =    14    16   18    13    15   17>> C=flipdim(A,3)                    %  以第3维进行对称变换C(:,:,1) =    13    15   17    14    16   18C(:,:,2) =     7     9   11     8    10   12C(:,:,3) =     1     3    5     2     4    6从本例可以看出,函数flipdim(A,k)中的输入变量k就是指进行对称变换的维。另外flipdim(A,k)函数也可用于二维数组,读者可以自行验证。【例2-34】  多维数组元素维移动函数shiftdim使用示例。本例在上例所建立的三维数组A上进行演示。>> D=shiftdim(A,1)      %  将各维向左移动1位,使233数组变成332数组D(:,:,1) =     1     7   13     3     9   15     5    11   17D(:,:,2) =     2     8   14     4    10   16     6    12   18>> E=shiftdim(A,2)      %  将各维向左移动2位,使233数组变成32*3数组E(:,:,1) =     1     2     7     8    13    14E(:,:,2) =     3     4     9    10    15    16E(:,:,3) =     5     6    11    12    17    18运算D=shiftdim(A,1)实现以下操作:D(j,k,i)=A(i,j,k),i, j, k分别是指各维的下标。对于三维数组,D=shiftdim(A,3)的操作就等同于简单的D=A。【例2-35】  多维数组元素广义非共轭函数permute使用示例。本例在上例所建立的三维数组A上进行演示。>> F=permute(A,[3 2 1])F(:,:,1) =     1     3    5     7     9   11    13    15   17F(:,:,2) =     2     4    6     8    10   12    14    16   18>> G=permute(A,[3 1 2])G(:,:,1) =     1     2     7     8    13    14G(:,:,2) =     3     4     9    10    15    16G(:,:,3) =     5     6    11    12    17    18运算F=permute(A, [3 2 1])实现以下操作:F(k,j,i)=A(i,j,k),i, j, k分别是指各维的下标。函数permute就是函数shiftdim的特殊形式,它可以任意指定维的移动顺序。

    展开全文
  • 由于更多维的数组的显示并不直观,所以本节以三维数组为例来介绍多维数组的使用。8.1 多维数组的创建创建多维数组最常用的方法有以下4种。(1)直接通过“全下标”元素赋值的方式创建多维数组。(2)由若...
  • MATLAB数组运算及数组化编程

    千次阅读 2020-03-03 21:58:04
    维数组元素的寻访.数组运算非数的问题 前言 编程语言的编译执行有俩种: 解释型语言:按照源程序中的语句顺序,直接的逐句进行分析解释,并立即执行。 编译型语言:先把源代码全部翻译为目标代码,然后运行目标...
  • cat(MATLAB

    千次阅读 2015-03-30 15:56:07
    cat(Concatenate的缩写)是matlab中的一个函数,用于构造多维数组。在matlab的命令窗口中键入doc cat或者help cat就可以获得该...dim为1时,构造一维数组:[A,B],dim为2时构造二维数组[A,B],n=3时则可以构造三维
  • matlab—cat函数

    千次阅读 2016-06-12 15:53:46
    调用格式 C = cat(dim,A,B) C = cat(dim,A1,A2,A3,A4,...) dim为1时,将矩阵上下拼接:[A;B],dim为2时,将矩阵左右拼接:[A,B],dim=3时则可以构造三维数组
  • matlab-cat函数

    2016-10-15 14:15:47
    功能:用于联结数组。 格式: C = cat(dim,A,B) C = cat(dim,A1,A2,A3,A4,…) ... dim = 3,构造三维数组。在新的矩阵中第1、2维就是A和B这两个矩阵的行数和列数,第3维是A和B这两个矩阵的矩阵个数,即
  • MATLAB矩阵分列自相关矩阵

    千次阅读 2013-12-10 21:41:59
    然而,这样计算时,一方面三维矩阵在MATLAB中的操作并不如二维矩阵那么方便,另一方面,循环计算的效率很低。为了方便计算,可以将每一列的自相关矩阵组合存到一个大的二维数组B中,以A为例,该数组的维数是(3*2)*...
  • matlab新手入门

    2021-03-31 19:33:23
    视频来源b站BV13D4y1Q7RS 文章目录:     1.matlab前言 ...三维立体绘图1     12.三维立体绘图2     13.论文的图形导出&寄语 2.界面认识: 右侧为工作区 用于存放并显示数据(未截图) 创建编辑
  • 四、 7.2.4 三维数据的其他表现形式命令 35 第 3 节 通用图形函数命令 41 一、 7.3.1 图形对象句柄命令 41 二、 7.3.2 轴的产生和控制命令 51 三、 图形句柄操作命令 51 四、 7.3.4 图形窗口的控制...
  • 3.3 数组构造 3.4 数组方向 3.5 标量数组运算 3.6 数组-数组运算 3.7 数组操作 3.8 子数组查找 3.9 数组大小 3.10 数组操作函数 3.11 M文件举例 第4章 矩阵运算和函数 4.1 线性方程组 4.2 矩阵函数 4.3 特殊矩阵 4.4...
  • Matlab基础及应用教程

    2018-09-03 19:54:43
    MATLAB 数值运算.............................65 3.1 多项式...................................................65 3.1.1 多项式的表达和创建...............65 3.1.2 多项式的四则运算...................65 ...
  • Python中的numpy数组有一个Reshape方法,我们时常使用,...首先构造一个【5,4,3】的三维矩阵a,具体数值如下图所示然后将其reshape成【5,12】的矩阵,看到底是如何变化的在reshape中未加order参数时,结果如下图所示...
  • 第1章MATLAB7.0简介 1.1MATLAB的特点 1.1.1MATLAB的基本特点 ...MATLAB的帮助系统 1.3.1帮助浏览器 1.3.2help函数和doc函数 第2章数组和矩阵 2.1表达式 2.1.1变量 2.1.2数值表示 2.1.3...
  • 3.4.8 mesh 绘制三维网格图/92 3.5 神经网络工具箱/92 3.5.1 工具箱函数基本介绍/93 3.5.2 神经网络对象与属性/95 第 2 篇 原理篇 第 4 章 单层感知器( 教学视频:27 分钟)/104 4.1 单层感知器的结构/104 4.2 单层...
  • 5.3 三维图形绘制 5.3.1 曲线图绘制 5.3.2 网格图绘制 5.3.3 曲面图的绘制 5.3.4 光照模型 5.3.5 绘制等值线图 5.4 四维图形可视化 5.4.1 用颜色描述第四维 5.4.2 其他函数 5.5 本章小结 第2 篇 第...
  • 5.3 三维图形绘制 5.3.1 曲线图绘制 5.3.2 网格图绘制 5.3.3 曲面图的绘制 5.3.4 光照模型 5.3.5 绘制等值线图 5.4 四维图形可视化 5.4.1 用颜色描述第四维 5.4.2 其他函数 5.5 本章小结 第2 篇 第...
  • 2.5 一维数组的切片与索引 23 2.6 处理数组形状 24 2.6.1 堆叠数组 27 2.6.2 拆分NumPy数组 30 2.6.3 NumPy数组的属性 33 2.6.4 数组的转换 39 2.7 创建数组的视图和拷贝 40 2.8 花式索引 41 2.9 基于位置...
  • MATLAB和Mathematica、Maple并称为大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程...
  • 机器学习算法Python实现 ... - 将每行的数据调整成图像的矩阵,放进二维数组 - 显示即可 ''' pad = 1 display_array = -np.ones((pad+10*(20+pad),pad+10*(20+pad))) for i in range(10): for j in range(10): ...
  • 面向对象高级知识 - “大支柱” / 类与类之间的关系 / 垃圾回收 / 魔术属性和方法 / 混入 / 元类 / 面向对象设计原则 / GoF设计模式 迭代器和生成器 - 相关魔术方法 / 创建生成器的两种方式 / 并发和异步编程 - 多...

空空如也

空空如也

1 2
收藏数 23
精华内容 9
关键字:

matlab构造三维数组

matlab 订阅