之前,我们讨论了很多关于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