我正在尝试将特定的文本文件读入Matlab,并仅将浮点值存储到Matlab矩阵中。我找到了几种不同的方法,但没有一种方法可以按我想要的方式工作。我认为问题是文本文件的格式。以下是该文件的前几行:
**K = 1, J = 1
37.9072 37.9072 37.872 37.9072 37.9072 37.5572 37.9072
37.9072 37.9172 37.9072 37.962 37.9552 37.9072
37.9222 37.9072 37.9322 37.9072 37.9332 37.9072
** K = 2, J = 1
34.9249 34.9249 34.9349 34.9249 34.9679 34.9249 34.9249
34.9249 34.2439 34.9249 34.9249 34.9249 34.9249
34.9459 34.9249 34.9549 34.9249 34.6749 34.9889
**K = 3, J = 1
37.94501 37.94401 37.94501 37.94501 37.99501 37.96501 37.94501
37.94501 37.94101 37.93301 37.94501 37.94501 37.94501
37.94501 37.90501 37.94501 37.90001 37.94501 37.99801
我遇到的问题是:1)每个数字不是用制表符分隔,而是用多个空格分隔,2)在' **&#39之后的每一行的第一行;包含7列数据,后续行仅包含6列数据。我能够使用tline = fgetl(fid)读取我想要的行,但是如何在tline中提取浮动值以便我可以将它们分配到Matlab向量中?
理想情况下,我希望拥有的是由' **'分隔的每个数据块,I / O代码将其读入Matlab向量。例如,对于第一个块K = 1,J = 1,我将有一个向量:
vec1 = [37.9072 37.9072 37.9072 37.9072 37.9072 ...]
然后对于第二个块K = 2,J = 1,我会:
vec = [37.9429 37.9429 37.9429 37.9429 37.9429 37.9429 ...]
每个向量vec的大小为[119](即每个数据块中有19个数据点)。以下是我对问题的尝试(这是不正确的):
fid = fopen('Temp2017-01-01.txt');
m = 1;
while ischar(tline)
if(tline(1) == '*') %to skip lines which start with '*'
tline = fgetl(fid);
elseif(length(tline) > 112) %to get the line containing 7 columns of data
vec(m, :) = sscanf( tline( 1:end ), '%f,%f,%f,%f,%f,%f,%f' )
else %to get the lines containing 6 columns of data
vec(m, :) = sscarf(tline(1:end), '%f,%f,%f,%f,%f,%f,%*s' )
end
m = m + 1;
end
fclose(fid);
任何建议都将不胜感激。谢谢,
编辑:我仍然无法让这个工作,即使使用文本扫描,正如Hoki建议的那样(感谢顺便说一下)。我得到的错误消息是:1)矩形空矩阵的不正确赋值,以及2)不支持包含单元格数组或对象的单元格数组。此外,赋值M = cell2mat(g)返回类似于:
的内容的NaN 为NaN 为NaN 为NaN 为NaN 为NaN 为NaN 为NaN 37.9828800000000 为NaN 为NaN 为NaN 为NaN 为NaN 为NaN 为NaN 37.9828800000000
我忘了清楚地说明上面示例文本文件中的每个浮点数之间有8个空格。当我使用textscan时,它返回一个字符串的单元格数组。每个字符串都是这样的:
'37.9072 37.9072 37.9072 ...'
我想将这些单独的条目中的每一个提取到矢量或矩阵中。在阅读我得到的错误后,一个解释是cell2mat仅适用于非字符串条目。任何进一步的建议都非常感谢。
谢谢,
答案 0 :(得分:1)
textscan
功能是你的朋友(阅读文档了解更多信息)。使用它:
fid = fopen('Temp2017-01-01.txt');
vec = zeros( 0,19 ) ;
while ~feof(fid)
l0 = fgetl(fid) ; %// do nothing with that (or extract the K and J if you need them)
%// this will read as many '%f' numbers it can (19 in your case)
M = textscan( fid , '%f' , 'delimiter',' ' ) ;
vec(end+1,:) = cell2mat( M ) ; %// convert them to matrix and add to global result
end
fclose(fid)
Mlint会抱怨矩阵vec
在每次迭代中都在增长,但除非您事先知道要阅读的块数,否则您别无选择。随便一起去。
答案 1 :(得分:1)
如果您不需要知道**中的值是什么,那么您可以使用'CommentStyle'
使textscan
忽略这些行,让MATLAB找出数字部分(具有潜在的多个空白分隔符)。然后,既然你知道每个部分都有19个值,那就做一个通用的重塑。不需要循环(这适用于R2013b和您的样本数据):
fid = fopen('yourfile.txt')
C = textscan(fid,'%f','CommentStyle','**');
fclose(fid)
C = C{1}; % escaping cell
% reshape to be 19 numbers on each row
C = reshape(C,19,[]);
C = C';
C(1,:)
现在是您的第一组数据,第二组是C(2,:)
,依此类推(如果需要,更容易循环)。