楼主: wuyou136

[我分享] MATLAB中文论坛基础板块常见问题归纳

  [复制链接]

新手

10 麦片

财富积分


050


0

主题

91

帖子

0

最佳答案
发表于 2016-3-5 22:23:52 | 显示全部楼层
感谢楼主,学习了,谢谢了

论坛优秀回答者

权威

3586 麦片

财富积分



19

主题

3775

帖子

768

最佳答案
  • 关注者: 380
 楼主| 发表于 2016-4-4 19:47:12 | 显示全部楼层
6、读取文本文件
文本文件的读写函数可以分为两类,一类是高级函数(high-level),一类是底层函数(low-level)。通常认为高级函数运用起来简单,但是定制性差。而底层函数用法复杂,但是灵活性高。由于MATLAB提供了许多可以读取文本文件的函数,比如loadimportdatatextreaddlmreadcsvread,要把这些函数各自的适用范围弄清楚也不是一件容易的事。所以我的建议是掌握两个底层函数fscanftextscan的用法,这样就能够轻松应对一般文本文件的读取了。下面简单介绍几个高级函数的用法,着重介绍两个底层函数fscanftextscan的用法。

1csvread
csvread用于读取形式比较简单的文本文件,文件内容只包括数值,并且以逗号或空格为分隔符。
csvread常用用法:
M = csvread(filename)
filename即你需要读取的文件。
例如,创建一个文件,csvlist.dat,包含以下数据:
16,2,3,13
5,11,10,8
9,7,6,12
4,14,15,1
读取整个文件:
  1. filename = 'csvlist.dat';
  2. M = csvread(filename)
复制代码
  1. M =

  2.     16     2     3    13
  3.      5    11    10     8
  4.      9     7     6    12
  5.      4    14    15     1
复制代码
2dlmread
dlmread的用法比csvread稍微复杂一点,它能够指定分隔符(csvread只能读取逗号分隔符和空格分隔符)
dlmread常见用法:
M = dlmread(filename)
M = dlmread(filename, delimiter)
其中filename为所读取的文件,delimiter为分隔符。
例:对于包含以下内容的文本文件:
162313
511108
97612
414151
就可以指定为分隔符进行读取:
  1. filename = 'csvlist.dat';
  2. M = dlmread(filename,’。’)
复制代码
  1. M =

  2.     16     2     3    13
  3.      5    11    10     8
  4.      9     7     6    12
  5.      4    14    15     1
复制代码
如果行列数不一致的数据,dlmread会自动在空白数据处补0
例:对于包含以下内容的文本文件:
40 5 30 1.6 0.2 1.2
15 25 35 0.6 1 1.4
20 45 10 0.8 1.8 0.4
  
2.6667 0.33333 2
1 1.6667 2.3333

1.3333 3 0.66667
  1. filename = 'csvlist.dat';
  2. M = dlmread(filename)
复制代码
  1. M =
  2. 40.0000    5.0000   30.0000    1.6000    0.2000    1.2000
  3.     15.0000   25.0000   35.0000    0.6000    1.0000    1.4000
  4.     20.0000   45.0000   10.0000    0.8000    1.8000    0.4000
  5.     2.6667    0.3333    2.0000         0         0         0
  6.     1.0000    1.6667    2.3333         0         0         0
  7.     1.3333    3.0000    0.6667         0         0         0
复制代码

论坛优秀回答者

权威

3586 麦片

财富积分



19

主题

3775

帖子

768

最佳答案
  • 关注者: 380
 楼主| 发表于 2016-4-4 19:49:29 | 显示全部楼层
3fscanf
按指定格式从文本文件中读取数据。
用法:
A = fscanf(fileID,formatSpec); 通过指定读取格式formatSpec从文本文件中读取数据至列向量Afscanf会重复应用格式字符串formatSpec直到文件指针到达文件末尾,如果读取到不能匹配formatSpec的数据则读取将自动结束。
A =fscanf(fileID,formatSpec,sizeA);sizeA能够指定读取数据的大小,当读取到sizeA大小的数据时,文件指针会停止,读取结束。注意fscanf读取的是列主序,通常读取完还需要进行转置操作。
所要读取的文本文件被文件标识符fileID标识,通过fopen函数可以获取文件的fileID。当结束读取时,一定要记得使用fclose函数关闭文件。
光看函数的用法介绍可能会比较难懂,通过下面的例子其实会比较容易理解。
例:文本文件test.txt包含以下数据:
162313
511108
97612
414151
  1. fid=fopen('test.txt');  %通过fopen获取文件标识
  2. formatSpec='%d。%d。%d。%d'; %指定读取格式
  3. A=fscanf(fid,formatSpec ,[4,4]); %读取文件数据并存为4*4矩阵
  4. fclose(fid); %调用fclose关闭文件
  5. A=A.’ %由于fscanf是列主序,因此读取完还需要进行转置
复制代码
  1. A =

  2.     16     2     3    13
  3.      5    11    10     8
  4.      9     7     6    12
  5.      4    14    15     1
复制代码
下面详细解释一下fscanf的读取原理。
首先当用fopen打开文件时,会有一个文件指针在文件开头。然后fscanf通过你设定的格式字符串formatSpec来读取数据(formatSpec由字符串和转义说明符组成,其中转义说明符由%开头,以转换字母结尾。上面的例子当中%d就是一个转义说明符,代表一个整数,常用的还有%f、%s,分别代表浮点数和字符串)。formatSpec第一个是转义说明符%d,那么fscanf就先将第一个整数16读取给A,之后文件指针跳到16右边,然后formatSpec第2个是字符串’。’,这时候文件指针就会跳过’。’,文件指针到达’。’右边。之后再是转义说明符%d,则将2读入进A,以此类推。用下面图片进行说明:

