MATLAB-数组

2022-07-27 09:15:19 浏览数 (1)

之前,我们讨论了很多关于MATLAB向量和矩阵的知识,在本章中,我们将讨论多维数组。在MATLAB中所有的数据类型的变量是多维数组,向量是一个一维阵列,矩阵是一个二维数组。

首先,我们先来看一些特殊类型的数组。

MATLAB中的特殊阵列

MATLAB中会使用一些函数来建立一些特殊的阵列,对于所有这些函数,一个参数创建一个正方形阵列,双参数创建矩形阵列。

使用 zeros() 函数建立一个元素为零的数组:

例如:

代码语言:javascript复制
zeros(5)

MATLAB 执行上述语句,返回以下结果:

代码语言:javascript复制
ans =
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0

使用 ones() 函数建立一个数组:

例如:

代码语言:javascript复制
ones(4,3)

MATLAB执行上述语句,返回以下结果:

代码语言:javascript复制
ans =
     1     1     1
     1     1     1
     1     1     1
     1     1     1

使用 eye() 函数创建一个矩阵:

例如:

代码语言:javascript复制
eye(4)

MATLAB执行上述语句,返回以下结果:

代码语言:javascript复制
ans =
     1     0     0     0
     0     1     0     0
     0     0     1     0
     0     0     0     1

使用 rand() 函数建立一个数组(0,1)上均匀分布的随机数:

例如:

代码语言:javascript复制
rand(3, 5)

MATLAB执行上述语句,返回以下结果:

代码语言:javascript复制
ans =
    0.8147    0.9134    0.2785    0.9649    0.9572
    0.9058    0.6324    0.5469    0.1576    0.4854
    0.1270    0.0975    0.9575    0.9706    0.8003

MATLAB幻方

产生相同的总和,当它的元素加入逐行,逐列或对角线幻方是一个正方形。

使用 magic() 函数创建一个幻方阵列,它需要一个单数的参数,该参数必须是一个大于或等于3的标量。

例如:

代码语言:javascript复制
magic(4)

MATLAB执行上述语句,返回以下结果:

代码语言:javascript复制
ans =
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

MATLAB多维数组

在MATLAB中,一个阵列如果具有两个以上的维度则被称为多维数组。

在MATLAB中的多维数组是正常的两维矩阵的延伸。

MATLAB中需要先创建一个二维数组然后对该二维数组进行扩展,这样才能生成一个多维数组。

例如,我们先建立一个二维数组a。

代码语言:javascript复制
a = [7 9 5; 6 1 9; 4 3 2]

MATLAB执行上述语句,返回以下结果:

代码语言:javascript复制
a =
     7     9     5
     6     1     9
     4     3     2

数组 a 是一个 3x3 阵列,通过提供的值,我们可以添加一个第三维,例如:

代码语言:javascript复制
a(:, :, 2)= [ 1 2 3; 4 5 6; 7 8 9]

MATLAB执行上述语句,返回以下结果:

代码语言:javascript复制
a(:,:,1) =
     7     9     5
     6     1     9
     4     3     2

a(:,:,2) =
     1     2     3
     4     5     6
     7     8     9

同样,我们也可以使用 ones(), zeros() 或 rand() 函数建立多维数组。

例如:

代码语言:javascript复制
b = rand(4,3,2)

MATLAB执行上述语句,返回以下结果:

代码语言:javascript复制
b(:,:,1) =
    0.0344    0.7952    0.6463
    0.4387    0.1869    0.7094
    0.3816    0.4898    0.7547
    0.7655    0.4456    0.2760

b(:,:,2) =
    0.6797    0.4984    0.2238
    0.6551    0.9597    0.7513
    0.1626    0.3404    0.2551
    0.1190    0.5853    0.5060

还能够使用 cat() 函数来建立多维数组,它结合沿着指定的维度的数组列表:

cat() 函数的语法是:

代码语言:javascript复制
B = cat(dim, A1, A2...)

注意:

  • B 是新建的数组;
  • A1, A2, ... 是要连接的阵列;
  • dim 是一起串联阵列的维度。

详细例子

在MATLAB中建立一个脚本文件,输入下述代码:

代码语言:javascript复制
a = [9 8 7; 6 5 4; 3 2 1];
b = [1 2 3; 4 5 6; 7 8 9];
c = cat(3, a, b, [ 2 3 1; 4 7 8; 3 9 0])

运行该文件时,显示结果:

代码语言:javascript复制
c(:,:,1) =
     9     8     7
     6     5     4
     3     2     1
c(:,:,2) =
     1     2     3
     4     5     6
     7     8     9
c(:,:,3) =
     2     3     1
     4     7     8
     3     9     0

MATLAB数组函数

MATLAB提供以下功能进行排序,旋转,置乱,重塑或移动数组的内容。

函数

目的

length

矢量长度或最大阵列尺寸

