Salvataggio di più dato di una variabile su una cella

di il
8 risposte

Salvataggio di più dato di una variabile su una cella

Salve a tutti mi presento sono Gabriele e sono uno studente di ing. elettronica. Volevo chiedervi un aiuto relativo all'utilizzo di matlab.
Sto eseguendo uno script in cui viene richiamata una funzione che fa determinate operazione per poi andarmi a calcolare una determinata variabile H. I dati relativi a quest'ultima variabile vengono conservati in una cella Hvf. Questa operazione viene ripetuta un certo numero n di volte, quindi ogni n volte lui salva i dati nella cella in teoria.
In pratica mi salva solo i dati relativi all'ultimo ciclo , mentre quelli relativi ai cicli precedenti vengono visti come zero come mai?
Vi allego lo script:
misure='mhz';
files='frequenza';
freq={'30' '40' '50' };

for i=1:(size(freq,2)); %ciclo atto a scorrere tutte le acquisizioni fatte nella condizione scelta
load(cat(2,files,freq{i},misure));
data=eval(cat(2,files,freq{i},misure));
p=data;
Hvf=[];
Hv=[];
Imax=5;
N=127;

for v=1:length(p(:,1))
I(v)=p(v,8);
Th(v)=p(v,3); %Valore della temperatura del lato caldo (sensor8)
Tc(v)=p(v,2); %Valore della temperatura del lato freddo (sensor2)
%calculation parameters
[SM,RM,KM]=Parametri(Imax,N,Tc(v),Th(v));
SMrec(v)=SM;
RMrec(v)=RM;
KMrec(v)=KM;
%calculation heat flux
Hv(v,1)=SM*I(v)*Th(v)+0.5*RM*I(v)^2-KM*(Th(v)-Tc(v)); %calcolo di Qh pag 15
end
Hvf{i}=Hv;
end
Grazie a tutti per le risposte

