Vai al contenuto

Primario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Secondario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Sfondo: Blank Waves Squares Notes Sharp Wood Rockface Leather Honey Vertical Triangles
Corsi di Laurea










ROX @ Unisa - Forum degli studenti di Ingegneria utilizza i cookie. Se prosegui la navigazione accetti il loro uso.    Accetto l'uso dei cookie
-->
Foto

[Matlab] Problema in funzione con ?due output? già risolta


  • Effettua l'accesso per rispondere
Questa discussione ha avuto 9 risposta/e

#1
SCA

SCA

    Advanced Member

  • Utente
  • StellaStellaStella
  • 46 Messaggi:
Gentili ragazzi,
posto il codice di una funzione che dovrebbe dare due risultati e in realtà ne dà solo uno (la matricola dell'operaio che riceve lo stipendio maggiore). La funzione è una simulazione d'esame risalente ad una lezione di Maggio dell'anno accademico 2011/2012 già svolta dal professore. Vorrei capire dove risale l'errore. Mi piacerebbe, inoltre, approfondire l'impostazione delle funzioni che prevedono due output e vorrei capire se tale funzione può essere considerata una funzione con due output oppure con un solo output che prevede due "vettori concatenati".

% Definire una funzione v=analizza(A) che, data una matrice A
% in cui sono presenti su ogni riga la Matricola, lo Stipendio base
% e i Giorni di assenza di ciascun dipendente, individui le matricole
% del dipendente che prenderà di più e di quello che prenderà di meno in
% busta paga.
% Lo stipendio in busta paga è dato dalla somma tra lo
% stipendio base e l'incentivo.
% L'incentivo è calcolato dividendo lo stipendio base per i giorni di
% assenza.
%
% [10 punti].
% Esempio:
% A=
% Matricola Stipendio base Giorni di assenza
% 23112 1100 2
% 23113 1150 5
% 23114 1500 6
% 23115 1200 12
% 23116 1200 3
% 23117 1200 5
% 23118 1900 10
% 23119 1500 12
% 23120 1150 10

%Matricola dipendente più pagato:
% 23118
%Matricola dipendente meno pagato:
% 23120
%

function [matricola_piu,matricola_meno]=analizza1(A)
numero_dipendenti=size(A,1);
for i=1:numero_dipendenti
stipendio(i)=A(i,2)+A(i,2)/A(i,3);
end
[C,I]=max(stipendio);
matricola_piu=A(I,1);
[C,I]=min(stipendio);
matricola_meno=A(I,1);

end




#2
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:

Gentili ragazzi,
posto il codice di una funzione che dovrebbe dare due risultati e in realtà ne dà solo uno (la matricola dell'operaio che riceve lo stipendio maggiore). La funzione è una simulazione d'esame risalente ad una lezione di Maggio dell'anno accademico 2011/2012 già svolta dal professore. Vorrei capire dove risale l'errore. Mi piacerebbe, inoltre, approfondire l'impostazione delle funzioni che prevedono due output e vorrei capire se tale funzione può essere considerata una funzione con due output oppure con un solo output che prevede due "vettori concatenati".]

Allora non facciamo confusione: la traccia richiede che la tua funzione individui le matricole del dipendente che prenderà di più e di quello che prenderà di meno in busta paga quindi la funzione ti deve restituire due valori, ovvero i valori delle matricole che soddisfano i requisiti richiesti. Però, il fatto che la funzione ti calcoli due valori non significa necessariamente che deve restituire due output (o più precisamente due variabili di output) , ma i valori che la funzione ti calcola possono essere "accorpate" in un'unica variabile di output cioè un vettore (nel tuo esempio si tratta del vettore v).
In generale devi tenere presente che esiste una distinzione fra il risultato della tua funzione e l'output vero e proprio: il primo è il risultato del calcolo eseguito tramite l'algoritmo che tu scrivi mentre il secondo è il contenitore dei risultati calcolati in precedenza e che matlab deve salvare in memoria. Naturalmente in matlab hai a disposizione tre tipi di "contenitori" (variabili, vettori e matrici) che tu puoi utilizzare come più ti conviene!

#3
SCA

SCA

    Advanced Member

  • Utente
  • StellaStellaStella
  • 46 Messaggi:
Quindi mi confermi il fatto che una funzione non possa avere "due output"?
PS. Io suggerirei, a questo punto, di modificare il parametro output, chiamandolo "risultato" e ponendolo, al termine dei cicli, uguale a un vettore concatenato in cui si inserisce la matricola con lo stipendio minimo e la matricola con lo stipendio massimo, altrimenti che senso ha mettere due "diciture" e alla fine avere solo la matricola con lo stipendio massimo? :comico: What do you think about? :rosso:

#4
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:

Quindi mi confermi il fatto che una funzione non possa avere "due output"?

No, allora mi sono spiegato male: output ti indica semplicemente quello che la funzione ti deve restituire. Il problema è come strutturare l'output, per esempio nella traccia che hai postato la funzione tipo era
v=analizza(A)
.
Poichè la traccia richiede di calcolare due valori e poichè la tua variabile di output nella traccia è una, v, questo significa che il tuo output sarà un vettore che avrà per componenti i tuoi due risultati dell' algoritmo.
Nello svolgimento la firma della funzione diventa:
[matricola_piu,matricola_meno]=analizza1(A)
questo significa che le tue variabili di output sono due e ciascuna conterrà separatamente i tuoi due risultati dell' algoritmo.
Conclusione: lo svolgimento che tu andrai a fare risolvendo il quesito richiesto dalla traccia ti restituirà sempre due valori i quali costituiscono l'output della tua funzione, ma l'output puoi strutturarlo come ti pare!

#5
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:

PS. Io suggerirei, a questo punto, di modificare il parametro output, chiamandolo "risultato" e ponendolo, al termine dei cicli, uguale a un vettore concatenato in cui si inserisce la matricola con lo stipendio minimo e la matricola con lo stipendio massimo, :comico: What do you think about? :rosso:

quello che vuoi fare tu è fattibile e sarebbe anche corretto, ma quello che ha fatto il prof è altrettanto corretto, ripeto: si tratta solo di modi differenti di strutturare l'output!
P.S. Per fare quello che vuoi fare dovresti cambiare la firma della funzione in:
[risultato]=analizza1(A)

altrimenti che senso ha mettere due "diciture" e alla fine avere solo la matricola con lo stipendio massimo?

quelle che tu chiami diciture sono variabili che per come è strutturata la firma della funzione:
[matricola_piu,matricola_meno]=analizza1(A)
l'algoritimo le deve per forza restituire.

#6
SCA

SCA

    Advanced Member

  • Utente
  • StellaStellaStella
  • 46 Messaggi:
Peppepè :rosso: Io voglio capire i seguenti punti. :book:
1) Uno-- Perchè la funzione è stata "rifirmata", nel senso che da "(v)=analizza(A)" è stata chiamata "[matricola_più,matricola_meno]=analizza1(A)"? Che...bisogno c'era? (L)
2) Due

