第5章 实验设计常用MATLAB函数
5.1 矩阵数组操作类函数
5.1.1 数组排序:sort
(1)B = sort(A)
(2)B = sort(A,dim)
(3)B = sort(...,mode)
(4)[B,IX] = sort(A,...)
对向量、矩阵或数组A进行排序,并将排序结果存于变量B中。如果是矩阵,其中参数dim指定是在列方向(1)还是行方向(2)上进行排序(默认为列方向),mode参数指定排序的升降(ascend=升序,descend=降序),返回值IX中储存排序结果B中各个元素在排序前A中索引位置,并有如下关系:B=A(IX)。
例如:
>> a=rand(3)↙
a = 0.8147 0.9134 0.2785 0.9058 0.6324 0.5469 0.1270 0.0975 0.9575
>> sort(a,2)↙
ans = 0.2785 0.8147 0.9134 0.5469 0.6324 0.9058 0.0975 0.1270 0.9575
>> sort(a,'descend')↙
ans = 0.9058 0.9134 0.9575 0.8147 0.6324 0.5469 0.1270 0.0975 0.2785
>> [b,ix]=sort(a)↙
b = 0.1270 0.0975 0.2785 0.8147 0.6324 0.5469 0.9058 0.9134 0.9575 ix = 3 3 1 1 2 2 2 1 3
5.1.2 数组行排序:sortrows
(1)B = sortrows(A)
(2)B = sortrows(A,column)
(3)[B,index] = sortrows(A,...)
按照指定列为关键列进行排序,如指定第1列和第3列为关键列,则首先以第1列的大小排序,当第1列的值相同时,则以第3列的大小排序,并且当指定的列的序号为正时,按升序排;当指定的列的序号为负时,按降序排。A为拟排序的数组,column为关键列向量,排序后的结果存储于变量B中,index为排序结果元素在原数组A中的索引,有如下关系:B=A(index)。
例如:
>> a=randi([10 100],[4 5])↙
a = 97 54 93 13 78 24 82 82 87 77 98 22 97 94 45 97 48 69 71 69
>> sortrows(a)↙
ans = 24 82 82 87 77 97 48 69 71 69 97 54 93 13 78 98 22 97 94 45
>> sortrows(a,[-1 -2])↙
ans = 98 22 97 94 45 97 54 93 13 78 97 48 69 71 69 24 82 82 87 77
5.1.3 矩阵旋转:rot90
(1)B = rot90(A)
(2)B = rot90(A,k)
将矩阵A逆时针旋转90度,或者逆时针旋转k×90度,其中k为整数。如果k为负数,则顺时针旋转。
例如:
>> a=rand(4)↙
a = 0.8147 0.6324 0.9575 0.9572 0.9058 0.0975 0.9649 0.4854 0.1270 0.2785 0.1576 0.8003 0.9134 0.5469 0.9706 0.1419
>> rot90(a)↙
ans = 0.9572 0.4854 0.8003 0.1419 0.9575 0.9649 0.1576 0.9706 0.6324 0.0975 0.2785 0.5469
0.8147 0.9058 0.1270 0.9134
>> rot90(a,2)↙
ans = 0.1419 0.9706 0.5469 0.9134 0.8003 0.1576 0.2785 0.1270 0.4854 0.9649 0.0975 0.9058 0.9572 0.9575 0.6324 0.8147
>> rot90(a,-1)↙
ans = 0.9134 0.1270 0.9058 0.8147 0.5469 0.2785 0.0975 0.6324 0.9706 0.1576 0.9649 0.9575 0.1419 0.8003 0.4854 0.9572
5.1.4 矩阵左右/上下翻转:fliplr/flipud
(1)B = fliplr(A)
(2)B = flipud(A)
将矩阵左右或上下进行翻转。
例如:
>> a=randi([10 20],[3 4])↙
a = 14 20 19 18 20 17 20 18 18 10 17 14
>> fliplr(a)↙
ans = 18 19 20 14 18 20 17 20 14 17 10 18
>> flipud(a)↙
ans = 18 10 17 14 20 17 20 18 14 20 19 18
5.1.5 矩阵水平/垂直拼接:horzcat/vertcat
(1)C = horzcat(A1, A2, ...)
(2)C = vertcat(A1, A2, ...)
将矩阵在列方向(水平)或行方向(垂直)上拼接。
例如:
>> a=randi([1 5], [2 3])↙
a = 1 2 2 1 5 5
>> b=randi([10 50], [2 3])↙
b =
19 24 20 48 18 35
>> c=randi([100 200], [2 3])↙
c = 147 183 155 135 159 192
>> horzcat(a,b,c)↙
ans = 1 2 2 19 24 20 147 183 155 1 5 5 48 18 35 135 159 192
>> vertcat(a,b,c)↙
ans = 1 2 2 1 5 5 19 24 20 48 18 35 147 183 155 135 159 192
5.1.6 数组的重复:repmat
(1)B = repmat(A,m,n)
(2)B = repmat(A,[m n])
(3)B = repmat(A,[m n p...])
将数组A的内容在行方向上重复m次,在列方向上重复n次,还可以构造多维数组,即在第三维上重复p次,等等。
例如:
>> a=rand(2)↙
a = 0.7792 0.1299 0.9340 0.5688
>> repmat(a,2,2)↙
ans = 0.7792 0.1299 0.7792 0.1299 0.9340 0.5688 0.9340 0.5688 0.7792 0.1299 0.7792 0.1299 0.9340 0.5688 0.9340 0.5688
>> repmat(a,[1,2,2])↙
ans(:,:,1) = 0.7792 0.1299 0.7792 0.1299 0.9340 0.5688 0.9340 0.5688 ans(:,:,2) = 0.7792 0.1299 0.7792 0.1299 0.9340 0.5688 0.9340 0.5688
5.1.7 数组维数变更:reshape
(1)B = reshape(A,m,n)
(2)B = reshape(A,m,n,p,...)
将数组A调整为m行n列,但调整前后元素的个数须相等,即prod(size(A))=m×n或prod(size(A))=m×n×p。
例如:
>> a=rand(3,4)↙
a = 0.4694 0.1622 0.5285 0.2630 0.0119 0.7943 0.1656 0.6541 0.3371 0.3112 0.6020 0.6892
>> reshape(a,2,6)↙
ans = 0.4694 0.3371 0.7943 0.5285 0.6020 0.6541 0.0119 0.1622 0.3112 0.1656 0.2630 0.6892
5.1.8 获取数组维数:size
(1)d = size(X)
(2)[m,n] = size(X)
(3)m = size(X,dim)
获取数组或矩阵X的维数,返回值可以为一向量(d)或者分别存储单独的变量(m,n),也可以通过dim指定获取的行或列。
例如:
>> x=rand(4,6)↙
x = 0.6551 0.9597 0.7513 0.8909 0.1493 0.8143 0.1626 0.3404 0.2551 0.9593 0.2575 0.2435 0.1190 0.5853 0.5060 0.5472 0.8407 0.9293 0.4984 0.2238 0.6991 0.1386 0.2543 0.3500
>> size(x)↙
ans = 4 6
>> [m,n]=size(x)↙
m = 4 n = 6
>> size(x,1)↙
ans = 4
5.1.9 获取矩阵长度:length
numberOfElements = length(array)
获取数组维数最大值(行数或列数最大值)。
例如:
>> x=rand(3,5,12,8);↙ >> length(x)↙
ans = 12
5.1.10 获取数组元素数:numel
(1)n = numel(A)
(2)n = numel(A, index1, index2, ... indexn)
获取数组(A)包含的元素个数。
例如:
>> x=rand(3,5,12,8);↙ >> numel(x)↙
ans = 1440
>> numel(x,1,:)↙
ans = 480
5.1.11 获取数组的维度数:ndims
n = ndims(A)
获取数组A所包含的维度数,即是二维数组还是三维数组。
例如:
>> x=rand(3,5,12,8);↙ >> ndims(x)↙
ans = 4
5.1.12 两个常用矩阵:ones/zeros
(1)Y = ones(n)
(2)Y = ones(m,n)
(3)Y = ones([m n])
(4)Y = ones(m,n,p,...)
(5)B = zeros(n)
(6)B = zeros(m,n)
(7)B = zeros([m n])
(8)B = zeros(m,n,p,...)
构建值全为1或全为0的矩阵,如果指定一个参数,则为方阵,也可以通过参数m,n,p等指定多维数组。
例如:
>> x=zeros(3)↙
x = 0 0 0 0 0 0 0 0 0
>> y=ones(3,4)↙
y = 1 1 1 1 1 1 1 1 1 1 1 1
5.1.13 生成等间隔向量:linspace
(1)y = linspace(a,b)
(2)y = linspace(a,b,n)
将[a b]区间进行n等分,如果省略参数n,则进行100等分。
例如:
>> linspace(3,5,6)↙
ans = 3.0000 3.4000 3.8000 4.2000 4.6000 5.0000
5.1.14 生成网格:meshgrid
(1)[X,Y] = meshgrid(x,y)
(2)[X,Y] = meshgrid(x)
(3)[X,Y,Z] = meshgrid(x,y,z)
生成二维或三维网格。
例如:
>> [x y]=meshgrid(-3:3,-3:3)↙
x = -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 y = -3 -3 -3 -3 -3 -3 -3 -2 -2 -2 -2 -2 -2 -2 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3