Come far leggere gli zeri iniziali di un file a Matlab??

di il
5 risposte

Come far leggere gli zeri iniziali di un file a Matlab??

Salve a tutti!
Ho dei file.nc i quali sono salvati in questo modo :
day_002 day_003 day_004 day_010 day_011 day_012 e cosi via...
Ho creato un ciclo for del tipo :

for k=2:1:9
eval file_name=(['C:\Users\alessio\Desktop\VALIDAZIONE_ROMS\VALIDAZIONE TIRRENO_2001\',radice_nome_file,num2str(k),'.nc']);
ncid = netcdf.open (file_name, 'NETCDF4')

eval ([ 'Tempday' num2str(k) '= netcdf.getVar(ncid,6)']);
end

nel primo comando ho voluto dire di considerare i giorni che vanno dal 2 al 9. Per fare una prova ho cancellato i primi due zeri dei file che vanno dal giorno 2 al giorno 9 affinché Matlab possa leggere i vari file. Ora, invece di rinominare ogni singolo file, cioè cancellando i vari zeri iniziali , come posso farli caricare in automatico? quale comando dovrei scrivere?
Spero che qualcuno mi aiuti e grazie per l'aiuto.

5 Risposte

  • Re: Come far leggere gli zeri iniziali di un file a Matlab??

    E' sufficiente che tu inserisca le istruzioni per la creazione del nome del file all'interno di un blocco "if" nel quale aggiungerai un numero opportuno di "o" a seconda del valore dell'indice del loop.

    Ciò detto, ti consiglio caldamente di non usare le funzione "eval" per la generazione automatica delle variabili

    Nel primo caso, nella generazione dei nomi dei file, semplicemente, non è necessaria.

    Nel secondo caso, genererai una serie di variabili alle quali, in seguito, non saprai come accedere: ci sono diverse strutture dati che pupi usare al posto delle variabili create automaticamente (matrici, cellarray, struct).

    Purtroppo sono già state pubblicate molte domande relative ai problemi causati dall'uso della funzione "eval": questo è uno dei casi emblematici
  • Re: Come far leggere gli zeri iniziali di un file a Matlab??

    Ma per esempio come lo dovrei strutturare questo ciclo if? io l ho imparata ad usare la funzione eval è potentissima come comando..
  • Re: Come far leggere gli zeri iniziali di un file a Matlab??

    La funzione "eval" non è potentissima come può sembrare, ma pericolosissima al punto che anche gli sviluppatori di MatLab ne sconsigliano l'utilizzo:


    https://it.mathworks.com/matlabcentral/answers/16442-why-eval-and-evalin-are-not-recommended
    https://it.mathworks.com/help/matlab/matlab_prog/string-evaluation.html
    https://it.mathworks.com/matlabcentral/answers/325760-does-justifiable-use-of-eval-exist

    Per costruire il nome dei files non hai bisogno di usare "eval".
    In questo esempio, vengono generati 123 nomi di files del tipo:
    
    C:\dir_1\dir_2\input_file_001.txt
    C:\dir_1\dir_2\input_file_002.txt
    ...
    C:\dir_1\dir_2\input_file_010.txt
    C:\dir_1\dir_2\input_file_011.txt
    ...
    C:\dir_1\dir_2\input_file_110.txt
    C:\dir_1\dir_2\input_file_111.txt
    
    
    radice_nome='input_file_'
    path_files='C:\dir_1\dir_2\'
    file_ext='.txt'
    n_files=123
    
    for i=1:n_files
       if(i < 10)
          zero_set='00'
       elseif(i < 99)
          zero_set='0'
       else
          zero_set=''
       end
       input_file=[path_files radice_nome zero_set num2str(i) file_ext]
    end
    
    Per la successiva creazione delle matrici "Tempday1", "Tempday2", ecc. ... vale la risposta all'altra domanda.
  • Re: Come far leggere gli zeri iniziali di un file a Matlab??

    Salve, scusami se ti rispondo soltanto ora ma ho avuto problemi in questi mesi.
    comunque ti ringrazio ancora per l'aiuto. Eventualmente per creare le matrici Tempday2,Tempday3 ecc si può usare anche questo comando cioè il comando "eval" anche se te me l'hai sconsigliata di usare?

    ncid = netcdf.open (input_file, 'NETCDF4');
    eval ([ 'Tempday' num2str(i) '= netcdf.getVar(ncid,6)']);

    il primo comando serve solo per questo tipo di matrici che sto usando ed e necessario in questo caso.
  • Re: Come far leggere gli zeri iniziali di un file a Matlab??

    Non sono solo o a sconsigliarti di usare la funzione "eval":


    https://it.mathworks.com/help/matlab/matlab_prog/string-evaluation.html
    https://it.mathworks.com/matlabcentral/answers/325760-does-justifiable-use-of-eval-exist

    ma non poso certo obbligarti a non usarla.
    Se può esserti di aiuto, dai un'occhiata a questa domanda (ed alla serie di risposte - domande - risposte ...) per farti un'idea delle difficoltà alle quali andrai incontro se userai la funzione "eval":

    Operazioni sugli indici.
    Nelle varie risposte troverai anche delle soluzioni alternative all'uso di "eval" per la creazione delle variabili.

    Non so che tipo di matrici ritorni la funzione "netcdf.getVar(ncid,6)", se cioè, ad ogni iterazione la loro dimensione sia sempre la stessa o possa variare.

    Nel primo caso, se le matrici hanno sempre la stessa dimensione, puoi creare una matrice con una dimensione in più rispetto a quella della matrice letta con "netcdf.getVar".

    Ad esempio:
    
    % Inizializzazione della matrice di output
    m=[];
    % Ciclo for che simula la lettura
    for i=1:2
       % Simulazione della lettura
       k=randi(100,10,10)
       % Assegnazione della matrice letta alla matrice di output
       m(:,:,:,i)=k
    end
    
    In alternativa, puoi creare una struttura:
    
    for k=1:3
       output_str.([ 'Tempday' num2str(k)])=randi(100,10,10,10)
    end
    
    Questa soluzione ha due vantaggi, rispetto alla precedente:
    [*] non devi lavorare con ua matrice con una dimensione in più
    [*] ogni campo della struttura ha il nome della matrice che creeresti con "eval", ma, hai a disposizione una serie di funzioni per accedere ai suoi campi.
    Puoi usare "fieldnames" per avere i nomi dei campi in un cellarray che potrai utilizzare, eventualmente, in un loop
    Puoi usare "getfield" per avere il contenuto di un campo in particolare, il primo, ad esempio,
    
    getfield(output_str,nomi_matrici{1})
    
    Puoi creare un loop per scandire le varie matrici (i vari campi della struttura) e lavorare su di esse:
    
    for k=1:3
       i_esima_matrice=output_str.([ 'Tempday' num2str(k)])
    end
    
Devi accedere o registrarti per scrivere nel forum
5 risposte