我运行生成数百或数千个.mat文件的脚本。每个文件都包含两个变量:resultsU和resultsT。我想附加文件但不覆盖变量。在Matlab中最简单的方法是什么?有些人建议手动操作.mat文件,当你有数百个.mat文件时这不容易或有效。
答案 0 :(得分:1)
实际上比你想象的容易得多。如果要附加到MAT文件,只需使用带有-append
标志的save
即可。假设你有一些变量......我们称之为p
和q
,并假设你有一个名为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上编写的。