如何附加多个.mat文件,其中包含相同的变量名称?

时间:2015-06-23 15:26:36

标签: matlab variables save load mat

我运行生成数百或数千个.mat文件的脚本。每个文件都包含两个变量:resultsU和resultsT。我想附加文件但不覆盖变量。在Matlab中最简单的方法是什么?有些人建议手动操作.mat文件,当你有数百个.mat文件时这不容易或有效。

2 个答案:

答案 0 :(得分:1)

实际上比你想象的容易得多。如果要附加到MAT文件,只需使用带有-append标志的save即可。假设你有一些变量......我们称之为pq,并假设你有一个名为test.mat的文件,它非常简单:

save('test.mat','p','q','-append');

这样做的好处是你不需要加载MAT文件中的任何变量,并使用附加的变量重新保存它们。这会将所需的变量附加到MAT文件中,而无需将它们加载到MATLAB中。

如果目录中有一堆.mat个文件,您可以执行以下操作:

folder = '...'; %// Place directory here
f = dir(folder); %// Find files

%// For each file...
for idx = 1 : numel(f)
    name = fullfile(folder, f(idx).name); %// Get path to file

    %// Do some processing
    %//...
    %//

    %// Append to file
    save(name, ..., ..., ..., ..., '-append');
end

... save内的内容是您想要附加到每个文件的变量。

答案 1 :(得分:1)

如果运行创建文件的代码是一个选项,

rayryeng's answer是好的。但是,如果使用大量文件是您需要处理的特定事实,我建议使用structs(类似于struct concatenation)的数组。

考虑以下示例函数:

function combined_results = CombineMat(newFolder)

oldFolder = cd; %// Backup the current directory
cd(newFolder);  %// Switch to some new folder
fList = dir('*.mat'); fList = {fList.name}'; %'// Get the file list

%% // Processing the list of files:
if isempty(fList), combined_results = []; return, end %// Check that some files exist

%// Initialize the result struct by loading the last file (also preallocates the struct):
nFiles = size(fList,1);
combined_results(nFiles) = load(fullfile(newFolder,fList{1}));

%// See if there is only 1 file, and return if so:
if nFiles == 1, return, end

%// Process any additional files 
for ind1 = 1:nFiles-1
    combined_results(ind1) = load(fullfile(newFolder,fList{ind1}));
end

%% Cleanup - changing the current directory back:
cd(oldFolder);

它的作用是组合包含相同变量名的.mat个文件。现在,您可以运行combined_results = CombineMat(folder_with_mat_files)并获得包含所有不同结果的struct(假设您有足够的内存来容纳它们)。在内存中有struct之后,您可以将其保存到单个.mat文件中。

注意1:如果您没有足够的内存来加载所有文件,您可以向CombineMat添加另一段代码,将combined_results转储到磁盘并在一定数量的磁盘后清除它循环迭代(可能使用 rayryeng 建议的'-append'选项。如果发生OOM,这对我个人没有意义,因为那样加载结果会有问题档案:))

注意2:显然,如果您希望结果不是structs数组,则需要相应地修改代码。

在更一般的情况下,当您尝试使用不同的变量名称连接结构时,可以使用following FEX submission(我可以从个人经验中推荐!)。

P.S。我的代码是在MATLAB 2015a上编写的。