我試圖將幾個.mat文件加載到工作空間。但是,他們似乎相互覆蓋。相反,我希望他們追加。我知道我可以這樣做:將多個.mat文件加載到Matlab工作空間
S=load(file1)
R=load(file2)
等
,然後手動添加的變量。
但是有很多變量,並且爲每個變量添加附加語句都是非常不可取的(儘管可能作爲最後的手段)。有沒有辦法讓我加載.mat文件到工作區(通過使用load()
命令而不分配)並讓它們追加?
我試圖將幾個.mat文件加載到工作空間。但是,他們似乎相互覆蓋。相反,我希望他們追加。我知道我可以這樣做:將多個.mat文件加載到Matlab工作空間
S=load(file1)
R=load(file2)
等
,然後手動添加的變量。
但是有很多變量,並且爲每個變量添加附加語句都是非常不可取的(儘管可能作爲最後的手段)。有沒有辦法讓我加載.mat文件到工作區(通過使用load()
命令而不分配)並讓它們追加?
它不是完全清楚你的意思是「追加」但這裏有一種方式來獲得裝入格式的數據,應該是容易對付:
file_list = {'file1';'file2';...};
for file = file_list'
loaded.(char(file)) = load(file);
end
這使得使用動態字段引用來將列表中每個文件的內容加載到loaded
結構的其自己的字段中。你可以在這裏遍歷字段並操作數據。
聽起來好像你有一種情況,其中每個文件都包含一個矩陣變量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
克拉克的答案和函數實際上完美地解決了我的情況......我只是添加了下面的代碼,使它有點乏味。只需將其添加到開始,擺脫了「文件」的說法:
[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
(從process a list of files with a specific extension name in matlab修改) 。
感謝, 傑森
通過「他們似乎彼此覆蓋」你的意思是相同的變量名在那些.MAT文件?如果是這種情況,除了逐個加載文件,然後重命名在兩個文件上共享的變量並加載下一個文件之外,沒有什麼可以完成的。 – TJ1 2012-07-16 07:04:46
是的,這就是我的意思。那很糟糕。但是,謝謝 – CHP 2012-07-16 07:51:10