fscanf.jpg

论坛优秀回答者

权威

3586 麦片

财富积分



19

主题

3775

帖子

768

最佳答案
  • 关注者: 380
 楼主| 发表于 2016-4-4 19:52:29 | 显示全部楼层
本帖最后由 wuyou136 于 2016-4-4 20:05 编辑

如果将这个例子的读取代码写成:
  1. fid=fopen('test.txt');
  2. A=fscanf(fid,'%d。',[4,4])
  3. fclose(fid);
  4. A=A.'
复制代码
将会得到:
  1. A =

  2. 16     2     3    13
复制代码
原因就是因为当文件指针读取完13时,formatSpec需要匹配的数据是’。’,但是13的下一个数据5,这时候就会匹配失败,fscanf自动停止。

再以一个比较复杂的文本文件为例:
例:文本文件test.txt包含以下数据:
lambda:  7.580000e-05
lambdaB:  8.000000e-05
initial pulse width:  7.853636e-13
output pulse width:  6.253030e-13
dispersion length:  6.307732e-02
nonlinear length:  9.572495e-01

lambda:  7.590000e-05
lambdaB:  8.000000e-05
initial pulse width:  7.848788e-13
output pulse width:  5.778485e-13
dispersion length:  5.852858e-02
nonlinear length:  9.195277e-01

现在想要把所有的数字信息提取出来:
  1. fid=fopen('F:\test.txt');
  2. c1='%*s %e';  %第一行的转义说明符,’%’后面接一个’*’代表跳过这个数据,%*s即代表跳过第一个字符串’lambda:’,%e表示读取以科学计数法表示的数字。
  3. c2='%*s %e';
  4. c3='%*s %*s %*s %e';
  5. c4='%*s %*s %*s %e';
  6. c5='%*s %*s %e';
  7. c6='%*s %*s %e';
  8. formatSpec=[c1,c2,c3,c4,c5,c6]; %以6行为一组,重复读取,直至读取完整个文件
  9. A=fscanf(fid,formatSpec,[6,inf])
  10. fclose(fid);
复制代码
4textscan
textscan的用法与fscanf类似,建议先将fscanf的用法弄清楚再来看textscan
textscan常见用法:
C = textscan(fileID,formatSpec)
C = textscan(fileID,formatSpec,N)
fscanf一样,fileID为文件标识符,formatSpec为格式字符串。N则是重复匹配formatSpec的次数。
fscanf不同的是,textscan将每个与formatSpec转义说明符匹配出来的数据都用一个元胞进行存储。并且textscan有很多选项提供,比如’Headerlines’,可以指定跳过文件的前n行;’Delimiter’可以指定分隔符等等。
例:文本文件test.txt包含以下数据:
162313
511108
97612
414151
  1. fid=fopen('F:\test.txt');
  2. formatSpec='%d'
  3. A=textscan(fid,formatSpec,'delimiter','。'); %指定’。’为分隔符,如果不指定分隔符的话,就需要把formatSpec写成'%d。%d。%d。%d' 。
  4. fclose(fid);
  5. celldisp(A)
复制代码
论坛关于文本文件读取问题:
http://www.ilovematlab.cn/forum.php?mod=viewthread&tid=459528
http://www.ilovematlab.cn/thread-449066-1-1.html
http://www.ilovematlab.cn/thread-448439-1-1.html


新手

5 麦片

财富积分


050


0

主题

1

帖子

0

最佳答案
发表于 2016-4-11 20:24:46 | 显示全部楼层
楼主我想请教一下,在使用fsolve函数的时候,如果输出结果的值有三个,我只想输出第一个值应该用什么命令?

论坛优秀回答者

权威

3586 麦片

财富积分



19

主题

3775

帖子

768

最佳答案
  • 关注者: 380
 楼主| 发表于 2016-4-11 20:26:39 | 显示全部楼层
llww700 发表于 2016-4-11 20:24
楼主我想请教一下,在使用fsolve函数的时候,如果输出结果的值有三个,我只想输出第一个值应该用什么命令? ...

你给定一个返回值,输出就是一个值了:
sol=fsolve(...)

新手

11 麦片

财富积分


050


6

主题

18

帖子

0

最佳答案
发表于 2016-4-13 15:39:34 | 显示全部楼层
我想问楼主,就是我载入的数据原有七位小数的,用IMPORTDATA之后就 只有四位小数了,有没有什么可以帮我解决这个问题的函数?

论坛优秀回答者

权威

3586 麦片

财富积分



19

主题

3775

帖子

768

最佳答案
  • 关注者: 380
 楼主| 发表于 2016-4-13 15:40:59 | 显示全部楼层
懒丫头 发表于 2016-4-13 15:39
我想问楼主,就是我载入的数据原有七位小数的,用IMPORTDATA之后就 只有四位小数了,有没有什么可以帮我解 ...

你是载入什么格式的数据?
如果是txt的话可以用fscanf控制精度

新手

11 麦片

财富积分


050


6

主题

18

帖子

0

最佳答案
发表于 2016-4-13 15:46:50 | 显示全部楼层
wuyou136 发表于 2016-4-13 15:40
你是载入什么格式的数据?
如果是txt的话可以用fscanf控制精度

是txt格式的,我突然发现我自己定义的一个变量,在workspace查看时也变成四位小数了,是默认为四位吗?

论坛优秀回答者

权威

3586 麦片

财富积分



19

主题

3775

帖子

768

最佳答案
  • 关注者: 380
 楼主| 发表于 2016-4-13 15:55:18 | 显示全部楼层
懒丫头 发表于 2016-4-13 15:46
是txt格式的,我突然发现我自己定义的一个变量,在workspace查看时也变成四位小数了,是默认为四位吗?
...

是显示精度的问题。你试一下输入:
format long
命令
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表