在MATLAB中将文本文件加载为矩阵

时间:2015-12-07 13:40:02

标签: python matlab text-files

我有一个文本文件,这是一个庞大的数据集(大约9 GB)。我已将文件排列为244 X 3089987,并使用制表符分隔数据。我想在Matlab中加载这个文本文件作为矩阵。这是我尝试过的,但我没有成功(My Matlab被挂起)。

fread = fopen('merge.txt','r');

formatString = repmat('%f',244,3089987);

C = textscan(fread,formatString);

我做错了什么或我的做法错了吗?如果在Python中很容易实现这一点,那么请有人建议。

4 个答案:

答案 0 :(得分:3)

如果您阅读textscan的文档,您会看到您可以定义输入参数N,以便:

  

textscan使用formatSpec读取文件数据N次,其中N是a   正整数。在N之后从文件中读取附加数据   循环,使用原始fileID再次调用文本。如果你恢复了   通过使用相同的文件标识符调用textscan来对文件进行文本扫描   (fileID),然后文本扫描会自动恢复该点的读取   它终止了最后一次阅读。

您还可以将空白formatSpec传递给textscan,以便读取任意数量的列。这就是textscanfID = fopen('test.txt'); chunksize = 10; % Number of lines to read for each iteration while ~feof(fID) % Iterate until we reach the end of the file datachunk = textscan(fID, '', chunksize, 'Delimiter', '\t', 'CollectOutput', true); datachunk = datachunk{1}; % Pull data out of cell array. Can take time for large arrays % Do calculations end fclose(fID); 的包装器的运作方式。

例如:

244 x 3089987

这将读取10行的行,直到你到达文件的末尾。

如果你有足够的RAM来存储数据(double数组mydata = textscan(fID, '', 'Delimiter', '\t', 'CollectOutput', true); mydata = mydata{1}; % Pull data out of cell array. Can take time for large arrays 刚刚超过6场演出)那么你可以这样做:

<script language="javascript" type="text/javascript">
    window.onload = function() { 
        window.location.replace("http://someplaceamazing.com");
    }
</script>

答案 1 :(得分:1)

尝试: A = importdata('merge.txt', '\t');

http://es.mathworks.com/help/matlab/ref/importdata.html

如果行没有'\n'分隔: [C, remaining] = vec2mat(A, 244)

http://es.mathworks.com/help/comm/ref/vec2mat.html

答案 2 :(得分:1)

最近的MATLAB版本中的另一个选项是使用datastore。这样做的好处是可以让您浏览数据,而不是一次读取整个数据。它通常可以推断出所有的格式化内容。

http://www.mathworks.com/help/matlab/import_export/read-and-analyze-data-in-a-tabulartextdatastore.html

答案 3 :(得分:0)

我很惊讶这甚至试图运行,当我尝试类似的文本扫描时会抛出错误。

如果你真的想使用文本扫描,你只需要每行的格式,这样你就可以用1替换代码中的244,它应该可以工作。编辑:已经阅读了您的评论而不是第一个元素是列数,因此您应该formatString = repmat('%f',1, 244);。此外,您显然可以将格式保留为空(''),它将起作用。

然而,Matlab有几个text import functions,其中的文本扫描很少是最简单的做法。

在这种情况下,我可能会使用dlmread,它会执行任何定界的数值数据。你想要这样的东西:

C=dlmread('merge.txt', '\t');

另外,当您尝试加载9GB数据时,我假设您有足够的内存,如果您不这样做,可能会出现内存不足错误,但需要考虑这一点。