1

我有大量的大型数据文件。我希望能够对每个文件中的数据进行分类,然后将文件名保存到一个元胞数组中,这样最后我将为每个数据类别拥有一个文件名元胞数组,然后我可以保存到一个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可能会返回几个不同类别之一),以防万一崩溃或不可预见的错误,我想即时保存数据,而不是在内存中填充单元阵列并在最后转储到磁盘。

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

4

2 回答 2

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. 我从来没有遇到过它的问题,而且它并没有明显慢到足以让我放弃使用它。我知道我的答案只是一种解决方法,而不是真正的解决方案,但我希望它有所帮助。

于 2013-08-02T23:05:29.267 回答
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);

之后处理无聊/有趣的文本文件应该是微不足道的。如果您还要在开始循环之前将目录列表写入一个单独的文件,那么在发生崩溃时确定从哪里继续应该很容易(手动或自动)。

于 2013-08-02T23:09:07.583 回答