索引matfile命令限制的解决方法

时间:2013-08-02 22:05:34

标签: matlab

我有大量的大数据文件。我希望能够对每个文件中的数据进行分类,然后将文件名保存到单元格数组中,这样最后我将为每个数据类别提供一个文件名单元格数组,然后我可以将其保存到一个mat文件,以便我可以稍后返回并对每个类别运行分析。它可能看起来像这样:

MatObj = matfile('listOfCategorizedFilenames.mat');
MatObj.boring = {};
MatObj.interesting = {};

files = dir(directory);
K = numel(files);

for k=1:K
    load(files(k).name,'data')
    metric = testfunction(data)

    if metric < threshold
        MatObj.boring{end+1} = files(k).name;
    else
        MatObj.interesting{end+1} = files(k).name;
    end
end

由于文件列表很长,testfunction可能很慢,我想将其设置为在一夜之间或周末无人值守运行(这是一个精简版本,metric可能会返回几个不同的类别中的一个),并且在崩溃或无法预料的错误的情况下,我想动态保存数据,而不是在内存中填充单元格数组并在最后转储到磁盘。

问题是使用matfile将不允许单元格索引,因此保存步骤会引发错误。我的问题是,这种限制是否有解决方法?有没有更好的方法将文件名逐步写入一个易于以后检索的列表?

2 个答案:

答案 0 :(得分:1)

Mat文件可能是存储文件列表的最有效方法,但我想每当我遇到这个问题时,我会创建一个单元格数组并使用xlswritefprintf将其保存到我稍后可以重新加载的文档。

你说保存步骤会抛出一个错误,所以我假设这部分没问题,对吗?

for k=1:K
    load(files(k).name,'data')
    metric = testfunction(data)

    if metric < threshold
        MatObj.boring{end+1} = files(k).name;
    else
        MatObj.interesting{end+1} = files(k).name;
    end
end

就个人而言,我刚才写道,

xlswrite('name.xls', MatObj.interesting, 1, 'A1');
[~, ~, list] = xlsread('name.xls'); % later on

或者如果您更喜欢文字,

% I'm assuming here that it's just a single list of text strings.
fid = fopen('name.txt', 'w');
for row=1:nrows
    fprintf(fid, '%s\n', MatObj.interesting{row});
end
fclose(fid);

然后用fscanf打开。我只使用xlswrite。我从来没有遇到任何问题,而且它的速度不足以让我不喜欢使用它。我知道我的答案只是一种解决方法而不是真正的解决方案,但我希望它有所帮助。

答案 1 :(得分:1)

我没有matfile的经验,所以我无法帮助你。作为一个快速而肮脏的解决方案,我只想将文件名写入两个不同的文本文件。快速测试表明数据会立即刷新到磁盘,即使您关闭了matlab而没有执行fclose(模拟崩溃),文本文件也可以正常运行。未经测试的代码:

files = dir(directory);
K = numel(files);

boring = fopen('boring.txt', 'w');
interesting = fopen('interesting.txt', 'w');

for k=1:K
    load(files(k).name,'data')
    metric = testfunction(data)

    if metric < threshold
        fprintf(boring, '%s\n', files(k).name);
    else
        fprintf(interesting, '%s\n', files(k).name);
    end
end

%be nice and close files
fclose(boring);
fclose(interesting);

之后处理枯燥/有趣的文本文件应该是微不足道的。如果您还要在开始循环之前将目录列表写入单独的文件,那么在发生崩溃时应该非常容易(手动或自动)找出继续的位置。