l'algoritimo le deve per forza restituire.

Quando si lancia una funzione, l'$ans$ può essere considerata o no il vero output? Se sì, esso è unico. Se per

l'algoritimo le deve per forza restituire.

intendi $matricola max$ $matricola min$, allora si dovrebbero togliere i punti e virgola, anche perchè l'ans è una ed una sola e dà per giunta la matricola che guadagna più ndindi. :fun:
Quindi? :beg:

#7
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:

Peppepè :rosso: Io voglio capire i seguenti punti. :book:
1) Uno-- Perchè la funzione è stata "rifirmata", nel senso che da "(v)=analizza(A)" è stata chiamata "[matricola_più,matricola_meno]=analizza1(A)"? Che...bisogno c'era? (L)

Ecco è proprio questo il punto: non ha alcuna importanza che la funzione sia stata rifirmata o meno, quello che importa è che ti restituisce quello che ti deve restituire!

2) Due

l'algoritimo le deve per forza restituire.

Quando si lancia una funzione, l'ans può essere considerata o no il vero output? Se sì, esso è unico. Se per
peppepeppo ha scritto:

l'algoritimo le deve per forza restituire.

intendi matricola max matricola min, allora si dovrebbero togliere i punti e virgola, anche perchè l'ans è una ed una sola e dà per giunta la matricola che guadagna più ndindi. :fun:
Quindi? :beg:

