如何附加多个具有相同变量名的 .mat 文件?
Posted
技术标签:
【中文标题】如何附加多个具有相同变量名的 .mat 文件?【英文标题】:How to append multiple .mat files that have the same variable names in them? 【发布时间】:2015-06-23 15:26:36 【问题描述】:我运行生成数百或数千个 .mat 文件的脚本。每个文件都包含两个变量:resultsU 和 resultsT。我想追加文件但不覆盖变量。在 Matlab 中最简单的方法是什么?有些人建议手动操作 .mat 文件,当您拥有数百个 .mat 文件时,这样做并不容易或高效。
【问题讨论】:
假设您有三个这样的文件。您想最终得到一个带有...六个变量的新 .mat 文件?怎么命名的?或者也许是一个有两个字段的三号结构?还是……? This may helps. 【参考方案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,fList1));
%// 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,fListind1));
end
%% Cleanup - changing the current directory back:
cd(oldFolder);
它的作用是合并包含相同变量名的.mat
文件。现在您可以运行combined_results = CombineMat(folder_with_mat_files)
并获得包含所有不同结果的struct
(假设您有足够的内存来保存它们)。在内存中拥有此 struct
后,您可以将其保存到单个 .mat
文件中。
注意 1:如果您没有足够的内存来加载所有文件,您可以向CombineMat
添加另一段代码,将combined_results
转储到磁盘并在一定数量的循环迭代后将其清除(可能使用 rayryengstrong> 建议的'-append'
选项。如果OOM 发生,这对我个人来说没有意义,因为那样你在加载结果文件时会遇到问题:)
注意 2:显然,如果您希望结果不是 structs
的数组,则需要相应地修改代码。
在更一般的情况下,当您尝试连接具有不同变量名的结构时,您可以使用following FEX submission(我可以根据个人经验推荐!)。
P.S.我的代码是在 MATLAB 2015a 上编写的。
【讨论】:
resultsU 和 resultsT 是我使用的唯一变量名。但是对于文件的每次运行,我都有一个不同的 .mat 文件。说,我的文件名是 dosomething(a,b,c).m 。我用不同的 a、b、c 运行 dosomething 1000 次。输出始终存储在 resultsU 和 resultsT 中的唯一 .mat 文件中 不应该将combined_results(ind1) = load(fullfile(newFolder,fList1));
改为combined_results(ind1) = load(fullfile(newFolder,fListind1));
吗?【参考方案2】:
这实际上比您想象的要容易得多。如果要附加到 MAT 文件,只需使用 save
和 -append
标志。假设你有几个变量......我们称它们为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
...
for save
中的内容是您要附加到每个文件的变量。
【讨论】:
但这不会覆盖同名变量吗? @LuisMendo - 是的! OP对此并不十分清楚。我假设要附加的变量是唯一的。这句话对我来说有点不清楚:“我想追加文件但不覆盖变量”... Luis 你会如何解释它?对我来说,这听起来像是 OP 想要在文件中添加更多变量,但保持每个 MAT 文件中的其他变量不变......我实际上不确定! "每个文件都包含两个变量:resultsU 和 resultsT。我想追加文件但不覆盖变量":所以我假设它们是同名变量 那么他们是否想向resultsU
和resultsT
添加更多数据? :S? #mentalist
哈哈哈。我的猜测是:更改变量名称。但最简单的方法是使用具有两个字段的结构。然后您可以使用s = load('filename')
将这些变量作为字段获取,然后构建一个大小等于文件数的非标量struct
以上是关于如何附加多个具有相同变量名的 .mat 文件?的主要内容,如果未能解决你的问题,请参考以下文章
使用 scipy.io.loadmat 从 .mat Matlab 文件中将字典键转换为 Python 中具有相同值的变量名