多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

MATLAB数组生成全攻略:从基础创建到高效数据导入

MATLAB数组生成全攻略:从基础创建到高效数据导入 1. 从零开始为什么数组是MATLAB的基石如果你刚开始接触MATLAB可能会被它强大的工具箱和复杂的仿真功能所吸引但无论你未来想用它做信号处理、图像分析还是控制系统设计有一个概念你必须最先、也最彻底地掌握——数组。这不是一个普通的编程概念在MATLAB的世界里数组就是一切。它不像C语言里那样只是内存里的一块连续空间也不像Python列表那样可以容纳任意类型。在MATLAB中数组是数据组织和运算的核心载体甚至可以说MATLABMatrix Laboratory矩阵实验室这个名字就源于此。很多新手在安装完MATLAB比如搜索“matlab下载安装教程”或纠结于“matlab 2021a matlab liscence manager error -10,32”这类错误后迫不及待地想跑一个复杂的“matlab simulink fcn显示表达式”或者尝试“matlab deeplearning toolbox 安装”却往往在第一步的数据准备上就卡住了。你会发现无论是处理“二维字符数组”还是计算“ip首部校验和matlab代码”抑或是实现“matlab醉汉随机游走模型”你都需要与数组打交道。数组生成得不合适后续所有分析都像是建立在流沙之上。所以这篇笔记我们不谈高深的算法就扎扎实实地从数组的生成讲起。我会结合我多年使用MATLAB进行工程计算和数据分析的经验把那些官方文档里一笔带过但实际应用中至关重要的细节和“坑”都掰开揉碎。无论你是想用“matlab findpeaks”分析光谱数据还是用“gurobi安装教程matlab”解决优化问题抑或是处理“json数组”熟练生成和操作数组都是你的第一块敲门砖。让我们暂时忘掉那些复杂的工具箱回到这个最基础、也最强大的核心上来。2. 数组的“基因”理解标量、向量、矩阵与高维数组在深入生成方法之前我们必须统一“语言”。MATLAB中的数组是一个广义概念它根据维数dimensions有不同的具体名称但本质上它们是同一种数据结构。标量Scalar 这是最简单的数组一个1x1的数组。在MATLAB中单个的数字比如a 5就是一个标量数组。很多从C语言转过来的朋友会疑惑这和普通变量有什么区别在MATLAB里没有纯粹的“普通变量”你定义的任何数字都是数组只不过它恰好只有一个元素。这解释了为什么你可以直接对标量进行很多数组操作。向量Vector 一行或一列数字。分为行向量1 x n和列向量n x 1。这是处理序列数据如信号、时间序列的常用形式。例如一个音频信号片段就可以存储为一个列向量。矩阵Matrix 一个二维数组m x n。这是MATLAB的招牌也是其名称的由来。图像数据灰度图是二维矩阵彩色图是三维矩阵、线性方程组的系数、任何表格型数据本质上都是矩阵。高维数组N-D Array 当维度超过2就是高维数组。例如一张RGB彩色图像是一个三维数组高度 x 宽度 x 3颜色通道一个包含多张图片的数据集可能是一个四维数组样本索引 x 高度 x 宽度 x 颜色通道。处理这类数据是“matlab deeplearning toolbox”等工具的日常。理解这个层级关系至关重要因为后续所有的生成方法其实都是在不同维度上构建这些结构。生成一个标量就是生成一个1x1数组生成一个矩阵就是生成一个二维数组。MATLAB的函数对维度的适应性很强很多生成一维向量的方法稍加变化就能生成矩阵或高维数组。注意 MATLAB的索引是列优先column-major的。这意味着在内存中数组的元素是按列存储的。对于一个矩阵A [1, 2; 3, 4]它在内存中的顺序是1, 3, 2, 4。这一点在追求高性能循环、或与C/Fortran代码交互时尤为重要按列操作通常更快。这也是其“矩阵实验室”基因的体现。3. 手动创建最直接也是最灵活的方式当你需要创建一个小型、结构特定的数组时手动创建是最直观的方法。这就像手工打造一个零件完全掌控每一个细节。3.1 创建行向量与列向量创建行向量最简单使用方括号[]用空格或逗号分隔元素。row_vec1 [1 2 3 4 5] % 使用空格 row_vec2 [1, 2, 3, 4, 5] % 使用逗号两者等效创建列向量则用分号;来分隔行。col_vec [1; 2; 3; 4; 5] % 分号表示换行一个常见的混淆点是如何在手动创建时区分是想要一个多行的矩阵还是只是一个长行向量规则很简单在方括号内空格/逗号分隔同一行的不同元素分号分隔不同的行。所以[1 2; 3 4]创建的是一个2x2矩阵。实操心得 当需要从工作区Workspace的多个已有变量快速组合成新数组时手动创建非常方便。例如你有变量a10,b20可以直接newVec [a, b, 5]。这在脚本调试阶段拼接中间结果时常用。3.2 创建矩阵将创建行向量和列向量的规则结合就能创建矩阵。逐行写出矩阵内容行内用空格或逗号行间用分号。matrix [1, 2, 3; 4, 5, 6; 7, 8, 9] % 创建一个3x3矩阵 % 它等同于 % 第一行1 2 3 % 第二行4 5 6 % 第三行7 8 9对于复杂的数值如负数、小数、科学计数法直接写入即可[1.5e-3, -2.1; 0, 4]。踩坑提醒 确保每一行的元素数量相同。如果你写了[1, 2, 3; 4, 5]MATLAB会报错“Dimensions of arrays being concatenated are not consistent.”因为第一行有3个元素第二行只有2个无法构成矩形矩阵。这是手动创建时最常见的错误之一。3.3 拼接现有数组构建更复杂结构手动创建的强大之处在于可以拼接Concatenate已有的数组。这是构建复杂数据结构的基石。水平拼接 使用空格或逗号。要求参与拼接的所有数组具有相同的行数。A [1, 2; 3, 4]; B [5; 6]; % 错误A是2行B是2行但A有2列B只有1列无法水平拼接列数扩展 % C [A, B]; % 这行会报错 B_ [5, 6; 7, 8]; % 将B改为2x2矩阵 C_horizontal [A, B_] % 水平拼接得到2x4矩阵[1,2,5,6; 3,4,7,8]垂直拼接 使用分号。要求参与拼接的所有数组具有相同的列数。A [1, 2; 3, 4]; D [5, 6]; C_vertical [A; D] % 垂直拼接得到3x2矩阵[1,2; 3,4; 5,6]这种拼接能力非常实用。例如你从多个传感器每个传感器数据是一个列向量采集数据可以通过水平拼接将它们组合成一个多列的数据矩阵每一列代表一个传感器。或者你有多组实验数据每组是一个行向量可以通过垂直拼接将它们堆叠起来。进阶技巧 对于高维数组可以使用cat(dim, A, B, ...)函数沿指定维度dim进行拼接。例如cat(3, image1, image2)可以将两张二维图像沿第三维“页面”维度拼接形成一个三维数组常用于处理图像序列或批量数据。4. 自动生成效率提升的关键当需要创建大型、有规律的数组时手动输入是不现实的。这时就需要利用MATLAB提供的各种自动生成函数。这些函数是MATLAB高效编程的核心工具。4.1 冒号运算符:创建等差数列向量的利器冒号运算符是生成等间隔序列最常用、最高效的工具。其基本语法是start:step:end。v1 1:5 % 默认步长为1生成 [1, 2, 3, 4, 5] v2 1:2:10 % 步长为2生成 [1, 3, 5, 7, 9] v3 10:-2:0 % 步长为负递减生成 [10, 8, 6, 4, 2, 0] v4 0:0.1:1 % 生成从0到1间隔0.1的序列[0, 0.1, 0.2, ..., 1.0]关键细节 终点end不一定被包含在序列中。序列在不超过end的最后一个值处停止。例如1:2:6生成[1,3,5]因为下一步7超过了6。计算序列长度有一个实用公式length floor((end - start)/step) 1。应用场景生成时间轴 在信号处理中定义时间变量t 0:1/fs:duration其中fs是采样率。循环索引for i 1:10中的1:10就是冒号运算符生成的。数组索引和切片A(2:5, 3:end)选取A矩阵的第2到5行第3列到最后一列。4.2linspace与logspace精准控制点数与对数空间有时我们关心的不是步长而是总点数。linspace和logspace就是为此而生。linspace(a, b, n)在区间[a, b]上生成n个等间隔的点。n默认为100。points linspace(0, 10, 5) % 生成5个点[0, 2.5, 5, 7.5, 10]与0:2.5:10结果相同但意图更清晰我就是要5个点。这在绘图时特别有用比如要绘制一个平滑的正弦曲线你需要足够多的点x linspace(0, 2*pi, 1000); y sin(x);。logspace(a, b, n)在区间[10^a, 10^b]上生成n个对数等间隔的点。这在需要跨越多个数量级进行采样时非常有用例如绘制伯德图Bode Plot时的频率轴。freq logspace(0, 3, 10) % 生成10个点从10^01到10^31000在对数尺度上均匀分布 % 结果类似于[1, 2.15, 4.64, 10, 21.5, 46.4, 100, 215, 464, 1000]实操心得 当需要生成用于评估函数行为的坐标点时优先考虑linspace和logspace因为它们直接明确了点的数量避免了因步长计算取整导致的端点缺失或点数不符预期的问题。例如在“用matlab画tm11”模式图这类需要高精度采样的场景下用linspace定义参数范围比用冒号运算符更可靠。4.3zeros,ones,eye,rand等特殊矩阵的工厂函数这些函数用于快速生成具有特定结构和内容的矩阵是初始化数组的标配。zeros(m, n)/zeros([m, n]) 生成一个 m x n 的全零矩阵。这是最常用的初始化函数尤其是在预分配内存以提升循环性能时。例如results zeros(1000, 1);预分配一个1000行的列向量来存储结果。Z zeros(2, 3) % 2x3零矩阵 Z_3d zeros(2, 3, 4) % 生成2x3x4的三维零数组ones(m, n) 生成全1矩阵。常用于需要初始值为1的场景或者与其它操作结合。例如创建一张纯白的图像whiteImage 255 * ones(480, 640, uint8);。eye(n) 生成 n x n 的单位矩阵对角线为1其余为0。在线性代数运算中不可或缺。rand(m, n) 生成 m x n 的矩阵其元素服从[0, 1)区间上的均匀分布。这是生成随机数据、进行蒙特卡洛模拟的基础。randomMatrix rand(3, 3)randn(m, n) 生成 m x n 的矩阵其元素服从标准正态分布均值为0标准差为1。在仿真噪声、金融建模等领域广泛应用。randi([imin, imax], m, n) 生成 m x n 的矩阵其元素为[imin, imax]区间内的均匀随机整数。例如模拟掷骰子diceRolls randi([1, 6], 1, 10);。性能与内存提示 使用zeros预分配数组大小是编写高效MATLAB代码的黄金法则。在循环中不断通过拼接如A [A; newRow]来扩大数组会导致MATLAB反复寻找新的连续内存并复制数据时间复杂度极高。务必先zeros预分配再通过索引填充。4.4meshgrid与ndgrid生成网格坐标的幕后功臣这是生成多维网格点坐标的核心函数在三维绘图、函数数值评估、图像处理等领域至关重要。很多新手对surf,contour等绘图函数报错感到困惑根源常在于没理解网格数据格式。假设你要绘制函数z f(x, y)在区域 x∈[1,3], y∈[2,4] 上的曲面。你需要的是这个区域内所有 (x, y) 点的组合。错误做法直接使用两个向量。x 1:3; % [1,2,3] y 2:4; % [2,3,4] % 此时 z f(x, y) 无法直接计算因为尺寸不匹配正确做法使用meshgrid。[X, Y] meshgrid(1:3, 2:4); % X % 1 2 3 % 1 2 3 % 1 2 3 % Y % 2 2 2 % 3 3 3 % 4 4 4现在X和Y是同维度的矩阵这里是3x3。X的每一行是 x 向量的副本Y的每一列是 y 向量的副本。这样X(i,j)和Y(i,j)就构成了一个网格点对。计算Z sin(X) cos(Y)就能得到每个网格点上的函数值从而可以用surf(X, Y, Z)绘图。ndgrid的语法与meshgrid类似但生成的数组维度顺序不同meshgrid前两个输出交换了维度以适应绘图习惯。在非绘图的多维计算中通常使用ndgrid更直观。踩坑实录 我曾帮助一个同事调试一个“怎么用matlab画tm11”模式图的代码他的电场分布计算总是出错。问题就在于他直接用linspace生成的两个一维向量去计算一个二维函数结果得到的Z是一个向量而不是矩阵。引入meshgrid生成网格坐标后问题迎刃而解。记住这个口诀“画曲面先网格”。5. 从外部获取数据导入与文件读取实际工程和科研中数据很少是手动输入或代码生成的更多来源于实验测量、传感器、仿真软件或其他程序。MATLAB提供了强大的数据导入能力。5.1 导入工具Import Tool与load函数对于标准格式的数据文件如.mat,.txt,.csv最简单的方法是使用GUI。双击工作区文件 在MATLAB的“当前文件夹”浏览器中双击一个.mat文件其中的变量会自动加载到工作区。双击.txt或.csv文件会启动“导入工具”。导入工具 这是一个图形化界面可以预览数据、选择分隔符、指定导入范围、为每列设置变量名和数据类型。对于格式不太规整的文本文件用它比写代码更高效。你可以在“主页”选项卡点击“导入数据”按钮打开它。对于编程化、可重复的导入使用load函数。加载.mat文件load(filename.mat)会将文件中所有变量加载到当前工作区。如果只想加载特定变量使用load(filename.mat, var1, var2)。.mat是MATLAB的原生二进制格式保存和加载速度极快且能保留所有数据类型和结构。加载文本/数据文件load也可以加载纯数字的文本文件如空格或逗号分隔但功能有限。更强大的文本读取函数是readmatrix,readtable,csvread/dlmread较老等。5.2 专业读取函数应对复杂格式readmatrix (R2019a引入) 推荐用于读取包含数值数据的文本文件如.txt,.csv。它会自动检测分隔符并尝试将数据读入一个普通的数值矩阵或对于混合数据返回一个矩阵和分离的文本数据。它比老的csvread更智能、更健壮。data readmatrix(sensor_data.csv);readtable 这是处理混合数据包含数字、文本、日期等的瑞士军刀。它将数据读入一个表格table变量。表格可以包含不同类型的列并且每列可以有列名。这对于处理来自数据库或Excel的导出数据非常完美。T readtable(experiment_log.xlsx); % 可以像访问结构体一样访问列T.Time, T.Temperature, T.Voltage % 也可以按列名索引T(:, Temperature)表格是MATLAB中极其重要的数据类型它完美地衔接了数据分析和数组运算。你可以方便地对整列进行数学运算也可以基于文本条件筛选行。xlsread/readcell/readtimetable等 针对特定格式。xlsread用于读取Excel文件但正逐渐被readtable取代。readcell将数据读入细胞数组cell array适用于高度不规则的数据。readtimetable用于带时间戳的数据序列。文件路径注意事项 如果文件不在MATLAB的当前工作目录或搜索路径中你需要提供完整或相对路径。使用fullfile函数来构建跨平台的路径是一个好习惯filepath fullfile(data, subfolder, myfile.csv);。5.3 处理特定格式JSON、TDMS、HDF5等现代数据交换格式层出不穷MATLAB也提供了相应的支持。JSON数组 使用jsondecode函数。它可以将JSON格式的字符串或文件内容解析为MATLAB的细胞数组或结构体。jsonStr {name: test, values: [1, 2, 3]}; dataStruct jsondecode(jsonStr); myArray dataStruct.values; % 获取数值数组 [1, 2, 3]TDMS文件 这是National Instruments LabVIEW常用的一种数据格式。你可以使用NI提供的“NI TDMS”插件或第三方工具包如搜索“tdmsread matlab工具包”找到的社区工具包来读取。通常流程是安装工具包然后使用类似data tdmsread(file.tdms);的函数。HDF5, NetCDF 对于科学数据存储可以使用h5read,ncread等函数。经验之谈 在开始一个项目时花点时间研究如何可靠、高效地导入你的数据往往能节省后面大量的调试时间。将数据导入代码封装成一个独立的函数或脚本并做好错误处理如检查文件是否存在能让你的工作流更加稳健。6. 数据类型与数组不仅仅是双精度数字当我们谈论MATLAB数组时默认元素类型是双精度浮点数double。但MATLAB支持多种数据类型正确选择类型可以节省内存、提升速度、或满足特定需求。6.1 数值类型double(默认) 双精度浮点数占用8字节/元素。精度高运算速度在主流CPU上经过高度优化。绝大多数数学运算都使用它。single 单精度浮点数占用4字节/元素。内存占用减半某些GPU计算或对内存极度敏感的应用中会使用。但要注意精度损失和可能的计算速度差异并非总是更快。整数类型int8,uint8,int16,uint16,int32,uint32,int64,uint64。u表示无符号。它们有明确的取值范围如int8是 -128~127。常用于表示图像像素值uint80-255、索引、或从硬件设备读取的原始数据。smallIntArray int16([1, 2, 30000]); % 30000在int16范围内logical 逻辑数组元素为true或false即1或0占用1字节/元素。通常由比较运算产生如A 5用于索引和条件判断。6.2 创建指定类型的数组所有之前提到的生成函数大多都接受一个数据类型参数。Z_int8 zeros(2, 3, int8); % 生成2x3的int8零矩阵 R_single rand(100, single); % 生成100x100的单精度随机矩阵 L true(3, 4); % 生成3x4的逻辑真矩阵等价于 ones(3,4, logical)为什么关心数据类型内存 一个1000x1000的double矩阵占用约8MB内存而single只占4MBuint8只占1MB。处理大型图像或数据集时差异巨大。精度与范围 整数运算快且无舍入误差但可能溢出。uint8数组赋值300会变成255饱和。浮点数有精度限制大量运算后可能累积误差。硬件与接口 与外部设备如摄像头、数据采集卡通信时数据格式通常是固定的如uint16。从文件如图像文件读取数据时也需要知道其存储类型。6.3 字符与字符串数组MATLAB处理文本有两种主要方式字符数组Character Array 传统的文本表示方式用单引号定义。它是一个字符矩阵每行必须是等长的。这类似于“二维字符数组”。charMatrix [hello; world]; % 一个2x5的字符数组。注意world后面补了空格以对齐长度。字符串数组String Array 从R2016b引入用双引号定义。它是一个数组其中每个元素是一个字符串长度可以不同。这是更现代、更易用的文本处理方式。strArray [hello, world; MATLAB, arrays]; % 一个2x2的字符串数组 % 可以方便地使用函数strlength(strArray), strcmp(strArray, hello)对于网络热词中提到的“对象数组去重”、“c字符串数组初始化”等概念在MATLAB中字符串数组的去重可以使用unique函数而初始化则直接使用双引号和方括号即可比处理等长的字符数组方便得多。6.4 细胞数组与结构体容纳异构数据的容器当需要在一个数组里存放不同类型、不同大小的数据时就需要细胞数组Cell Array和结构体Structure。细胞数组 使用大括号{}创建和索引。它像一个“万能抽屉”每个单元格cell可以存放任意类型的MATLAB数据包括另一个细胞数组、矩阵、字符串等。myCell {rand(3), text, 1:10}; % 一个1x3的细胞数组 content myCell{1}; % 使用花括号索引获取内容一个3x3随机矩阵细胞数组常用于存储不规则的数据列表比如一组长度不等的向量、混合类型的记录等。函数textscan读取复杂文本文件时经常返回细胞数组。结构体 通过字段名field name来组织数据使用点号.访问。它像是一个有名字的抽屉柜。patient.name John Doe; patient.billing 127.00; patient.test [79, 75, 73; 180, 178, 177.5; 220, 210, 205];结构体非常适合组织具有多个属性的实体数据。多个结构体可以组成结构体数组只要它们具有相同的字段名。这类似于一个轻量级的数据库表。关于“指针、数组、结构体本质区别”这个问题在MATLAB中所有变量包括数组、细胞数组、结构体在赋值给新变量时默认都是“写时复制”的引用传递表面上像值传递但底层有优化。没有C语言中显式的指针概念。细胞数组和结构体可以被视为一种容器它们内部包含的是对其他数据的引用。理解这一点有助于避免在操作大型数据时无意中创建多个副本消耗内存。7. 实战演练与性能考量让我们通过几个综合例子串联起数组生成的知识点并讨论性能这个永恒的话题。7.1 案例生成一个模拟的传感器数据集假设我们有3个传感器采样频率为100Hz持续5秒。传感器1输出正弦波传感器2输出带噪声的余弦波传感器3输出随机脉冲。我们需要生成一个时间戳列和三个数据列的数据矩阵。%% 1. 定义参数 fs 100; % 采样率 100 Hz duration 5; % 持续时间 5秒 t (0:1/fs:duration-1/fs); % 生成时间列向量。注意转置()使其成为列向量。 numSamples length(t); % 采样点数 %% 2. 预分配数据矩阵 % 我们将生成一个 numSamples x 4 的矩阵列序为[时间, 传感器1, 传感器2, 传感器3] data zeros(numSamples, 4, double); % 预分配双精度矩阵提升性能 data(:, 1) t; % 第一列是时间 %% 3. 生成传感器数据 freq1 2; % 传感器1信号频率 2Hz data(:, 2) sin(2 * pi * freq1 * t); % 正弦波 freq2 1.5; noiseLevel 0.1; data(:, 3) cos(2 * pi * freq2 * t) noiseLevel * randn(numSamples, 1); % 带噪声的余弦波 % 传感器3随机脉冲每秒随机发生0或1次脉冲宽度0.1秒 pulseWidth 0.1; pulseSamples round(pulseWidth * fs); pulseSignal zeros(numSamples, 1); for i 1:numSamples if rand 0.01 % 每秒大约1%的概率即约1次/秒 idx min(i, numSamples-pulseSamples1); pulseSignal(idx:idxpulseSamples-1) 1; end end data(:, 4) pulseSignal; %% 4. 可视化可选 figure; subplot(3,1,1); plot(t, data(:,2)); title(传感器1 - 正弦波); subplot(3,1,2); plot(t, data(:,3)); title(传感器2 - 带噪声余弦波); subplot(3,1,3); plot(t, data(:,4)); title(传感器3 - 随机脉冲); xlabel(时间 (秒));这个例子综合运用了冒号运算符生成时间序列、zeros预分配、数组赋值、数学函数和随机数生成。注意时间向量t的生成方式确保点数正确并且通过转置使其成为列向量以便与其他列拼接。7.2 性能优化预分配与向量化MATLAB是为矩阵运算而生的其解释器对向量化操作即对整个数组进行操作而不是用循环处理单个元素进行了深度优化。反面教材循环操作极慢n 1e6; slowResult zeros(n, 1); for i 1:n slowResult(i) sin(i / 1000); % 在循环中不断调整数组大小实际上由于预分配了这里主要是索引慢不更慢的是没有预分配 end % 如果去掉预分配 zeros(n,1)性能会是灾难级的。正确做法向量化操作极快n 1e6; x (1:n) / 1000; % 先生成整个向量 fastResult sin(x); % 一次性对整个向量进行sin运算向量化操作通常比循环快一两个数量级。在生成数组时尽量使用内置函数sin,exp,,.*等对整个数组进行运算避免编写元素级循环。预分配是向量化的好朋友 即使你打算用向量化操作生成最终数组如果生成过程涉及中间步骤的拼接也务必预分配。例如你需要将多个不同长度的向量片段最终组合成一个长向量应预先计算总长度用zeros分配好空间然后通过索引将片段填入这比反复使用[result; newSegment]快得多。7.3 内存查看与管理当你生成大型数组时了解其内存占用很重要。使用whos命令可以查看工作区变量的详细信息。largeArray rand(1000, 1000, double); whos largeArray % 输出 % Name Size Bytes Class Attributes % largeArray 1000x1000 8000000 double这里显示largeArray占用约8MB内存100010008字节。如果你发现MATLAB变慢或收到“内存不足”的错误whos是你首先应该使用的诊断工具。对于不再需要的大变量使用clear variableName将其从工作区删除以释放内存。8. 常见问题排查与技巧拾遗即使掌握了基本方法在实际操作中仍会遇到各种问题。这里汇总一些典型场景和技巧。8.1 “索引超出数组范围”与数组大小查看这是最常见的错误之一。在操作数组前务必清楚它的维度。A rand(3, 4); size(A) % 返回 [3, 4]行数和列数 length(A) % 返回最大维度的长度对于矩阵返回max(size(A))这里是4 numel(A) % 返回元素总数3*412尝试访问A(5,1)或A(1,5)都会导致“索引超出范围”错误。使用size函数是安全的习惯。8.2 数组形状的转换与重塑有时你需要改变数组的布局而不改变其元素。转置A.是普通转置A是复共轭转置对于实数数组两者相同。重塑reshape(A, m, n)将数组A重新排列成m x n的矩阵。元素按列优先顺序重新排列。总元素数numel(A)必须等于m*n。v 1:12; M reshape(v, 3, 4) % 将1x12的行向量变成3x4矩阵 % M % 1 4 7 10 % 2 5 8 11 % 3 6 9 12拉平A(:)将数组A的所有元素按列优先顺序重构成一个列向量。这是非常实用的操作。拼接与扩展 除了手动[]拼接还有repmat重复数组和horzcat/vertcat水平/垂直拼接的函数形式等。8.3 空数组与特殊值空数组[]是一个0x0的双精度空数组。它常用于循环的初始化或作为默认返回值。可以用isempty()判断。非数NaN(Not a Number)。用于表示缺失或未定义的数据。例如[1, NaN, 3]。任何包含NaN的算术运算结果通常也是NaN。使用isnan()来检测。无穷大Inf和-Inf。例如1/0得到Inf。逻辑判断 注意相等和赋值的区别。判断多个条件时使用逐元素的逻辑运算符(与)、|(或)、~(非)而不是短路运算符、||后者仅用于标量条件。8.4 从其他语言迁移的注意事项与C/C对比 MATLAB索引从1开始而不是0。这是无数错误的根源。MATLAB数组在内存中是列优先存储而C通常是行优先。MATLAB没有显式的指针和内存管理。与Python对比 Python的列表list更接近MATLAB的细胞数组而numpy数组则与MATLAB矩阵非常相似但索引、广播规则和函数名有差异。Python索引从0开始。“向量化思维” 这是从C/Java等语言转向MATLAB最需要培养的习惯。尽量思考如何用数组运算代替循环。例如计算两个向量对应元素的乘积用A .* B而不是写for循环。生成数组是MATLAB一切计算的起点。掌握这些方法意味着你拿到了打开这座科学计算宝库的第一把钥匙。从简单的1:10到复杂的多维网格从手动输入到从文件自动加载每一种方法都在不同的场景下发挥着作用。我个人的体会是在编写任何功能之前先花几分钟思考一下数据的最佳组织形式和生成方式往往能让后续的代码更加简洁高效。当你对数组生成烂熟于心后你会发现那些看似复杂的“matlab脚本实现simulink批量仿真功能”或“超算运行matlab”任务其底层的数据准备阶段都离不开这些基础却强大的操作。
返回列表