MATLAB 多维数组与特殊数组完全指南
在 MATLAB 中,所有数据类型的变量本质上都是多维数组。向量是一维数组,矩阵是二维数组。
我们已经讨论过向量和矩阵。本章将重点介绍多维数组,但在此之前,先来了解几种特殊的数组类型。
MATLAB 中的特殊数组
本节介绍用于创建特殊数组的函数。这些函数均支持单参数生成方阵、双参数生成矩形数组。
zeros() 函数创建全零数组:
示例:
zeros(5)
MATLAB 执行后返回 5×5 的全零矩阵:
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() 函数创建全一数组:
示例:
ones(4,3)
返回 4 行 3 列的全一矩阵:
ans =
1 1 1
1 1 1
1 1 1
1 1 1
eye() 函数创建单位矩阵(对角线为 1,其余为 0)。
示例:
eye(4)
返回 4×4 单位矩阵:
ans =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
rand() 函数生成 (0,1) 区间上均匀分布的随机数数组。
示例:
rand(3, 5)
返回 3 行 5 列的随机矩阵:
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
幻方
幻方 是一种方阵,其每行、每列及两条主对角线上元素之和相等。
magic() 函数生成幻方,参数为方阵阶数(标量且 ≥3)。
magic(4)
返回 4 阶幻方:
ans =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
多维数组
维度超过二维的数组称为多维数组,是二维矩阵的自然扩展。
通常先生成二维数组,再扩展为多维。例如,先创建 3×3 矩阵 a:
a = [7 9 5; 6 1 9; 4 3 2]
结果:
a =
7 9 5
6 1 9
4 3 2
通过指定第三维数据扩展 a:
a(:, :, 2) = [1 2 3; 4 5 6; 7 8 9]
得到 3×3×2 的三维数组:
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() 直接创建多维数组:
b = rand(4,3,2)
生成 4×3×2 的随机三维数组。
还可用 cat() 函数沿指定维度拼接数组:
B = cat(dim, A1, A2...)
B:拼接后的新数组
A1, A2...:待拼接的数组
dim:拼接维度
示例
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])
结果为 3×3×3 数组:
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 提供丰富的函数对数组进行排序、旋转、维度变换、重塑、移位等操作:
| 函数 | 用途 |
|---|---|
| length | 向量长度或最大数组维度 |
| ndims | 数组维度数 |
| numel | 数组元素总数 |
| size | 数组各维度大小 |
| iscolumn | 判断是否为列向量 |
| isempty | 判断数组是否为空 |
| ismatrix | 判断是否为矩阵 |
| isrow | 判断是否为行向量 |
| isscalar | 判断是否为标量 |
| isvector | 判断是否为向量 |
| blkdiag | 构造分块对角矩阵 |
| circshift | 循环移位数组 |
| ctranspose | 共轭转置 |
| diag | 对角矩阵或提取对角线 |
| flipdim | 沿指定维翻转数组 |
| fliplr | 左右翻转矩阵 |
| flipud | 上下翻转矩阵 |
| ipermute | N-D 数组维度逆排列 |
| permute | 重排 N-D 数组维度 |
| repmat | 复制平铺数组 |
| reshape | 重塑数组形状 |
| rot90 | 矩阵逆时针旋转 90° |
| shiftdim | 移动数组维度 |
| issorted | 判断元素是否已排序 |
| sort | 数组元素升序/降序排序 |
| sortrows | 按行排序 |
| squeeze | 移除单例维度 |
| transpose | 转置 |
| vectorize | 表达式向量化 |
示例
长度、维度与元素数
x = [7.1, 3.4, 7.2, 28/4, 3.6, 17, 9.4, 8.9]; length(x) % 向量 x 的长度 y = rand(3, 4, 5, 2); ndims(y) % 数组 y 的维度数 s = ['Zara', 'Nuha', 'Shamim', 'Riz', 'Shadab']; numel(s) % 字符数组 s 的元素数
输出:
ans = 8 ans = 4 ans = 23
数组元素循环移位
a = [1 2 3; 4 5 6; 7 8 9]; b = circshift(a,1); % 第 1 维向下移 1 c = circshift(a,[1 -1]); % 第 1 维下移 1,第 2 维左移 1
结果:
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
数组排序
v = [23 45 12 9 5 0 19 17]; sort(v) % 向量排序 m = [2 6 4; 5 3 9; 2 0 1]; sort(m, 1) % 沿第 1 维(行方向)排序 sort(m, 2) % 沿第 2 维(列方向)排序
输出:
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
元胞数组
元胞数组由索引元胞组成,每个元胞可存储不同维度和数据类型的数组。
cell 函数用于创建元胞数组:
C = cell(dim) C = cell(dim1,...,dimN) D = cell(obj)
C:元胞数组
dim:标量或整数向量,指定维度
dim1...dimN:标量,指定各维度大小
obj:Java 数组/对象、.NET System.String 或 System.Object 数组
示例
c = cell(2, 5);
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5}
显示结果:
c = [1,1] = Red [2,1] = 1 [1,2] = Blue [2,2] = 2 [1,3] = Green [2,3] = 3 [1,4] = Yellow [2,4] = 4 [1,5] = White [2,5] = 5
访问元胞数组数据
两种索引方式:
- 圆括号 ():引用元胞集合(返回元胞数组)
- 花括号 {}:引用元胞内的实际数据
圆括号示例:
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5};
c(1:2,1:2)
ans = [1,1] = Red [2,1] = 1 [1,2] = Blue [2,2] = 2
花括号示例:
c{1, 2:4}
ans = Blue ans = Green ans = Yellow
MATLAB
- 掌握 C# 数组:声明、初始化与核心操作完全指南
- 掌握 C# 锯齿数组:声明、初始化与访问完全指南
- 掌握 C++ 数组:声明、初始化、访问与实战操作全指南
- C++ 数组完全指南:声明、初始化、多维数组与指针技巧
- C++ 动态数组分配实战指南:new/delete、初始化、扩容与内存管理
- MATLAB 入门指南:矩阵实验室的核心能力与应用领域全景
- MATLAB 变量深度解析:矩阵本质、赋值、多重赋值、查看与清理、长赋值、格式控制、向量创建
- MATLAB 常用命令速查:会话管理、系统操作、输入输出、矩阵数组、绘图可视化
- MATLAB 矩阵核心操作:创建、索引引用、子矩阵提取、行列删除、拼接与基本运算
- MATLAB 数值类型详解:存储、转换与范围查询
- MATLAB 字符串完全指南:创建、拼接、元胞数组与常用函数
- Java 数组复制技术:全面指南