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

Posted

技术标签:

【中文标题】加载多个数据集而不覆盖变量【英文标题】:Loading multiple datasets without overwriting variable 【发布时间】:2014-01-27 06:05:55 【问题描述】:

我有一个包含许多文件的文件夹,名为:

filename_1.mat
filename_2.mat
.
.
.
filename_n.mat

每个文件都包含一个名为 Var 的数据集,具有相同的列。我想将所有这些数据集加载到工作区并使用vertcat() 垂直连接它们,但是当我在for循环中加载它们时,我只得到最后一个数据集,因为变量Var 被覆盖。这些数据集是在 for 循环中创建的:

% generate filenames

tss = arrayfun(@(x)sprintf('filename_%d',x),1:(length(1:3)))';
namerr = cell((length(1:3)),1);
namerr(:,1) = 'E:\FILES\';
file_names = strcat(namerr,tss,'.mat');

% create datasets and save them to E:\FILES 

for ii = 1:3
    a = rand(1,5)';
    b = rand(1,5)';
    Var = dataset([a,b],'a_name','b_name');
    save(file_names(ii),'Var','-v6')
end

% Now read these datasets into workspace and concatenate vertically??
% Is there a way for me to name the datasets `Var_1...Var_n`
% so they are not overwritten? 

【问题讨论】:

【参考方案1】:

当然。您可以将数据加载到变量中,然后将文件的内容作为变量中的字段来访问。从你的例子开始,这看起来像这样:

loadedData_1 = load(file_names1)
loadedData_2 = load(file_names2)
loadedData_3 = load(file_names3)

mergedData = [...
    loadedData_1.Var; ...
    loadedData_2.Var; ...        
    loadedData_3.Var   ];

您可以使用循环来清理它:

for ix = 3:-1:1   %Load all data, backwards to force preallocation
    loadedData(ix) = load(file_namesix);
end
mergedData = cat(1,loadedData.Var);

或者,如果您真的想超越顶峰,我认为您可以使用arrayfun 排长队完成,但这可能会超越顶峰。

【讨论】:

【参考方案2】:

直接在循环中执行会容易得多:

...
Varcat = [];
for ii = 1:3
    a = rand(1,5)';
    b = rand(1,5)';
    Var = dataset([a,b],'a_name','b_name');
    Varcat = [Varcat; Var];
    save(file_names(ii),'Var','-v6')
end

Var = Varcat;

如果您真的想在以后或在程序的另一部分执行此操作,希望您清楚如何使用load() 为类似的循环调整相同的方法。

【讨论】:

以上是关于加载多个数据集而不覆盖变量的主要内容,如果未能解决你的问题,请参考以下文章

如何从 hg repo 中删除变更集而不丢失之后提交的变更集

Visual Studio 项目安装程序 - 这些可以只打包程序集而不构建它们吗

完整数据集而不是 Top 1000 EF Core

我如何在 quicksight 中刷新 csv 数据集而不是替换数据集,因为这会丢失我的计算

我应该通过 gRPC 传输大型数据集而无需手动分块吗?

还在为找不到进化计算数据集而发愁吗?