MATLAB多维数组操作指南

在Matlab中习惯性的会将二维数组中的第一维称为“行”第二维称为“列”,而对于三维数组的第三位则是习惯性的称为“页”。在Matlab中将三维及三维以上的数组统称为高维数组,三维数组也是高级运算的基础,本文将介绍三种创建三维数组的方法。

1、多维数组

第三维称为页,需要注意的是每一页存放的二维数组维度要一致,也就是行列数要一致。


1234567​​a=[1,2;​​​​3,4];​​​​b=[2,2;​​​​5,6];​​​​A(:,:,1)=a;​​​​A(:,:,2)=b;​​​​A(:,:,3)=a;​​

这样就得到的A三维数组为2*2*3double

2、结构体数组

(我学这个的目的是为了将不同维度的二维数组存放在一块,将不同的二维数组赋值给新的数组,方便循环遍历)

结构体数组定义--赋值方式或者用struct


12345678910111213​​a=[1,2;​​​​3,4];​​​​b=[1,2;​​​​5,6;​​​​7,7];​​​​gmmdata(1)=​​​​struct​​​​(​​​​'cluster'​​​​,a); ​​​​gmmdata(2)=​​​​struct​​​​(​​​​'cluster'​​​​,b); ​​​​gmmdata(1)​​​​c=gmmdata(1).cluster​​​​text​​​​(1).cluster=a;​​​​%cluster为结构体中一个名字​​​​text​​​​(2).cluster=b;​​​​text​​​​(2)​​​​d=​​​​text​​​​(2).cluster​​


使用下标创建三维数组

  1. 1
    在Matlab命令框中输入以下代码可以创建简单的三维数组:
    for i=1:2
    for j=1:2
    for k=1:2
    A(i,j,k)=i+j+k;
    end
    end
    end
  2. 2
    要查看程序结果。在命令窗口中输入变量名称按【Enter】,即可得到相应的结果。如
    输入:A(:,:,1)
    得到:
    ans =
    3     4
    4     5
    输入:A(:,:,2)
    得到:ans =
    4     5
    5     6

    END


使用低维数组创建三维数组

  1. 1
    我们可以先输入一个二维数组,然后通过第三维数组与其关系生成第三维数组,例如输入以下代码可以生成三维数组:
    D2=[1,2,3;4,5,6;7,8,9];
    D3(:,:,1)=D2;
    D3(:,:,2)=2*D2;
    D3(:,:,3)=3*D2;
  2. 2
    要查看程序结果。
    输入:D2 并按【Enter】可以查看输入的二维数组。
    得到:
    D2 =
    1     2     3
    4     5     6
    7     8     9
    输入:D3 并按【Enter】可以查看生成的三维数组。
    D3(:,:,1) =
    1     2     3
    4     5     6
    7     8     9
    D3(:,:,2) =
    2     4     6
    8    10    12
    14    16    18
    D3(:,:,3) =
    3     6     9
    12    15    18
    21    24    27

    END


