一文弄不懂MATLAB数据导入
本文最后更新于:2024年12月18日 晚上
引子
今天在分析车道保持的训练数据时,想着之前也用过matlab分析过硅电池效率,这次也想着弄个图出来。一看log文件是csv格式,又懒得转成xlsx格式(虽然也就是两三步的事,但我今天还就和它杠上了,我非要用这个csv格式的文件)。
之前分析硅电池的时候,用的是xlsread命令导入xlsx文件,现在是csv文件,我先是想到了load命令,后来又再网上搜到了类似的csvread命令和一个我之前没遇到过的importdata命令。索性这次就好好捋一捋不同导入函数之间的爱恨情仇。(只总结了一些我认为比较常用的函数,更为详细的可查看官方文档。如果在之后的学习工作中我用到了其他的函数,我会继续添加上来。)
### xlsread命令
将文件变量导入到工作区中,一般针对电子表格文件。
由于兼容性问题,不推荐使用这个函数,推荐使用readmatrix函数。
csvread命令
读取逗号分隔值 (CSV) 文件。
由于兼容性问题,不推荐使用这个函数,推荐使用readmatrix函数。
使用命令M = csvread(filename,R1,C1,[R1 C1 R2 C2]),仅读取行偏移量
R1 和 R2 及列偏移量 C1 和 C2
界定的范围。另一种定义范围的方法是使用电子表格表示法(例如
'A1..B7')而非 [0 0 6 1]。
说人话:从csv文件中的第R1行开始读取到第R2行,第C1列开始读取到第C2列。例如:
存在csv文件:
1
2
3
402, 04, 06, 08
03, 06, 09, 12
05, 10, 15, 20
07, 14, 21, 28
1
2
3
4
5
6
7filename = 'csvlist.csv';
M = csvread(filename);
M = csvread('csvlist.csv',1,0,[1,0,2,2]);
M =
3 6 9
5 10 15
注意:
- 与matlab数组下标从1开始不同,偏移量 R1=0、C1=0
指定文件中的第一个值。
- 我们可以使用电子表格表示法(例如 'A2..C3')而非 [1
0 2 2]来指定读取范围。
readmatrix命令
readmatrix功能非常强大,可以从文件中读取矩阵。非常适合于以下两种文件:
- .txt、.dat 或 .csv(带分隔符的文本文件)
- .xls、.xlsb、.xlsm、.xlsx、.xltm、.xltx 或 .ods(电子表格文件)
A = readmatrix(filename)
使用命令M = readmatrix('basic_matrix.xlsx')将电子表格文件中的数值数据导入为矩阵,并命名为M。
A = readmatrix(filename,opts)
通过配置opts参数,可以使得在导入数据的时候满足更多个性化需求。
例如,假如我有一个电子表格文件 airlinesmall_subset.xlsx 包含 1996 年至
2008 年间多个工作表中的数据。每个工作表都包含给定年份的数据。使用命令:
1
2
3
4
5opts.Sheet = '2007'; %指定读取名称为‘2007’的工作表中的数据
opts.SelectedVariableNames = [1:5]; %指定读取第1列到第5列的变量
opts.DataRange = '2:11'; %指定读取第2行到第11行的数据
M = readmatrix('airlinesmall_subset.xlsx',opts)
%相当于使用命令:M = readmatrix('airlinesmall_subset.xlsx','Sheet','2007','Range','A2:E11')
imread命令
从图形文件读取图像。
A = imread(filename)
从 filename 指定的文件读取图像,并从文件内容推断出其格式。如果
filename 为多图像文件,则 imread 读取该文件中的第一个图像。
audioread命令(暂定)
将文件变量导入到工作区中,一般针对音频文件
load命令
将文件变量导入到工作区中,一般针对matlab特有的格式文件,即
.mat文件。
注意:load 命令在初始化变量时可能会执行 MAT
文件中包含的代码。请避免对不受信任的 MAT 文件调用 load
load(filename)
使用命令:
1
A = load(filename) %filename可以是.mat文件,也可以是ASCII文件(也叫文本文件即.txt文件)
注:ASCII文件指含有用标准ASCII字符集编码的字符的数据和文本文件,只含有字母、数字和常见的符号。这种文件在磁盘中存放时每个字符对应一个8bits的字节,用于存放对应的ASCII码。区别于按二进制的编码方式来存放文件的二进制文件。 - 如果 filename 是 MAT 文件,则load(filename) 会将 MAT 文件中的变量加载到 MATLAB® 工作区,A是结构数组。 - 如果 filename 是 ASCII 文件,load(filename) 会创建一个包含该文件数据的双精度数组。
我们还可以通过下面两条命令来指定导入的文件类型,而不管文件拓展名是什么:
1A = load(123.mat, ‘-ascii’) %尽管文件后缀为mat格式,我们仍将其作为ascii文件导入
1A = load(456.txt, ‘-mat’) %尽管文件后缀为txt格式,我们仍将其作为mat文件导入
注:load函数的命令形式,使用命令’load filename’,省去了括号和文件名字符串外面的引号,除此之外我也不知道为什么要创造这个命令形式。
importdata命令将数据导入到工作区中,可以导入各种类型的数据(如图片数据、数字、字符串等)、系统剪切板的数据等,函数的输入参数
delimiterIn、headerlinesIn表示文件中的数据分隔符、以及我想从哪一行数据开始导入。
附[mathworks官方importdata说明文档] (https://ww2.mathworks.cn/help/matlab/ref/importdata.html#btldf1f-1)
importdata(filename,delimiterIn,headerlinesIn)
说人话:使用参数delimiterIn告诉matlab我们文件中的数据分隔符是什么。使用参数headerlinesIn告诉matlab我想从哪里开始导入数据。如:
我们使用文本编辑器创建一个带有列标题的称为 myfile01.txt 的空格分隔
ASCII 文件。
1
2
3
4
5
6Day1 Day2 Day3 Day4 Day5 Day6 Day7
95.01 76.21 61.54 40.57 5.79 20.28 1.53
23.11 45.65 79.19 93.55 35.29 19.87 74.68
60.68 1.85 92.18 91.69 81.32 60.38 44.51
48.60 82.14 73.82 41.03 0.99 27.22 93.18
89.13 44.47 17.63 89.36 13.89 19.88 46.60
1
2
3
4
5
6filename = 'myfile01.txt';
delimiterIn = ' ';
headerlinesIn = 1;
A = importdata(filename,delimiterIn,headerlinesIn);
% 也就是A = importdata(‘myfile01.txt’, ‘ ’, 1);
% 注意,第二个单引号内存在一个空格
获得一个结构体输出:
导出了从第headerlinesIn
+1即第二行开始的数值数据作为struct中的data,第headerlinesIn行作为colheaders,第一行到第headerlinesIn行的数据作为textdata。在缺省headerlinesIn参数的情况下importdata
函数将会在文件中检测该值。
[A,delimiterOut,headerlinesOut] = importdata(___)
在delimiterOut中额外返回检测到的输入 ASCII
文件中的分隔符,以及在headerlinesOut中返回检测到的标题行数。
A = importdata('-pastespecial')
将系统剪切板上的数据导入给A变量,这个数据不能是图片,因为系统剪切板复制的图片并没有存储在当前目录中。
### uiimport命令(暂定)