ndims

数组维数

numel

数组元素的数目

size

数组维度

iscolumn

确定输入是否是列向量

isempty

确定数组是否为空

ismatrix

确定输入是否为矩阵

isrow

确定输入是否为行向量

isscalar

确定输入是否为标量

isvector

确定输入是否为矢量

blkdiag

从输入参数构造块对角矩阵

circshift

循环移位

ctranspose

复数共轭转置

diag

矩阵的对角矩阵和对角线

flipdim

沿指定维度翻转数组

fliplr

从左到右翻转矩阵

flipud

将矩阵向下翻转

ipermute

n-维阵列的反置换维数

permute

重新排列 N 维数组的维数

repmat

复制和平铺数组

reshape

重塑数组

rot90

旋转矩阵90度

shiftdim

移位维度

issorted

确定集合元素是否按排序顺序排列

sort

按升序或降序对数组元素进行排序

sortrows

按升序对行排序

squeeze

删除单维度

transpose

转置

vectorize

矢量化表达式

详细示例

上述的一些函数将由下列例子说明。

长度,尺寸和数量的元素:

在MATLAB中建立一个脚本文件,输入下述代码:

代码语言:javascript复制
x = [7.1, 3.4, 7.2, 28/4, 3.6, 17, 9.4, 8.9];
length(x)  % length of x vector
y = rand(3, 4, 5, 2);
ndims(y)    % no of dimensions in array y
s = ['Zara', 'Nuha', 'Shamim', 'Riz', 'Shadab'];
numel(s)   % no of elements in s

运行该文件,显示以下结果:

代码语言:javascript复制
ans =
     8
ans =
     4
ans =
    23

循环移位的数组元素:

在MATLAB中建立一个脚本文件,输入下述代码:

代码语言:javascript复制
a = [1 2 3; 4 5 6; 7 8 9]  % the original array a
b = circshift(a,1)  %  circular shift first dimension values down by 1.
c = circshift(a,[1 -1]) % circular shift first dimension values % down by 1 
                         % and second dimension values to the left % by 1.

运行该文件,显示以下结果:

代码语言:javascript复制
a =
     1     2     3
     4     5     6
     7     8     9

b =
     7     8     9
     1     2     3
     4     5     6

c =
     8     9     7
     2     3     1
     5     6     4

MATLAB数组排序

在MATLAB中建立一个脚本文件,输入下述代码:

代码语言:javascript复制
v = [ 23 45 12 9 5 0 19 17]  % horizonal vector
sort(v)   %sorting v
m = [2 6 4; 5 3 9; 2 0 1]  %  two dimensional array
sort(m, 1)   % sorting m along the row
sort(m, 2)   % sorting m along the column

运行该文件,显示以下结果:

代码语言:javascript复制
v =
    23    45    12     9     5     0    19    17
ans =
     0     5     9    12    17    19    23    45
m =
     2     6     4
     5     3     9
     2     0     1
ans =
     2     0     1
     2     3     4
     5     6     9
ans =
     2     4     6
     3     5     9
     0     1     2

MATLAB单元阵列

单元阵列的阵列中每个单元格可以存储不同的维度和数据类型的数组的索引单元格。

单元格函数用于建立一个单元阵列。

单元格函数的语法如下:

代码语言:javascript复制
C = cell(dim)
C = cell(dim1,...,dimN)
D = cell(obj)

注意

  • C 是单元阵列;
  • dim 是一个标量整数或整数向量,指定单元格阵列C的尺寸;
  • dim1, ... , dimN 是标量整数指定尺寸的C;
  • obj 是以下内容之一
    • Java 数组或对象
    • .NET阵列 System.String 类型或 System.Object

详细例子

在MATLAB中建立一个脚本文件,输入下述代码:

代码语言:javascript复制
c = cell(2, 5);
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5}

运行该文件,显示以下结果:

代码语言:javascript复制
c = 
    'Red'    'Blue'    'Green'    'Yellow'    'White'
    [  1]    [   2]    [    3]    [     4]    [    5]

MATLAB在单元格上阵列访问数据

使用两种方法来引用单元阵列的元素:

  • 封闭的索引在第一个 bracket (),是指一组单元格
  • 封闭的在大括号{},的索引单个单元格内的数据

括在第一支架的索引,它指的是单元格的集。

单元阵列索引平稳括号单元格集合。

例如:

代码语言:javascript复制
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5};
c(1:2,1:2)

MATLAB执行上述语句,返回以下结果:

代码语言:javascript复制
ans = 
    'Red'    'Blue'
    [  1]    [   2]

同样可以用花括号“{ }”索引访问单元格的内容。

例如:

代码语言:javascript复制
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5};
c{1, 2:4}

MATLAB执行上述语句,返回以下结果:

代码语言:javascript复制
ans =
   Blue
ans =
   Green
ans =
   Yellow

0 人点赞