跳转至

MATLAB 数据导入与导出

在任何数据分析和科学计算任务中,将外部数据导入 MATLAB 以及将处理结果导出,都是至关重要的第一步和最后一步。MATLAB 提供了极其丰富和灵活的 I/O (Input/Output) 函数,能够处理从简单的文本文件到复杂的多维科学数据格式的各种情况。

两大核心方法:交互式工具 vs. 编程函数

MATLAB 提供了两种主要的数据导入导出方式: 1. 交互式工具:主页 (HOME) 选项卡中,点击 导入数据 (Import Data),会打开一个图形化界面。您可以直观地选择文件、预览数据、选择导入范围和数据类型,并能自动生成用于重复该操作的代码。非常适合初学者和一次性任务。 2. 编程函数: 使用本文档中罗列的函数,以编程方式读写文件。这是实现自动化、可重复分析流程的必经之路

文本文件 (.txt, .csv, .dat 等)

这是最常见的数据交换格式,特别是对于纯数值或表格数据。

现代函数推荐 (R2019a+)

对于带分隔符的文本文件(如 CSV),强烈推荐使用 readmatrix, readtable, readcell 及其对应的写入函数,因为它们功能更强大、性能更好,并且正在逐步取代旧的函数。

readmatrix - 读取纯数值矩阵

  • 功能: 从文本文件或电子表格中读取纯数值数据,返回一个数值矩阵。它会自动忽略所有非数值内容。
  • 语法:
    A = readmatrix(filename)
    A = readmatrix(filename, opts)
    
  • 语法说明:
    • readmatrix(filename): 自动检测分隔符并读取文件中的所有数值数据。
    • opts: 一个由 detectImportOptions 函数生成的导入选项对象,可用于精细控制,如指定数据范围、分隔符、变量名行等。

writematrix - 写入纯数值矩阵

  • 功能: 将一个数值矩阵写入到文本文件(如 CSV)。
  • 语法:
    writematrix(A, filename)
    writematrix(A, filename, 'Name', Value)
    
  • 语法说明:
    • 'Delimiter': 指定分隔符,如 ',', '\t', ' '

readtable - 读取混合数据表格

  • 功能: 最常用、最推荐的函数。从文本文件或电子表格中读取表格数据,返回一个 table 对象。它能自动处理列标题,并为每一列推断最合适的数据类型(包括数值、文本、日期等)。
  • 语法:
    T = readtable(filename)
    T = readtable(filename, opts)
    T = readtable(filename, 'Name', Value)
    
  • 示例:
    % 假设有一个 'patients.csv' 文件,内容如下:
    % LastName,Age,Smoker
    % Smith,38,true
    % Jones,41,false
    
    T = readtable('patients.csv');
    disp(T); % 显示一个结构化的 table 对象
    

writetable - 写入混合数据表格

  • 功能: 将一个 table 对象写入到文件(如 CSV 或 Excel)。它会自动写入变量名作为标题行。
  • 语法:
    writetable(T, filename)
    writetable(T, filename, 'Name', Value)
    

readcellwritecell - 读写元胞数组

  • 功能: 从文件中读取数据并返回一个元胞数组 cell,或将元胞数组写入文件。这在处理格式不规则、包含大量混合文本和数字的非表格数据时非常有用。
  • 语法:
    C = readcell(filename)
    writecell(C, filename)
    

底层文本文件 I/O - 精确控制文本读写

  • 功能: 提供了 C 语言风格的、最底层的文本文件访问能力,可以实现完全自定义的读写操作。
  • 核心函数: fopen, fprintf, fgetl, fclose 等。
  • 流程: fopen -> 循环读取/写入 (fgetl, fprintf) -> fclose
  • 示例:
    % 创建并写入一个日志文件
    fileID = fopen('log.txt', 'w'); % 'w' 表示写入模式
    fprintf(fileID, '日志开始于 %s\n', datetime('now'));
    for i = 1:5
        fprintf(fileID, '处理第 %d 个项目...\n', i);
    end
    fclose(fileID); % 必须关闭文件以保存更改
    

电子表格 (Excel 文件)

