matlab用fgetl读取txt文件数据,然后绘制散点图
我有一大量数据的txt文件,如-721.01711.9214.7149155-720.97712.2714.7149156-720.93712.6214.7149156-...
我有一大量数据的txt文件,如
-721.01 711.921 4.7149155
-720.97 712.271 4.7149156
-720.93 712.621 4.7149156
-721.7 716.811 4.7149155
用m=fgetl(fid)后得到
m =
-720.97 712.271 4.7149156
此时若用x=m(:,1);y=m(:,2);z=m(:,3);scatter3(x,y,z)则无法显示
后来发现运行后得到x=-,y=7,z=2 就是第一个数据-721.0的前三个符
而用m=load(‘*.txt’);x=m(:,1);y=m(:,2);z=m(:,3);
得到x=-721.01 y=711.921 z=4.7149155是我想得到的
因为数据量大,几百万个,不能使用load函数,请问怎么解决这个问题 展开
-721.01 711.921 4.7149155
-720.97 712.271 4.7149156
-720.93 712.621 4.7149156
-721.7 716.811 4.7149155
用m=fgetl(fid)后得到
m =
-720.97 712.271 4.7149156
此时若用x=m(:,1);y=m(:,2);z=m(:,3);scatter3(x,y,z)则无法显示
后来发现运行后得到x=-,y=7,z=2 就是第一个数据-721.0的前三个符
而用m=load(‘*.txt’);x=m(:,1);y=m(:,2);z=m(:,3);
得到x=-721.01 y=711.921 z=4.7149155是我想得到的
因为数据量大,几百万个,不能使用load函数,请问怎么解决这个问题 展开
2个回答
展开全部
首先不能使用load函数的原因是内存不够不能读还是读取速度太慢?
如果内存不够的话那就只能用fgetl; 如果读取速度慢的话可以先读一遍然后存为mat文件; 以后导入的时候只需要load mat文件速度能快很多(真的是很多),这时候数据仍然是浮点数格式的,可以直接用矩阵访问方式访问。load mat文件的好处是速度快,缺点是数据会占用内存空间。
如果用fgetl的话,读出来的一行是以字符串形式。需要进行分割转换才能成为可用的数据。而且速度会慢一点,而且由于只能逐行读,读越后面的行速度就越慢。
下面是一个简单的例子,建议仔细理解
% ---------------------------------------------------------------------------------
commandLine = '12.3 14.5 15.5';
commandLine=regexp(commandLine,' ','split'); %以空格为特征分割字符串
for i = 1:size(commandLine,2)
command=str2num(char(commandLine(i)));
command - 1 % 验证是否最后是可进行数学运算的浮点数格式
end
% ----------------------------------------------------------------------------------
如果数据格式并不像上面给的例子那么好的话,建议先进行相应的处理。
鉴于LZ似乎对fgetl不熟悉,请理解下面代码:
fid = fopen('inputFile.txt','r');
line = 1; %行标记
while ~feof(fid)
lineData = fgetl(fid);
if line == 5
% 对特定行的lineData进行处理,可以适当采用跳出循环的语句节省运算时间
end
line=line+1;
end
fclose(fid);
如果内存不够的话那就只能用fgetl; 如果读取速度慢的话可以先读一遍然后存为mat文件; 以后导入的时候只需要load mat文件速度能快很多(真的是很多),这时候数据仍然是浮点数格式的,可以直接用矩阵访问方式访问。load mat文件的好处是速度快,缺点是数据会占用内存空间。
如果用fgetl的话,读出来的一行是以字符串形式。需要进行分割转换才能成为可用的数据。而且速度会慢一点,而且由于只能逐行读,读越后面的行速度就越慢。
下面是一个简单的例子,建议仔细理解
% ---------------------------------------------------------------------------------
commandLine = '12.3 14.5 15.5';
commandLine=regexp(commandLine,' ','split'); %以空格为特征分割字符串
for i = 1:size(commandLine,2)
command=str2num(char(commandLine(i)));
command - 1 % 验证是否最后是可进行数学运算的浮点数格式
end
% ----------------------------------------------------------------------------------
如果数据格式并不像上面给的例子那么好的话,建议先进行相应的处理。
鉴于LZ似乎对fgetl不熟悉,请理解下面代码:
fid = fopen('inputFile.txt','r');
line = 1; %行标记
while ~feof(fid)
lineData = fgetl(fid);
if line == 5
% 对特定行的lineData进行处理,可以适当采用跳出循环的语句节省运算时间
end
line=line+1;
end
fclose(fid);
追问
谢谢你的解答。读取速度也能够接受(大概半分钟吧),问题在于用PLOT3或者scatter3的时候显示得太慢,不知道这与读取速度有关系吗?
另外,关于那段fgetl的代码,能够执行到5的前提在于fgetl每执行一次就自动读下一行,所以让执行5次就足够了。但这无疑很耗费时间,有没有什么办法可以一次性跳到第5行?不知道我理解的对不对
追答
和读取文件的速度没有关系,因为当文件读取完了以后,数据就都存在内存里面了。plot 命令快慢主要看你plot的点的数目和电脑运算的速度。如果你在循环里面用plot的话,不断调用plot命令会导致电脑有点卡;这也是没有办法的事情。
fgetl只能逐行读取,我暂时还没有发现可以一次性跳行的方法。而且虽然看似需要一行一行跳,实际速度是很快的。下面a.txt是一个一万多行的文本,读完一秒都不到。
close all;clear all;clc;
fid = fopen('a.txt','r');
line = 1; %行标记
while ~feof(fid)
lineData = fgetl(fid);
if line == 5
% 对特定行的lineData进行处理,可以适当采用跳出循环的语句节省运算时间
end
line=line+1;
end
disp(['ok'])
fclose(fid);
展开全部
fnm = '1.txt';
dt = textread(fnm);
x = dt(:,1);
y = dt(:,2);
z = dt(:,3);
dt = textread(fnm);
x = dt(:,1);
y = dt(:,2);
z = dt(:,3);
追问
直接一次性读取么,不行的。。。。文件太大,显示不过来。隔行读取才行,所以求教怎么用fgetl
追答
fnm = '1.txt';
dt = dlmread(fnm,' ','A1:C4'); % 读取空格分隔的数据,范围为 A1:C100 (似Excel表示的范围)
x = dt(:,1);
y = dt(:,2);
z = dt(:,3);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询