2012-07-16 7 views
2

J'essaie de charger plusieurs fichiers .mat dans l'espace de travail. Cependant, ils semblent se remplacer les uns les autres. Au lieu de cela, je veux qu'ils ajoutent. Je sais que je peux faire quelque chose comme:Charger plusieurs fichiers .mat dans l'espace de travail Matlab

S=load(file1) 
R=load(file2) 

etc.

puis ajoutez les variables manuellement.

Mais il y a une tonne de variables, et faire une instruction append pour chacune est extrêmement indésirable (bien que possible en dernier recours). Est-il possible de charger des fichiers .mat dans l'espace de travail (en utilisant la commande load() sans affectation) et de les ajouter?

+0

Par « ils semblent écraser les uns des autres » voulez-vous dire, il y a le même nom de variable dans les fichiers .mat? Si tel est le cas, rien ne peut être fait, sauf que vous chargez les fichiers un par un, puis renommez la variable partagée sur les deux fichiers, puis chargez le fichier suivant. – TJ1

+0

Oui, c'est ce que je veux dire. Eh bien, ça craint. Mais merci – CHP

Répondre

2

Son pas tout à fait clair ce que vous entendez par « ajouter » mais voici un moyen d'obtenir les données chargées dans un format qui devrait être facile à traiter:

file_list = {'file1';'file2';...}; 
for file = file_list' 
    loaded.(char(file)) = load(file); 
end 

Cela utilise des références de terrain dynamique charger le contenu de chaque fichier dans la liste dans son propre champ de la structure loaded. Vous pouvez parcourir les champs et manipuler les données comme vous le souhaitez.

+0

Ce n'est pas tout à fait la réponse que je voulais, mais probablement la meilleure chose suivante, étant donné que ce que je veux ne peut pas être fait. Je vais aller de l'avant et l'accepter. – CHP

+0

Une fois que tout a été chargé, vous pouvez utiliser 'fieldnames' pour comprendre toutes les différentes variables que vous avez chargées dans la structure. Vous pouvez alors «évaluer» pour les obtenir dans l'espace de travail (au lieu de simplement dans la structure), «ajouter» (quelle que soit la façon dont vous le définissez) si nécessaire. – tmpearce

2

Il semble que vous ayez une situation dans laquelle chaque fichier contient une variable matricielle A et que vous voulez charger en mémoire la concaténation de toutes ces matrices le long d'une dimension. J'avais un besoin similaire et j'ai écrit la fonction suivante pour la gérer.

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 
0

réponse de Clark et la fonction fait résoudre ma situation parfaitement ... Je viens d'ajouter le bit suivant du code pour le rendre un peu moins pénible. Il suffit d'ajouter ceci au début et à se débarrasser des « fichiers » argument:

[files,pathname] = uigetfile('*.mat', 'Select MAT files (use CTRL/COMM or SHIFT)', ... 
    'MultiSelect', 'on'); 

Sinon, il pourrait être encore plus efficace de commencer juste avec ce bit:

[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 

(modifié à partir process a list of files with a specific extension name in matlab) .

Merci, Jason

Questions connexes