8 Risposte

  • Re: Salvataggio di più dato di una variabile su una cella

    Il motivo per il quale il cellarray Hvf contiene solo i valori del vettore Hv calcolati nell'ultima iterazione del del ciclo più interno è dovuto al fatto che il cellarray stesso viene "resettato" ad ogni iterazione del ciclo esterno con l'istruzione:
       Hvf=[];
    Questo fa sì che, considerando ad esempio la terza iterazione (i=3) il vettore Hv venga inserito nella terza locazione del cellarray Hvf mentre le locazioni precedenti (da 1 a "i-1") rimangano vuote.
       Hvf{i}=Hv;
    Per risolvere il problema è sufficiente spostare l'istruzione
       Hvf=[];
    fuori (e "prima") del ciclo "for" esterno, come nella porzione di codice che segue:
    misure='mhz';
    files='frequenza';
    freq={'30' '40' '50' };
    
    Hvf=[]
    
    for i=1:(size(freq,2)); %ciclo atto a scorrere tutte le acquisizioni fatte nella condizione scelta
       load(cat(2,files,freq{i},misure));
       data=eval(cat(2,files,freq{i},misure));
       p=data;
    %   Hvf=[]
       Hv=[];
       Imax=5;
       N=127;
       
       for v=1:length(p(:,1))
          I(v)=p(v,8);
          ...
    
    
    Hope this helps.
  • Re: Salvataggio di più dato di una variabile su una cella

    Grazie mille per l'aiuto. Adesso però ho un ulteriore problema se voglio calcolare il valore massimo dei dati contenuti nella cella come faccio per selezionare ogni singola colonna. io avevo pensato di fare così:
    for i=1:16
    modulosensore=max(diunvalorecheinteressa)-max(Hvf(i))
    però perchè se lo scrivo così matlab mi da errore?
  • Re: Salvataggio di più dato di una variabile su una cella

    Cosa intendi con:
    calcolare il valore massimo dei dati contenuti nella cella
    Al termine dell'esecuzione, il cellarray Hvf dovrebbe contenere un certo numero di vettori; vuoi calcolare il valore massimo di ognuno dei vettori?

    Se è così, puoi provare ad usare la funzione "cellfun" (fai riferimento all'help di MatLab per i dettagli sull'utilizzo della funzione).

    L'istruzione:
    cellfun(@max,Hvf)
    ritorna un vettore con i valori massimi dei vettori memorizzati all'interno del callarray Hvf.

    Se, invece, vuoi calcolare "il massimo dei massimi" puoi utilizzare l'istruzioine:
    max(cellfun(@max,Hvf))
    Hope this helps.
  • Re: Salvataggio di più dato di una variabile su una cella

    Si ask_raf vorrei calcolare il valore massimo di ogni singolo vettore della cella.Per il valore minimo e la stessa istruzione però utilizzando @min giusto?
  • Re: Salvataggio di più dato di una variabile su una cella

    Giusto
  • Re: Salvataggio di più dato di una variabile su una cella

    Utilizzando però questa istruzione conserva solo il max relativo all'ultima colonna di hvf, io invece vorrei conservarli tutti. Devo creare sempre una cella?
    Vorrei anche fare il rapporto (tra il max della 4 colonna del vettore p meno il max del 1 vettore della cella Hvf calcolato come detto prima) e il minimo della 4 colonna del vettore p meno il min del 1 vettore della cella Hvf.
    la sintassi dovrebbe essere la seguente
    modulosensore1=(max(p(:,4))-(A(:,i)))\(max(p(:,4))-(B(:,i)));
  • Re: Salvataggio di più dato di una variabile su una cella

    Mi sembra strano che, come scrivi nella domanda:
    Utilizzando però questa istruzione conserva solo il max relativo all'ultima colonna di hvf, io invece vorrei conservarli tutti
    Hai inserito la chiamata alla funzione "cellfun" al fondo dello script, dopo, cioè, i due cicli "for"?

    Dato in input un cellarray Hvf con dimensione (1,3), le istruzioni:
    max_Hvf=cellfun(@max,Hvf)
    max_Hvf=cellfun(@min,Hvf)
    ritornano, in due vettori, rispettivamente, il massimo ed il minimo di ogni elemento del cellarray:
    
    Hvf{1}=randi(1000,10,1);
    Hvf{2}=randi(1000,10,1);
    Hvf{3}=randi(1000,10,1);
    % 
    % Calcolo del valore massimo di ogni elemento del cellarray "Hvf"
    % 
    Hvf{1}
    Hvf{2}
    Hvf{3}
    max_Hvf=cellfun(@max,Hvf)
    min_Hvf=cellfun(@min,Hvf)
    Output:
    ans =
    
       275
       242
       244
       155
       957
       936
       819
       729
       176
       361
    
    
    ans =
    
       189
         2
       317
       700
       626
       544
       440
       288
       502
       762
    
    
    ans =
    
       763
       577
       748
       646
       124
       505
       348
        93
       148
       199
    
    
    max_Hvf =
    
       957   762   763
    
    
    min_Hvf =
    
       155     2    93
    Per quanto riguarda la seconda parte della domanda, il calcolo del rapporto, nell'istruzione che hai inserito ci sono diversi errori:
    modulosensore1=(max(p(:,4))-(A(:,i)))\(max(p(:,4))-(B(:,i)));
    1) hai usto l'operatore "\" al posto dell'operatore "/" per la divisione
    2) nella domanda scrivi di voler calcolare: rapporto (tra il max della 4 colonna del vettore p meno il max del 1 vettore della cella Hvf calcolato come detto prima) e il minimo della 4 colonna del vettore p meno il min del 1 vettore della cella Hvf

    nell'istruzione che hai scritto, invece, al numeratore calcoli la differenza tra il massimo della quarta colonna della matrice "p" ed (tutti) i valori della "i-esima colonna" della matrice "A" invece del max della 4 colonna del vettore p meno il max del 1 vettore della cella Hvf .

    al denominatore, oltre a calcolare il massimo invece del minimo, ripeti l'errore commesso ... al numeratore

    3) non è chiaro cosa siano "A" e "B" e cosa rappresenti "i" visto che, nella domanda, citi esplicitamente i numeri delle colonne che ti interessano.

    Il calcolo del rapporto dovrebbe essere fatto al termine del doppio loop.

    Non avendo a disposizione i dati di input del tuo specifico, non è possibile eseguire il tuo script.
    Tuttavia, esaminando lo script si può dedurre che il cellarray Hvf avrà una riga e tre colonne.

    Il numero delle righe di ogni elemento sarà uguale al numero delle righe della matrice "p": questo valore non è stimabile.
    Supponendo che sia, ad esempio, 10, ogni elemento del cellarray Hvf avrà, di conseguenza, 10 righe.

    Nello script che segue:
    [*] vengono creati, a titolo di esempio, la matrice "p" ed il cellarray "Hvf"
    [*] la funzione "cellfun" viene utilizzata per calcolare il massimo ed il minimo di ogni elemento del cellarray "Hvf"
    [*] viene calcolato il rapporto specificato nella domanda

    
    % 
    % Generazione matrice "p" di esempio
    % 
    p=randi(300,10,4)
    % 
    % Generazione del cellarray "Hvf"
    % 
    Hvf{1}=randi(1000,10,1);
    Hvf{2}=randi(1000,10,1);
    Hvf{3}=randi(1000,10,1);
    % 
    % Calcolo del valore massimo di ogni elemento del cellarray "Hvf"
    % 
    max_Hvf=cellfun(@max,Hvf)
    % 
    % Calcolo del valore minimo di ogni elemento del cellarray "Hvf"
    % 
    min_Hvf=cellfun(@min,Hvf)
    % 
    % Calcolo del valore massimo della quarta colonna della matrice "p"
    % 
    max_p=max(p(:,4))
    % 
    % Calcolo del valore miniomo della quarta colonna della matrice "p"
    % 
    min_p=min(p(:,4))
    % 
    % Calcolo del rapporto
    % 
    rap=(max_p-max_Hvf(1))/(min_p-min_Hvf(1))
    
    Hope this helps.
  • Re: Salvataggio di più dato di una variabile su una cella

    Grazie mille per la risposta sei stato veramente gentile, avrei solo qualche appunto da farti per quanto riguarda il rapporto.
    Io in max_Hvf e min_Hvf ho 17 valori adesso vorrei che il rapporto fosse calcolato sostituendo di volta in volta questi valori nella formula in maniera tale da avere 17 rapporti. Non dovrebbe essere fatto attraverso l'utilizzo di un ciclo for?
    E dove dovrebbe essere inserito?
Devi accedere o registrarti per scrivere nel forum
8 risposte