数组基本操作
文章目录
有 * 号我暂时不知道有什么用,可先不管。
一般使用方括号 “[ ]” 、逗号 “ , ” 或空格、分号 “ ; ” 来创建数组。方括号中为数组元素,元素间用逗号或空格分隔,不同行之间用分号分隔。与一般编程语言不同,此语言数组下标从1开始。
数组简单的创建
A=[]; %空数组
A=[1 2,3]; %三个元素的数组
A=[1;2;3];%三行,每行一个数
A=1:2:5;%1为首项,每次加2,到小于等于5,为1 3 5
A=1:4; %1开始,默认间隔为1,到小于等于4
A=linspace(1,2,4);% 1到2平均分为四个数1.0000,1.3333,1.6667,2.0000
A=logspace(0,log10(32),6);
%(首项,末项,总项数),10^首项到10^末项包含n个元素的等比一维数组。
%不指定n时默认为50, 上结果为1.0000 2.0000 4.0000 8.0000 16.0000 32.0000
A=[1,2,3,4,5;6:10;linspace(11,15,5)];%3*5数组
A=[[1:5];[linspace(6,10,5);[11 12 13 14 15]];
%此虽然看上去比上一条多三对括号,但实际效果相同。
A(2,2,2)=1;%圆括号指示下标,没有A数组时新建三维数组,使(2,2,2)为1.(当然也能设为0,则全零数组)
数组拼接
横、纵向拼接
比如我们想将两个1601603图片肩并肩拼在一起。
B(160,160,3)=1;
C(160,160,3)=2;%就当是两个图片
C=[C,B];%把B拼在C右边。
B=[B,C];%再把C拼在B右边
如果想要竖着拼,把中间的逗号改为分号就好。
经测试,拼接时维度要一样(即第三维度相等,横着拼时行要一样,纵着拼时列要一样)。
低维到高维直接拼接
D2=[1 2 3;4 5 6,7 8 9];
D3(:,:,1)=D2;%只有一个冒号的代表此维度。
D3(:,:,2)=2*D2;
D3(:,:,3)=3*D2; %这样三层2维数组拼成一个3维数组。
%当然也可以拼n维数组,只要可以弄清楚,比如D4=(:,:,1,1)=D2;或者D4=(:,:,:,1)=D3;
cat函数拼接
cat有一个好用之处就在于它可以进行同纬度的拼接,如将三个3*3*3数组拼成3*3*9数组。
先说低维拼高维
直接借用之前已经设好的三维数组D3拼4维的数组
D4=cat(4,D3,D3*2,D3*3); %用3维数组拼4维的,得到3*3*3*3的数组
%也可以用其他维数数组拼。由于拼接位置在第四维,故会默认创建一个只有一个元素的第三维度。如把本条的D3改为D2,则会得到D4(:,:,1,1)、D4(:,:,1,2)、D4(:,:,1,3),前两个维度的内容就是D2内容。
再说同维度拼接(在最高维度上)
D31=cat(3,D3,D3*2,D3*3); %可以得到3*3*9的矩阵
数组重复堆砌*
使用repmat ( A, [m, n, p…] )来重复拼数组(不用中括号,一个维度一个逗号也行)。A为要堆的数组,后方框中为地1、2、3…个维度需要堆砌的个数。例子如下:
A=[1,2;3,4];
B=repmat(A,[2,3,4]); %下面是B的展示
%B(:,:,1) =
% 1 2 1 2 1 2
% 3 4 3 4 3 4
% 1 2 1 2 1 2
% 3 4 3 4 3 4
% 一共有4层。
数组变形*
reshape
使用reshape ( A, [m, n, p…] ) 来把之前的A变为各维度分别为m,n,p 的数组。数据数必须与之前相同。
规则为从A(1,1,1)开始,一列一列数,再一层一层数,按照同样的顺序排列。如[1 2 3 4; 5 6 7 8; 9 10 11 12]顺序为1 5 9 2 6 10 3 7 11 4 8 12。
>>B=reshape(A,[2,2,3])
B(:,:,1) =
1 9
5 2
B(:,:,2) =
6 3
10 7
B(:,:,3) =
11 8
4 12
squeeze
这个函数可以将某些只有一个元素的维度去掉。比如之前cat函数中拼出的D4,第三维度只有一个元素,于是运行后第四维就能变成第三维度。
D32=squeeze(D4); %这是用法
permute与ipermute
permute函数可以将高维数组的维度调换顺序。ipermute则是permute的逆操作。使用方法为:
>> A=randn(3,3,2)
A(:,:,1) =
0.2877 1.1892 0.1746
-1.1465 -0.0376 -0.1867
1.1909 0.3273 0.7258
A(:,:,2) =
-0.5883 0.1139 -0.0956
2.1832 1.0668 -0.8323
-0.1364 0.0593 0.2944
>> B=permute(A,[3,1,2])%新的第1、2、3维度分别是原来的3、1、2维度。
B(:,:,1) =
0.2877 -1.1465 1.1909
-0.5883 2.1832 -0.1364
B(:,:,2) =
1.1892 -0.0376 0.3273
0.1139 1.0668 0.0593
B(:,:,3) =
0.1746 -0.1867 0.7258
-0.0956 -0.8323 0.2944
>> ipermute(B,[3,1,2])
ans(:,:,1) =
0.2877 1.1892 0.1746
-1.1465 -0.0376 -0.1867
1.1909 0.3273 0.7258
ans(:,:,2) =
-0.5883 0.1139 -0.0956
2.1832 1.0668 -0.8323
-0.1364 0.0593 0.2944
标准数组创建
A=zeros(3,2); %3行2列零数组
B=ones(2,4); %2行4列一数组
C=eye(4); %4*4单位矩阵,但不能建高维的(应该也算数组吧...)
D=magic(5); %5阶幻方,不能建高维的(就是行列斜线和相等那个)
E=randn(3,4); %3*4平均数为0,单位方差的随机数组
F=rand(3,4); 0到1的3*4数组
G=gallery(5); %一个有趣的函数,可以生成特定特征的矩阵。
获取多维数组属性以及一些简单计算
获取一些数组信息:
size(A); %按照行、列、页的顺序返回数组每一维度大小。
ndims(A); %返回数组A的维度值
whos %显示当前工作区各变量详细信息。
有关数组的简单计算:
sum对第一个不为1的维度上的向量进行求和。
sin、cos等为对每一个元素进行的计算。