Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab中的基本文件I/O_Matlab - Fatal编程技术网

Matlab中的基本文件I/O

Matlab中的基本文件I/O,matlab,Matlab,我试图将一个特定的文本文件读入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 3

我试图将一个特定的文本文件读入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)每行“**”后面的第一行包含7列数据,后续行仅包含6列数据。我可以使用tline=fgetl(fid)读取我想要的行,但是如何提取tline中的浮点值,以便将它们分配到Matlab向量中

理想情况下,我想要的是对于由“**”分隔的每个数据块,I/O代码将其读入Matlab向量。例如,对于第一个块K=1,J=1,我有一个向量:

vec1=[37.907237.907237.907237.907237.907237.9072…]

然后对于第二个块K=2,J=1,我会:

vec=[37.942937.942937.942937.942937.942937.942937.9429…]

每个向量,vec的大小为[1 19](即每个数据块中有19个数据点)。下面是我对该问题的尝试(不正确):

如有任何建议,将不胜感激。谢谢

编辑:即使按照Hoki的建议使用textscan,我仍然无法实现这一点(顺便说一句,谢谢)。我得到的错误消息是:1)矩形空矩阵的赋值不正确,2)无法支持包含单元格数组或对象的单元格数组。此外,赋值M=cell2mat(g)返回如下结果:

'37.9072    37.9072    37.9072       ...'
楠 楠 楠 楠 楠 楠 楠 楠 37.9828800000000 楠 楠 楠 楠 楠 楠 楠 3798288000000

我忘了说明上面示例文本文件中的每个浮点数之间有8个空格。当我使用textscan时,它返回一个字符串单元格数组。每个字符串类似于:

'37.9072    37.9072    37.9072       ...'
我想将这些单独的条目提取到一个向量或矩阵中。在阅读我得到的错误后,一种解释是cell2mat仅适用于非字符串条目。如有任何进一步的建议,我们将不胜感激

谢谢,

功能是您的朋友(阅读文档了解更多信息)。利用这一点:

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
在每次迭代中都在增长,但除非您事先知道要读取的块数,否则您别无选择。就这样吧。

如果你不需要知道**中的值是什么,那么你可以使用
'CommentStyle'
textscan
忽略这些行,让MATLAB计算出数字部分(其中可能有多个空格分隔符)。然后,因为您知道每个部分在中有19个值,所以请执行常规重塑。无需循环(这适用于R2013b和您的示例数据):


C(1,:)
现在是您的第一组数据,
C(2,:)
第二组数据,依此类推(如果需要,更容易循环)。

谢谢Hoki。我听从了你的建议,但仍然无法实现这一点(见上面的编辑)。@AJA。cell2mat实际上只对数值有效。请更新你的帖子,以显示你的文本文件的几行完全一样,否则会有太多的尝试和错误。同时指出线条图案是否一致(始终相同)或有时不同。
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';