Problema con uscite di una funzione.

di il
9 risposte

Problema con uscite di una funzione.

function  [area, perimetro, diagonale] = rettangolo (l1, l2)
inp1= menu('vuoi calcolare l area??','si','no');
if (inp1==1)
    area = l1*l2;
    
end
inp2 = menu('vuoi calcolare perimetro?','si','no');
if (inp2 == 1)
    perimetro =(l1+l2)*2;
end

inp3=menu ('vuoi calcolare diagonale?', 'si','no');
if (inp3==1)
    diagonale = (l1^2+l2^2)^0.5
end


end
Se per esempio volessi calcolare l'area e la diagonale, ma non il perimetro, come faccio a fare "capire" quale uscita mi deve stampare nel workspace e quale no??

grazie

9 Risposte

  • Re: Problema con uscite di una funzione.

    Metti all'interno di ciascun if una funzione disp:
    disp('il perimetro è:',num2str(perimetro));
    in questo modo verrà mostrato il risultato se vengono soddisfatte le condizioni dell'if.
    In realtà, se non ti servono i valori fuori dalla funzione ma vuoi solo visualizzarli, puoi anche non mettere uscite alla funzione. In caso contrario, se ti servono i valori per fare altri calcoli, credo che così il codice ti dia errore, perchè se uno degli if è un "no", lui non calcola proprio il valore di un'uscita e quindi dà errore.
  • Re: Problema con uscite di una funzione.

    Mi servono i valori della funzione...e appunto da errore.
    come si può fare?
  • Re: Problema con uscite di una funzione.

    Le devi far calcolare tutte, fuori dagli if. E dentro l'if se vuoi, metti solo un disp per farle vedere a video.
    Poi al di fuori della funzione usi solo quelle che ti servono.
  • Re: Problema con uscite di una funzione.

    giug ha scritto:


    Le devi far calcolare tutte, fuori dagli if. E dentro l'if se vuoi, metti solo un disp per farle vedere a video.
    Poi al di fuori della funzione usi solo quelle che ti servono.
    Non posso, questo del rettangolo è solo un esempio.
    La mia funzione è un automatizzazione di un preprocessamento di un segnale.
    Per esempio un uscita potrebbe essere la rimozione di artefatti tramite l'algoritmo ICA che richiede circa 2 ore di lavoro. Non posso farglielo calcolare lo stesso anche se non mi serve.
    Alternative non ci sono?
  • Re: Problema con uscite di una funzione.

    Ci sono alternative a tutto...
    Diciamo che è sbagliato il concetto di mettere gli if così.
    Allora, tu avrai un file principale dove verranno richiamate diverse funzioni, metti gli if nel momento in cui chiami la funzione:
    a=segnale_originale
    if voglio_fare_la_rimozione_degli_artefatti
    b=funzione_che_fa_la_rimozione(a)
    else
    b=un_altra_funzione(a)
    end
  • Re: Problema con uscite di una funzione.

    Mi spiace non ho capito

    ti posto il codice originale così magari è più chiaro.
    function [struttura, IC, A, media] = bio_ing_provaaa
    
    
    
       dataset = input('Digita il numero identificativo del soggetto\n ')
       rec = menu ('Prima o seconda registrazione?',1,2)
       step = menu ('A che livello devo prendere i dati?', 'Data Raw Math', 'Data Prefiltred', 'Data Cleaned', 'Data Edited');
       
       
       struttura = Carica(dataset,rec,step);
       GetPotenze_m(dataset, rec, step);
       
    
       inp2 = menu ('Vuoi filtrare?','si','no')
       
        if (inp2 == 1)
            Filtra (dataset, rec, step)
            figure
            GetPotenze_m(dataset,rec,2)
        end
        inp3= menu ('Vuoi eliminare gli artefatti tramite ICA?','si','no');
        if (inp3 == 1)
           [IC A] =  CalcolaICA(dataset, rec,step)
        end
         inp4 = menu ('Vuoi eliminare qualche componente?','si','no')
    if (inp4 == 1)
      
       componenti = input ('Quali componenti vuoi eliminare? Se sono più di una, inseriscile tra parentesi quadra\n');
       RimArt_mario_prova(dataset,rec,step,componenti);
       figure
       Get_Potenze_m(dataset, rec, 3);
       
    end
    inp5=menu('Vuoi mediare qualche canale?','si','no');
     if (inp5 == 1)
         ch = input ('Quali canali vuoi mediare? Se sono più di uno, inseriscili tra parentesi quadra\n');
        media= media_canale_lory(dataset,rec,step,ch);
        figure
         GetPotenze_m(dataset,rec, 4);
     end
     
         
         end
    L'unica che mi viene è impostare tutte le variabili di uscita a 0 all'inizio della funzione, ma è davvero poco elegante. L'ideale sarebbe che le variabili vadano in uscita a posteriori dopo la formulazione della domanda.
  • Re: Problema con uscite di una funzione.

    Allora... potresti fare così... fai uscire dalla funzione il "segnale elaborato". Quindi, l'uscita è una sola, ma viene assegnata all'interno della funzione, di volta in volta al segnale elaborato.
    Oppure, puoi far uscire solo le variabili che ci sono sempre, e se devi fare l'elaborazione in più salvi il risultato in un file .mat che carichi nel workspace quando ti serve.
    Anche inizializzare le uscite, magari con un vettore vuoto [] non è così terribile come soluzione.
    Quando poi sei fuori dalla funzione fai un controllo con isempty per vedere se sono stati calcolati.
    Insomma, le soluzioni possono essere diverse...
    Sarebbe anche possibile mettere un numero variabile di uscite, ad esempio la funzione size si può richiamare in più modi:
    d = size(obj)
    [m,n] = size(obj)
    come vedi cambia il numero di uscite... però secondo me diventa un pò complesso da gestire. Se vuoi puoi guardare qui: http://www.mathworks.it/help/techdoc/ref/varargout.htm
  • Re: Problema con uscite di una funzione.

    Grazie, sei stato gentilissimo.
    Già salvo su file .mat, mi sa che farò così: se l'utente vuole carica le variabili nel workspace, altrimenti si guarda solo i grafici.
  • Re: Problema con uscite di una funzione.

    Figurati! Scegli tra tutte le soluzioni (immagino che ce ne siano anche altre che adesso non mi vengono in mente...) quella che si adatta meglio alle tue esigenze, in questo caso mi sembra che non ce ne sia una "migliore" delle altre.
Devi accedere o registrarti per scrivere nel forum
9 risposte