Problema con uno struct

di il
23 risposte

23 Risposte - Pagina 2

  • Re: Problema con uno struct

    Ask rafa grazie mille per la risoluzione del problema, alla fine senza leggere ciò che avevi scritto tu ho utilizzato la seconda ovvero di cercare il max direttamente nel vettore Hv.
    Per quanto riguarda la parte relativa ai vari fasesens io li ho definiti come vettori xk mi serve che vengano conservati i valori trovati di volta ma xk se sono stati definiti come vettori non accade ciò. Come si potrebbe risolvere?
  • Re: Problema con uno struct

    All'inizio dello script hai definito le variabili come vettori:
    fasesens1=zeros(1,16);
    fasesens2=zeros(1,16);
    fasesens3=zeros(1,16);
    fasesens4=zeros(1,16);
    Però, quando le utilizzi per memorizzare i valori calcolati
       fasesens1=((Ti_max-To_maxs1)/(1/frequenza(i)));
       fasesens2=((Ti_max-To_maxs2)/(1/frequenza(i)));
       fasesens3=((Ti_max-To_maxs3)/(1/frequenza(i)));
       fasesens4=((Ti_max-To_maxs4)/(1/frequenza(i)));
    
    le utilizzi come se fossero variabili scalari (variabili semplici); MatLab adatta automaticamente il tipo tipo di variabile (struttura dati).

    Dal momento che stai operando all'interno di un loop, avendo dichiarato le variabili "fasesens1", "fasesens2", "fasesens3" e "fasesens4" devi opportunamente "indicizzarle" (analogamente a come hai fatto, nelle istruzioni precedenti, con i vettori "modulosensore1", "modulosensore2", "modulosensore3" e "modulosensore4":
       fasesens1(i)=((Ti_max-To_maxs1)/(1/frequenza(i)));
       fasesens2(i)=((Ti_max-To_maxs2)/(1/frequenza(i)));
       fasesens3(i)=((Ti_max-To_maxs3)/(1/frequenza(i)));
       fasesens4(i)=((Ti_max-To_maxs4)/(1/frequenza(i)));
    
    Hope this helps.
  • Re: Problema con uno struct

    Grazie mille ask_raf se ho ancora bisogno ti faccio sapere
  • Re: Problema con uno struct

    Vorrei sapere come si fa a fare il plot in scala logaritmica. Nel mio caso si tratta di andare a fare questo tipo di plot per il modulo e per la fase.
    Grazie anticipatamente per la risposta
  • Re: Problema con uno struct

    Per plottare una serie di dati in scala logaritmica, puoi usare la funzione

    semilogy
    >> help semilogy
    semilogy Semi-log scale plot.
    semilogy(...) is the same as PLOT(...), except a
    logarithmic (base 10) scale is used for the Y-axis.

    See also plot, semilogx, loglog.
    In alternativa puoi usare la funzione plot e, poi settare come logaritmica la scala dell'asse y

    set(gca,'yscale','log')

    Esistono anche le funzioni:

    semilogx e loglog
    >> help semilogx
    semilogx Semi-log scale plot.
    semilogx(...) is the same as PLOT(...), except a
    logarithmic (base 10) scale is used for the X-axis.

    See also plot, semilogy, loglog.


    >> help loglog
    loglog Log-log scale plot.
    loglog(...) is the same as PLOT(...), except logarithmic
    scales are used for both the X- and Y- axes.

    See also plot, semilogx, semilogy.
    Guardando il tuo codice (se nel frattempo non lo hai cambiato), i vettori "modulosensore1", "modulosensore2", "modulosensore3" e "modulosensore4" sono già stati calcolati come "logaritmi", in questo caso non credo ti serva una scala logaritmica per l'asse "y" (non sarebbe "il logaritmo del logaritmo?).

    Facendo girare il tuo programma (sempre, di nuovo, se nel frattempo non lo hai cambiato) i valori dei vettori" modulosensore1", "modulosensore2", "modulosensore3" e "modulosensore4" sono complessi.

    Per esempio, i valori di "modulosensore1" che ottengo sono:
    
    0,00000000000000 + 0,00000000000000i	40,0517539457550 + 27,2875270768368i	60,9017779869524 + 47,1015797949410i	56,9591056200834 + 44,0658432053875i	52,9948600681975 + 40,9663568628089i	49,4513355202061 + 38,2238850860235i	47,7153087125755 + 36,8891241516540i	47,3059692001798 + 36,5641936222978i	46,6977937687073 + 36,0935661866756i	46,6377870327058 + 36,0288536010555i	46,2226105887095 + 35,7165389014790i	59,4831329321523 + 45,9397915209873i	52,3989898110302 + 40,4788483524899i	50,0061021375097 + 38,6354573546357i	48,1806850931566 + 37,2213372642503i	47,4399058812249 + 36,6588322643192i
    
    (il primo è 0.0 perchè non ho caricato il primo file, quello dal 4,5 MB)
    Non conosco l'algoritmo che hai implementato, ma, mi chiedo, sono giusti?

    Hope this helps.
  • Re: Problema con uno struct

    Bisogna mettere delle parentesi dopo 20*log 10 che si apre e chiude alla fine.
  • Re: Problema con uno struct

    Sì i valori che ho ottenuto sono numeri complessi, la I identifica la parte immaginaria.

    Come ho scritto, forse hai modificato il codice, nel frattempo.

    Tu ottieni valori "reali" (senza parte immaginaria)?

    Ho eseguito i codice partendo dal secondo file di input "frequenza07mhz.mat" (il primo è quello da 4.5 MB, che richiede troppo tempo) facendo partire l'indice del loop da "2"
    for i=2:(size(freq,2))
    Con il debug sono arrivato all'istruzione
    modulosensore1(i)=20*log10(max(p(:,4))-max_Hvf)/(min(p(:,4))-min_Hvf);
    ed ottengo:
    max(p(:,4)) = 0.6578
    max_Hvf = 58.6534
    log10(max(p(:,4))-max_Hvf)= 1.7634 + 1.3644i
    essendo
    max(p(:,4))-max_Hvf = -57.9956

    Hope this helps.
  • Re: Problema con uno struct

    Si si come ho scritto ho modificato il codice così:
    modulosensore1(i)=20*log10((max_p1-max_Hv)/(min_p1-min_Hv));
    modulosensore2(i)=20*log10((max_p2-max_Hv)/(min_p2-min_Hv));
    modulosensore3(i)=20*log10((max_p3-max_Hv)/(min_p3-min_Hv));
    modulosensore4(i)=20*log10((max_p4-max_Hv)/(min_p4-min_Hv));
    adesso di questo se voglio fare il grafico in scala logaritmica al variare della frequenza cosa bisogna scrivere
    semilogx(modulosensore1,frequenza)?
  • Re: Problema con uno struct

    OK.
    Tra tutti i messaggi non avevo visto quello con
    bisogna mettere delle parentesi dopo 20*log 10 che si apre e chiude alla fine.
    Vedo che hai anche cambiato i parametri nel calcolo dei vettori "modulosensore...".

    Assumo che non ti vengano valori complessi.

    Per quanto riguarda il come fare un grafico in scala logaritmica, dai un'occhiata alla mia risposta nella quale ho inserito quanto riportato dall'help in linea di MatLab a proposito delle funzioni semilogx, semilogy, loglog.

    Nel caso consulta anche la documentazione più dettagliata alla quale puoi accedere con il comandi:
    doc semilogx
    doc semilogy
    doc loglog
    
    In sintesi:

    semilogx imposta l'asse "x" in scala logaritmica
    semilogy imposta l'asse "y" in scala logaritmica
    loglog imposta entrambi gli assi in scala logaritmica

    Ti rinnovo anche il dubbio che ho esposto in quella risposta: dal momento che calcoli i vettori "modulosensore..." già in formato logaritmico => "20*log10((max_p1-m" ecc. sei sicuro di dover / voler creare assi con scala logaritmica?

    Quanto alla tua domanda specifica:
    osa bisogna scrivere
    semilogx(modulosensore1,frequenza)?
    tieni presente che il primo parametro deve contenere i valori delle ascisse, il secondo quello delle ordinate.

    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
23 risposte