PSYCHTOOLBOX工具箱及MATLAB编程实例
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第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