我正在尝试将几个 .mat 文件加载到工作区。但是,它们似乎相互覆盖。相反,我希望它们附加。我知道我可以做类似的事情:
S=load(file1)
R=load(file2)
等等
然后手动附加变量。
但是有很多变量,并且为每个变量添加一个附加语句是非常不可取的(尽管可能作为最后的手段)。有什么方法可以让我将 .mat 文件加载到工作区(通过使用load()
没有分配的命令)并附加它们?
我正在尝试将几个 .mat 文件加载到工作区。但是,它们似乎相互覆盖。相反,我希望它们附加。我知道我可以做类似的事情:
S=load(file1)
R=load(file2)
等等
然后手动附加变量。
但是有很多变量,并且为每个变量添加一个附加语句是非常不可取的(尽管可能作为最后的手段)。有什么方法可以让我将 .mat 文件加载到工作区(通过使用load()
没有分配的命令)并附加它们?
听起来您遇到的情况是,每个文件都包含一个矩阵变量 A 并且您希望将所有这些矩阵沿某个维度的串联加载到内存中。我有类似的需求,并编写了以下函数来处理它。
function var = loadCat( dim, files, varname )
%LOADCAT Concatenate variables of same name appearing in multiple MAT files
%
% where dim is dimension to concatenate along,
% files is a cell array of file names, and
% varname is a string containing the name of the desired variable
if( isempty( files ) )
var = [];
return;
end
var = load( files{1}, varname );
var = var.(varname);
for f = 2:numel(files),
newvar = load( files{f}, varname );
if( isfield( newvar, varname ) )
var = cat( dim, var, newvar.(varname) );
else
warning( 'loadCat:missingvar', [ 'File ' files{f} ' does not contain variable ' varname ] );
end
end
end
它并不完全清楚您所说的“附加”是什么意思,但这是一种将数据加载到应该易于处理的格式的方法:
file_list = {'file1';'file2';...};
for file = file_list'
loaded.(char(file)) = load(file);
end
这利用动态字段引用将列表中每个文件的内容加载到loaded
结构的自己的字段中。您可以从这里迭代字段并根据需要操作数据。
克拉克的答案和功能实际上完美地解决了我的情况......我只是添加了以下代码以使其不那么乏味。只需将其添加到开头并摆脱“文件”参数:
[files,pathname] = uigetfile('*.mat', 'Select MAT files (use CTRL/COMM or SHIFT)', ...
'MultiSelect', 'on');
或者,从这一点开始可能会更有效:
[pathname] = uigetdir('C:\');
files = dir( fullfile(pathname,'*.mat') ); %# list all *.mat files
files = {files.name}'; %# file names
data = cell(numel(files),1); %# store file contents
for i=1:numel(files)
fname = fullfile(pathname,files{i}); %# full path to file
data{i} = load(fname); %# load file
end
(从处理 matlab 中具有特定扩展名的文件列表修改)。
谢谢,杰森