如何附加多个具有相同变量名的 .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 转储到磁盘并在一定数量的循环迭代后将其清除(可能使用 rayryeng​​strong> 建议的'-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 标志。假设你有几个变量......我们称它们为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

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

【讨论】:

但这不会覆盖同名变量吗? @LuisMendo - 是的! OP对此并不十分清楚。我假设要附加的变量是唯一的。这句话对我来说有点不清楚:“我想追加文件但不覆盖变量”... Luis 你会如何解释它?对我来说,这听起来像是 OP 想要在文件中添加更多变量,但保持每个 MAT 文件中的其他变量不变......我实际上不确定! "每个文件都包含两个变量:resultsU 和 resultsT。我想追加文件但不覆盖变量":所以我假设它们是同名变量 那么他们是否想向resultsUresultsT 添加更多数据? :S? #mentalist 哈哈哈。我的猜测是:更改变量名称。但最简单的方法是使用具有两个字段的结构。然后您可以使用s = load('filename') 将这些变量作为字段获取,然后构建一个大小等于文件数的非标量struct

以上是关于如何附加多个具有相同变量名的 .mat 文件?的主要内容,如果未能解决你的问题,请参考以下文章

matlab 存储mat文件

使用 scipy.io.loadmat 从 .mat Matlab 文件中将字典键转换为 Python 中具有相同值的变量名

加载多个数据集而不覆盖变量

获取具有两个变量和多个行名的 p 值

将多个CSV文件导入具有相同名称的变量

如何声明多个具有相同值的变量