Il tuo output esiste a prescindere dal fatto che lo vedi o meno nella command e dal fatto che che sia o non sia messo in ans. Il concetto è semplice: quando crei una funzione , la salvi e poi la lanci, matlab fa semplicemente quello che tu gli hai detto di fare . Ma tale funzione deve avere necessariamente uno scopo e quello scopo è il risultato. Una volta che matlab ti ha calcolato il risultato, o meglio, una volta che la funzione ha raggiunto il suo scopo, sono problemi tuoi dove vuoi che vada a finire il risultato della tua funzione.Una volta lanciata una funzione Matlab ti dice : ok io ho svolto i calcoli della tua funzione , ora se tu mi richiami dalla command in questo modo:
Caso I:
[matricola_piu,matricola_meno]=analizza1(A)
io i risultati che calcolo, nell'ordine in cui li trovo nella funzione, te li metto nello stesso ordine nelle variabili matricola_piu,matricola_meno.
Caso II:Allo stesso modo se mi richiami in questo modo:
[tizio,caio]=analizza1(A)
io ti salvo il primo risultato che trovo nella variabile tizio e il secondo nella variabile caio.
Caso III:Se , invece, mi richiami semplicemente così:
analizza1(A)
io (cioè sempre matlab) non so dove mettere il contenuto delle due variabili che tu hai messo nella tua firma di funzione ([matricola_piu,matricola_meno]=analizza1(A)). Per cui di default ti metto il primo risultato utile che trovo e te lo salvo in ans.Il secondo visto che non hai specificato dove vuoi che vada a finire, io te lo calcolo ma non te lo salvo perchè se non hai specificato dove vuoi che io lo salvi, allora io capisco che per questa volta non ti serve.
Caso IV:Se ancora mi richiami inserendo una sola variabile nell'output della firma, cioè facendo in questo modo:
[sempronio]=analizza1(A)
Io so dove mettere il primo risultato calcolato (e cioè matricola_piu) ma non so dove mettere il secondo (e cioè matricola_meno). Visto che di default (e per lo stesso ragionamento seguito per ans al Caso III ) io uso la variabile sempronio per restituirti a video e per salvarti il primo valore calcolato dalla funzione. Quindi poichè non mi hai suggerito dove salvare il secondo risultato della funzione, come invece mi avevi suggerito di fare nella firma ([matricola_piu,matricola_meno]=analizza1(A)), io il secondo risultato te lo calcolo ma non te lo salvo e non te lo mostro!

Spero che il monologo di MatLab ti chiarisca le idee!

#8
SCA

SCA

    Advanced Member

  • Utente
  • StellaStellaStella
  • 46 Messaggi:
Peppepè, invero ti dico... :ahsisi: non ho capito gniente :asd:
Scherzo, ho capito benissimo, il monologo è stato chiarissimo, hai colmato i miei dubbi grazie alle tue preziose conoscenze. Cercherò di metterle in pratica nel modo più proficuo. :D Grazie. :notworthy:

#9
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:

Scherzo, ho capito benissimo, il monologo è stato chiarissimo

Meno male, sennò sarei dovuto passare alle metafore...

#10
SCA

SCA

    Advanced Member

  • Utente
  • StellaStellaStella
  • 46 Messaggi:
:lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao: :lmfao:
Grande, Peppepèèèèèè, alias Mister MatLab!!! TiViBiii!!! :cheers:




Leggono questa discussione 0 utenti

0 utenti, 0 ospiti, 0 utenti anonimi