使用创建函数创建三维数组

  1. 1
    使用Cat命令来创建高维数组。Cat命令的个事为【C=cat(dim,A1,A2,A3,A4……)】其中dim表示的是创建数组的维度,A1,A2,A3,A4表示的是各维度上的数组。在命令窗口中输入以下代码即可创建一个简单的三维数组:
    D2=[1,2,3;4,5,6;7,8,9];
    C=cat(3,D2,2*D2,3*D2);
  2. 2
    要查看程序结果
    输入:C(:,:,1) 并按【Enter】
    得到:
    ans =
    1     2     3
    4     5     6
    7     8     9
    输入:C(:,:,2) 并按【Enter】
    得到:
    ans =
    2     4     6
    8    10    12
    14    16    18
    输入:C(:,:,3) 并按【Enter】
    得到:
    ans =
    3     6     9
    12    15    18
    21    24    27
  3. 3
    还可以利用【repmat】命令以及【reshape】命令在生成高维数组,因为用到的概率不涉及很高这里不一一阐述。
  4. 1.一个三维数组由行、列和页三维组成,其中每一页包含一个由行和列构成的二维数组。
    2.利用标准数组函数创建多维数组
    A=zeros(4,3,2) 生成一个4行3列2页的三维全0数组,ones,rand和randn等函数有相似的用法。
    3.利用直接索引方式生成多维数组
    A=zeros(2,3)
    A(:,:,2)=ones(2,3)
    A(:,:,3)=4
    上面的代码先生成一个二维数组作为三维数组的第一页,然后通过数组直接索引,添加第二页、第三页。
    4.利用函数reshape和repmat生成多维数组
    B=reshape(A,2,9)
    B=[A(:,:,1) A(:,:,2) A(:,:,3)]  %结果与上面一样。
    reshape(B,2,3,3)
    reshape(B,[2 3 3])              %结果与上面一样。
    提示:reshape函数可以将任何维数的数组转变成其他维数的数组。
    5.利用repmat函数生成多维数组
    C=ones(2,3)
    repmat(C,[1 1 3]) % repmat写出类似reshape的repmat(C,1,1,3)将显示出错
    提示:repmat是通过数组复制创建多维数组的,上面的代码即是将数组C在行维和列维分别复制一次,然后再页维复制三次得到2×3×3的三维数组。
    6.利用cat函数创建多维数组
    a=zeros(2);
    b=ones(2);
    c=repmat(2,2,2);
    D=cat(3,a,b,c)%创建三维数组
    D=cat(4,a,b,c)  %创建4维数组。
    D(:,1,:,:)      %查看第一列的数据。
    size(D)     %可以知道数组D的具体维数。
    6.数组运算与处理
    数组之间的运算要求两个数组在任何一维都必须具有相同的大小。
    (1)squeeze函数用于删除多维数组中的单一维(即大小为1的那些维)
    E=squeeze(D)
    size(D) E的数据和D一样,但比D少了一维,只有2行、2列和3页。
    (2)reshape函数可以将一个三维向量变成一维向量。
    v(1,1,:)=1:6
    squeeze(v)
    v(:)
    (3)reshape函数用于改变多维数组的行、列、页以及更高阶的维数,但不改变数组元素的总个数。
    F=cat(3,2+zeros(2,4),ones(2,4),zeros(2,4))
    G=reshape(F,[3,2,4])
    H=reshape(F,[4 3 2])  或K=reshape(F,2,12)
    多维数组的重组按这样的顺序:第一页的第一列、第二列……,第二页的第一列、第二列……。
    7.sub2ind函数和ind2sub函数用于多维数组的直接引用,索引顺序与重组顺序一致。
    sub2ind(size(F),1,1,1)  %求第1行、第1列、第1页的数值的单一索引
    sub2ind(size(F),1,2,1)  %求第1行、第2列、第1页的数值的单一索引
    sub2ind(size(F),1,2,3)  %求第1行、第2列、第3页的数值的单一索引

    [r c p]=ind2sub(size(F),19) %由单一索引求其对应的行列页数值。
    8.函数flipdim用于多维数组的翻转,相当于二维数组中的flipud和fliplr函数。例如下面的代码进行按行、列和按页翻转。
    M=reshape(1:18,2,3,3)
    flipdim(M,1)  %每一页中的行翻转
    flipdim(M,2)  %每一页中的列翻转
    flipdim(M,3)  %将第一和第三页翻转调换
    9.函数shiftdim用于循环轮换一个数组的维数。如果一个数组r行、c列和p页,则循环轮换一次,就生成一个c行、p列和r页的数组。
    M %重新调用
    shiftdim(M,1) %轮换一次
    shiftdim(M,2) %轮换两次
    数组轮换后规律很难直观理解,我们可以将三维数组看成一个类似魔方的方形盒子
    函数shiftdim也支持负的循环轮换次数。执行该轮换时,数组的维数增加,并且多出的维数均为单一维。
    M %重新调用
    size(M)
    shiftdim(M,-1)
    size(ans).
    10.函数permute和ipermute用于实现多维条件下的转置操作。从本质上讲permute函数是shiftdimhas函数的扩展。
    M %重新调用
    permute(M,[2 3 1])
    shiftdim(M,1)     %两者结果一样
    permute函数中的参数[2 3 1]表示使函数第二维成为第一维,第三维成为第二维,第一维成为第三维。
    11. permute(M,[2 1 3])
    [2 1 3]表示将数组的行列相互转置,页保持不变(只在第一和第二维转置)。
    permute函数的第一个参数为待转置的数组,第二个参数为转置顺序,它必须是待转置的多维数组的维数的某种排列,否则所进行的转置无法进行。
    permute函数也可以用来将一个数组变成更高维的数组,例如shiftdim(M,-1)也可以用permute函数来实现。
    permute(M,[4 1 2 3])
    这是 因为任何一个数组都具有大于其本身尺寸的更高维数,并且这些维数均为单一维数。例如二维数组具有页这一维,只是只有一页。总之超过数组本身大小的维数都是单一维。M是一个三维数组,其第四维必为单一维,因此将M的第四维与第一维转置,第一维变成了单一维。
    12.二维数组两次转置变换回原来的形式,对于多维数组,用函数ipermute来取消permute所执行的转置操作。
    M %重新调用
    permute(M,[3 2 1])
    ipermute(M,[3 2 1]) %在我的Matlab上运行没有达到预期效果
    13.size函数返回数组每一维的大小
    numel函数返回数组的总元素个数
    当不指定size的返回值时,将返回一个由数组的各维数组成的向量。当我们知道数组的维数时,可以将维数返回到指定变量中。
    [r c p]=size(M)
    r=size(M,1)
    c=size(M,2)
    p=size(M,3)
    v=size(M,4)
    当一个数组的维数或者某数组维数不确定时,可以利用函数ndims获得数组的维数值。例如:ndims(M),与length(size(M))等效。
    多维数组常用函数:
函数描述
ones(r,c,…),zeros(r,c,…)rand(r,c,…),randn(r,c,…)创建多维数组的基本函数,分别创建全1、全0.随机(0-1之间)和随机正态分布的多维数组。
reshape(B,2,3,3)reshape(B,[2 3 3])将一个数组变形成任意维数的数组
repmat(C,[1 1 3])将一个数组复制成一个任意维数的数组
cat(3,a,b,c)沿着一个指定的维将数组连接起来
squeeze(D)删除大小等于1的维,即单一维。
sub2ind(size(F),1,1,1)[r,c,p]=ind2sub(size(F),19)将下标转化为单一索引值将单一索引值转化成下标
flipdim(M,1)沿着一个指定的维轮换顺序。等效于二维数组中的flippud和fliplr函数
shiftdim(M,2)循环轮换。第二个参数为正的情况下,进行各维的循环轮换;若为负数,将数组的维数增加。
permute(M,[2 1 3])iprmute(M,[2 1 3])多维数组的转置操作,前者为转置操作,后者为取消转置操作。
size(M)[r,c,p]=size(M)返回各维的大小
r=size(M,1)返回行数
c=size(M,2)返回列数
p=size(M,3)返回页数
ndims(M)获取数组的维数
numel(M)获取数组的元素总个数


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空