Come leggere file.mat consecutivi

di il
4 risposte

Come leggere file.mat consecutivi

Buongiorno,
il mio problema è questo:
devo leggere dei file .mat ciascuno dei quali contiene una matrice e dopo devo poter lavorare direttamente su queste matrici.
i nomi dei file sono anno_1.mat, anno_2.mat, anno_3.mat etc....
c'è un modo per leggerli con un ciclo e per accedere alle matrici??

grazie mille!!!!

4 Risposte

  • Re: Come leggere file.mat consecutivi

    Per automatizzare la lettura di file che abbiano la radice del nome comune ("anno_" nel caso specifico della domanda) seguito da un indice numerico (possibilmente incrementale, ma, comunque, almeno definibile tramite un algoritmo) è sufficiente codificare un loop che:

    [*] costruisca una stringa contenente il nome del file concatenando la radice del nome del file all'indice del loop (o, all'indice definito dall'algoritmo per la numerazione dei files)
    [*] invochi la funzione built-in "load" fornendo ad essa, in input, da stringa contenente il nome del file, costruita al passo precedente

    come nell'esempio che segue il quale legge i 3 files: "file_da_leggere_1", "file_da_leggere_2", "file_da_leggere_3":
    
    radice_nome_file='file_da_leggere_';
    for i=1:3
       file_name=[radice_nome_file num2str(i)]
       load(file_name)
    end
    
    All'interno dello script dovrebbero essere inseriti dei controlli per verificare, come minimo l'esistenza dei files che si vogliono leggere.

    La stessa tecnica (costruzione del nome del file e suo passaggio a funzioni di MatLab) può essere utilizzata, per esempi per verificare il contenuto di un file ".mat".

    Nello script che segue sono illustrati alcuni esempi.

    *********
    ******* DISCLAIMER **********
    *********
    ATTENZIONE!!! LA PRIMA PARTE DELLO SCRIPT GENERA 5 MATRICI CHE VENGONO SUCCESSIVAMENTE SALVATE IN FILES CON LA RADICE DEL NOME "file_prova_con_matrice_"
    PRIMA DEL SALVATAGGIO SU FILE ".MAT" VIENE VERIFICATO SE IL FILE ESISTA GIA' E, NEL CASO VIENE GENERATO UN ERRORE ED IL SALVATAGGIO NON VIENE EFFETTUATO.

    SI FACCIA COMUNQUE ATTENZIONE NELL'EVENTUALE UTILIZZO DELLO SCRIPT, ALLA DEFINIZIONE DEI NOMI DEI FILES
    *********

    %
    % Creazione di cinque matrici di esempio
    %
    for i=1:5
       eval(['m_' num2str(i) '=magic(3)*i*10;'])
    end
    %
    % Definizione della radice del nome dei files ".mat"
    %
    radice_nome_file='file_prova_con_matrice_';
    %
    % Definizione del numero di files ".mat" da caricare
    %
    numero_files_mat=5;
    %
    % Salvataggio delle cinque matrici nei cinque files
    %    file_prova_con_matrice_1.mat file_con_matrice_2.mat
    %    file_con_matrice_3.mat file_prova_con_matrice_4.mat
    %    file_con_matrice_5.mat
    %
    for i=1:numero_files_mat
       fname=[radice_nome_file num2str(i) '.mat'];
       if(~exist(fname,'file'))
          save(fname,['m_' num2str(i)])
       else
          error(['Il file ' fname ' esiste già'])
       end
    end
    %
    % Cancellazione delle cinque matrici dal workspace (per verificare
    % successivamente l'effettivo loro caricamento
    %
    for i=1:numero_files_mat
       clear(['m_' num2str(i)])
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %
    % Creazione del nome dei files ".mat" da caricare
    %
    file_set=cell(1,numero_files_mat);
    for i=1:numero_files_mat
       file_set{i}=[radice_nome_file num2str(i) '.mat'];
    end
    %
    % Verifica dell'esistenza dei files ".mat"
    %
    for i=1:numero_files_mat
       disp(['Verifica del file: ' file_set{i}])
       if(exist(file_set{i},'file'))
          which(file_set{i})
       else
          disp(['Errore: file "' file_set{i} '" non trovato'])
       end
       disp(' ');
    end
    disp(' ');
    %
    % Verifica del contenuto dei files ".mat": la descrizione del contenuto di
    % ogni file viene memorizzata nella "struct" "file_cont"
    %
    for i=1:numero_files_mat
       if(exist(file_set{i},'file'))
          disp(['Contenuto del file ' file_set{i} ':'])
          file_cont(i)=whos('-file',[radice_nome_file num2str(i) '.mat']);
          str=sprintf('Nome variabile= %s dimensione = (%s)',file_cont(i).name,num2str(file_cont(i).size));
          disp(str)
          disp(' ');
       else
          disp(['Errore: file "' file_set{i} '" non trovato'])
       end
    end
    disp(' ');
    %
    % Caricamento delle matrici dai files ".mat"
    %
    for i=1:numero_files_mat
       if(exist(file_set{i},'file'))
          disp(['Caricamento del file ' radice_nome_file num2str(i) '.mat'])
          load([radice_nome_file num2str(i)])
       else
          disp(['Errore: file "' file_set{i} '" non trovato'])
       end
    end
    disp(' ');
    %
    % Verifica dell'avvenuto corretto caricamento delle matrici
    %
    str_1='Sono state caricate le seguenti matrici:';
    str_2='';
    for i=1:numero_files_mat
       if(exist(file_set{i},'file'))
          res(i)=whos(file_cont(i).name);
          str_2=[str_2 ', ' res(i).name];
       else
          disp(['Errore: file "' file_set{i} '" non trovato'])
       end
    end
    disp([str_1 str_2])
    Hope this helps.
  • Re: Come leggere file.mat consecutivi

    Buongiorno,

    Ho lo stesso problema dell'altro utente, ma i file che devo caricare ed elaborare in modo automatizzato sono di tipo segy (estensione .sgy). Che funzione devo utilizzare al posto di load?

    Grazie a tutti
  • Re: Come leggere file.mat consecutivi

    Buongiorno,
    Io ho un problema simile al precedente con file .mat , però ho circa 300 file e sono salvati con un nome del tipo "Item15_Pr.mat" oppure "Item344Ton_Pr.mat.
    I numeri nei nomi dei file non sono nemmeno sequenziali. Pertanto con il ciclo for analogo al precedente non essendoci corrispondenza tra l'indice ed il nome del file il programma non funziona.
    Come faccio? Mi potete aiutare??

    GRAZIE
  • Re: Come leggere file.mat consecutivi

    Puoi provare ad utilizzare la funzione dir per ottenere l'elenco dei files all'interno della directory all'interno di un structure array.
    Successivamente puoi caricare i files scandendo lo structure array con un ciclo for con la funzione load

Devi accedere o registrarti per scrivere nel forum
4 risposte