加载多个数据集而不覆盖变量
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 项目安装程序 - 这些可以只打包程序集而不构建它们吗