MATLAB 与 Microsoft Excel 具有极佳的兼容性。readtable, writetable, readmatrix, writematrix 等现代函数都可以直接作用于 .xls, .xlsx, .xlsb 等文件。

关于 xlsreadxlswrite

这两个是非常旧的函数,自 R2019a 起已不推荐使用,并在未来版本中可能被移除。请务必使用 readtablewritetable 等现代函数来读写 Excel 文件。

  • 功能: 读写 Excel 文件。
  • 语法 (以 readtable 为例):
    T = readtable(filename, 'Sheet', sheetname, 'Range', 'A1:C10')
    writetable(T, filename, 'Sheet', 'Results', 'Range', 'B2')
    
  • 语法说明:
    • 'Sheet': 指定要读取或写入的工作表名称或索引。
    • 'Range': 指定要操作的单元格范围。

MATLAB 自有格式 (.mat 文件)

.mat 文件是 MATLAB 用于保存和加载工作区变量的二进制格式,能够完美地保留所有数据类型和变量结构。

save - 保存变量到MAT文件

  • 功能: 将当前工作区的一个或多个变量保存到 .mat 文件中。
  • 语法:
    save(filename)
    save(filename, 'var1', 'var2', ...)
    save(filename, '-struct', 's')
    save(filename, '-append', ...)
    
  • 语法说明:
    • save(filename): 保存工作区中的所有变量。
    • save(filename, 'var1', ...): 只保存指定的变量 var1, var2 等。
    • '-struct', 's': 将结构体 s 的每个字段保存为独立的变量。
    • '-append': 向已存在的 .mat 文件中添加或更新变量,而不是覆盖整个文件。

load - 从MAT文件加载变量

  • 功能:.mat 文件加载变量到当前工作区。
  • 语法:
    load(filename)
    load(filename, 'var1', 'var2', ...)
    S = load(filename, ...)
    
  • 语法说明:
    • load(filename): 加载文件中的所有变量。
    • load(filename, 'var1', ...): 只加载指定的变量。
    • S = load(...): 不将变量直接加载到工作区,而是将它们作为字段加载到一个结构体 S 中。

多媒体文件 (图像、音频、视频)

imreadimwrite - 读写图像文件

  • 功能: 读取和写入标准图像格式文件。
  • 语法:
    A = imread(filename)
    imwrite(A, filename)
    imwrite(A, map, filename)
    
  • 语法说明:
    • imread: 返回一个图像矩阵 A。对于灰度图,A 是二维矩阵;对于 RGB 彩色图,A 是 M x N x 3 的三维矩阵。
    • imwrite: 将矩阵 A 写入图像文件。map 是可选的颜色图参数,用于索引图像。

audioreadaudiowrite - 读写音频文件

  • 功能: 读取和写入标准音频格式文件。
  • 语法:
    [y, Fs] = audioread(filename)
    audiowrite(filename, y, Fs)
    
  • 语法说明:
    • audioread: 返回音频数据 y (一个 Nx1 或 Nx2 的矩阵) 和采样率 Fs (赫兹)。
    • audiowrite: 将音频数据 y 以采样率 Fs 写入文件。

VideoReaderVideoWriter - 读写视频文件

  • 功能: 用于逐帧读取和写入视频文件。它们创建的是对象,需要通过对象的方法来操作。
  • 语法:
    v = VideoReader(filename)
    frame = read(v, frameNumber)
    
    writerObj = VideoWriter(filename, profile)
    open(writerObj)
    writeVideo(writerObj, frame)
    close(writerObj)
    
  • 示例 (读取):
    v = VideoReader('shuttle.avi');
    % 读取第一帧
    firstFrame = read(v, 1);
    image(firstFrame);
    

Web 数据

webreadwebsave - 读写网络数据

  • 功能: 从 Web 服务 (URL) 读取数据或下载文件,是处理网络数据的现代方法。
  • 语法:
    data = webread(url)
    data = webread(url, options)
    filename = websave(filename, url)
    
  • 语法说明:
    • webread: 能自动将 JSON 或 XML 响应解析为 MATLAB 结构体。
    • websave: 将 URL 指向的内容直接保存为本地文件。
    • options: 一个由 weboptions 函数创建的选项对象,用于设置请求方法 (GET/POST)、超时、HTTP 头等。