关于批量导入数据的方法
求助各位高手!现在我有很多以txt为后缀的文本数据,都是相同数量的行和列,现在有两个问题请教!
1.例如文件都是AAA1.txt,AAA2.txt~AAA2000.txt 为命名,严格按照递增排列。请问怎样才能高效的导入这些数据,使每个数据对应一个矩阵;
2.我想在上述每个矩阵中,提取相同位置的数据,再次拼接成一个新矩阵,又该怎样执行才较快?
多谢各位高手,大牛! 原帖由 zhaobo_ren 于 2008-11-13 14:28 发表 http://forum.simwe.com/images/common/back.gif
求助各位高手!
现在我有很多以txt为后缀的文本数据,都是相同数量的行和列,现在有两个问题请教!
1.例如文件都是AAA1.txt,AAA2.txt~AAA2000.txt 为命名,严格按照递增排列。请问怎样才能高效的导入这些数据,使 ...
load,uigetfile都可以实现类似的功能
如果是excel存的,还可以用xlsread
关于uigetfile可看帮助或仔细阅读下面贴子的链接
http://forum.simwe.com/thread-848120-1-10.html
举个load的例子
假设有数据文件,data1.txt和data2.txt
其中存放的分别是5X5的矩阵数据为
data1: 0.8147 0.0975 0.1576 0.1419 0.6557
0.9058 0.2785 0.9706 0.4218 0.0357
0.1270 0.5469 0.9572 0.9157 0.8491
0.9134 0.9575 0.4854 0.7922 0.9340
0.6324 0.9649 0.8003 0.9595 0.6787
data2:
0.7577 0.7060 0.8235 0.4387 0.4898
0.7431 0.0318 0.6948 0.3816 0.4456
0.3922 0.2769 0.3171 0.7655 0.6463
0.6555 0.0462 0.9502 0.7952 0.7094
0.1712 0.0971 0.0344 0.1869 0.7547
你想将其读入,并提取其中的2、3、4行,4、5列中的内容
并组成一个新的矩阵可如下编程:a=load('data1.txt')
b=load('data2.txt')
c=
执行后,结果为:
a =
0.8147 0.0975 0.1576 0.1419 0.6557
0.9058 0.2785 0.9706 0.4218 0.0357
0.1270 0.5469 0.9572 0.9157 0.8491
0.9134 0.9575 0.4854 0.7922 0.9340
0.6324 0.9649 0.8003 0.9595 0.6787
b =
0.7577 0.7060 0.8235 0.4387 0.4898
0.7431 0.0318 0.6948 0.3816 0.4456
0.3922 0.2769 0.3171 0.7655 0.6463
0.6555 0.0462 0.9502 0.7952 0.7094
0.1712 0.0971 0.0344 0.1869 0.7547
c =
0.4218 0.0357 0.3816 0.4456
0.9157 0.8491 0.7655 0.6463
0.7922 0.9340 0.7952 0.7094
回复 2# ljelly 的帖子
我又看了一遍版主的回复,发现这个问题并不在于其怎么算,而是怎样更高效的调用和拼接矩阵。我的数据是txt文件,用load可以单独调用每一个文件,但我有上千个文件,怎样把那个AAA1.txt之类数据命名中的数字1循环起来,才是我最关心的!这个文件从AAA1.txt到AAA2000.txt,共2000个。只用load要复制2000遍。还是极其繁琐,该怎样解决这个问题呢?还请版主赐教 用 num2str:
for i = 1:2000
s = ['AAA' num2str(i) '.txt'];
load s
end 呵呵,我这里正好有篇论文,给你提供一下,不知道对你有没有用。
回复 5# kokyo52 的帖子
呵呵,不瞒兄台,我就是这么干的!效率很低!回复 6# zhoulon 的帖子
谢谢这位版主!我先看看!另外就是那个问题2,我还是不知道该怎样才能高效大批量处理,还请指教! 原帖由 kokyo52 于 2008-11-13 15:40 发表 http://forum.simwe.com/images/common/back.gif
用 num2str:
for i = 1:2000
s = ['AAA' num2str(i) '.txt'];
load s
end
你只不过是用了循环,次数与一个个执行没有太大的区别
要是不用循环,效率会高一些
看看zhoulon提供的资料是不是有更好的方法
回复 6# zhoulon 的帖子
文章看完了,里面说的是一次导入大量数据,而我想实现的是多次海量导入数据,这个次数太多了,按照论文里说的话,光点击鼠标就要上万次!还请各位高手指点! 你每个文件多大的,可以用textread,一次不读取那么多进来。另外可以考虑使用Memory-Mapping,应该比直接load或者textread什么的快一点,只是这个方面我也刚刚接触,不熟悉,你自己看看帮助文档吧。[ 本帖最后由 feynmand 于 2008-11-13 17:05 编辑 ]
回复 11# feynmand 的帖子
文件都不是很大,基本500k左右,就是太多了!需要高效点的批处理。我查阅了以前论坛的帖子,真的还没有这个关于批处理的详细说明 原帖由 feynmand 于 2008-11-13 16:41 发表 http://forum.simwe.com/images/common/back.gif你每个文件多大的,可以用txtread,一次不读取那么多进来。另外可以考虑使用Memory-Mapping,应该比直接load或者txtread什么的快一点,只是这个方面我也刚刚接触,不熟悉,你自己看看帮助文档吧。
你说的是textread吧?
不过按zhaobo_ren的要求,就算是500k的文件,20000个这样的数据量,如果直接导进来,内存能放得下吗?
还是应该读一个处理一个,最后拼成想要的形式
既然是量大,又想快捷,本身就很矛盾,的确是有挑战,欢迎大家讨论 Num0=20 %文件排序起始个数%
Num=267 %文件排序终了个数%
for i=Num0:Num %导入AAA.txt文件,文件由AAA0.txt开始
eval(['load AAA',num2str(i),'.txt;']) %eval将字符转化为窗口命令,num2str(i)将数字转化为字符
end
我就是这么做的,感觉速度很慢!其实这个还不是最主要的,最主要的是从这么多数据中提出我要的行元素,然后再拼到一起,这个最慢!也是由eval写的。起始就想让文件名编号实现循环即可!所以采用了num2str(i),而发现效率很低!
请教各位高手,要是实现这个文件名和参数名循环,除了eval之外,还有什么办法? eval的讨论早在以前bzzz兄的一些帖子里就曾经说过,循环执行时效率较低,zhaobo_ren兄这个问题感觉有如下三种途径可以改善:
1.将程序改写成C-MEX或者F-MEX,MEX在执行效率上与M程序有时大大改善,有时则无甚变化,甚至还慢。但就本问题而言估计写成MEX会好很多。
2.既然只是需要有格式数据文件中部分行的信息,那么可参照fgetl、fgets、textscan等命令逐行读取汇总为一个数据文件如mat等,把后处理部分最后进行。
3.完全改用fortran或VC++
回复 15# bainhome 的帖子
没想到这个帖子能引起这么多,谢谢各位版主!方法1,我试验了,或许是不好用,或许是我不会用,效果不好!
方法2,我感觉只能处理一个或几个文件,但是文件名里的数字循环我还没有参透该怎么做。
方法3,如果matlab不能实现高效处理,我想只要该用C或F了。
总之,十分感谢各位! 本帖最后由 tianben 于 2009-9-7 21:24 编辑
大虾们各显神通,认真学习了。
虽然导入的一堆变量名称是按照序数排列的,但是仍然不方便调用,比如将所有变量都转置然后输出,应该怎么有效的操作呢?? 本帖最后由 messenger 于 2009-11-4 16:57 编辑
那假如每个数据表都有表头,也就是都有字符,直接不能读取,手动删太慢了吧。怎么处理啊?
每个数据表出来都有表头的吧。没有的话岂不是乱了。但是合并在一起的话,只需要一个表头,中间的怎么删除啊?
每个文件挺小的,合并在一起就可观了
名称应该不是问题吧,最简单的就是按照顺序排列,是选择循环还是别的什么方法高效? 本帖最后由 messenger 于 2009-11-7 14:58 编辑
17# liaohuanxin
什么样的数据?举一个例子出来
那假如每个数据表都有表头,也就是都有字符,直接不能读取,手动删太慢了吧。怎么处理啊?
每个数据表出来都有表头的吧。没有的话岂不是乱了。但是合并在一起的话,只需要一个表头,中间的怎么删除啊?
每个文件挺 ...
liaohuanxin 发表于 2009-11-4 14:14 http://forum.simwe.com/images/common/back.gif 用 num2str:
for i = 1:2000
s = ['AAA' num2str(i) '.txt'];
load s
end
kokyo52 发表于 2008-11-13 15:40 http://forum.simwe.com/images/common/back.gif
小错误, 应该为load(s) "文件都不是很大,基本500k左右", 但究竟矩阵是多大, 200*200 ???
个人直觉LZ的问题在空间, 若同时有2000个200*200矩阵同时存在, 所需内存不小喔!
建议试试每load一笔即处理, 先删除不必存在矩阵後, 再读下一笔
或以同一矩阵名称读入workspace
页:
[1]
2