Come usare correttamente il ciclo while in Matlab
Grecia, New York o Maldive: quanto accantonare ogni mese per la vacanza dei sogni e quanto si risparmia investendo tali somme
Tento di vacanze per milioni di italiani chiamati a scontrarsi con il problema budget. Le ferie estive, qualunque sia la meta, rappresentano probabilmente la spesa extra più importante ogni anno. …
Piazza Affari archivia luglio con una giornata no, balzo PIL non basta. Debacle di Enel e Saipem dopo i conti
Finale di ottava sottotono per Piazza Affari in una giornata cadenzata dal newsflow legato ai conti trimestrali e al riaccendersi della miccia M&A tra le banche con l’avvio dei colloqui …
L’Italia di Draghi corre il doppio del previsto, PIL fa nettamente meglio di Germania e Francia. Rischio frenata in mesi autunnali con variante delta
Sorpresa positiva dal Pil dell'Italia che nel secondo trimestre ha accelerato più del previsto, dando un segnale incoraggiante riguardo la ripresa economica in atto dopo un inizio 2021 in lieve …
Tutti gli articoli
Tutti gli articoli Tutte le notizie

  1. #1
    L'avatar di ScientiaPotentiaEst
    Data Registrazione
    Mar 2019
    Messaggi
    302
    Mentioned
    0 Post(s)
    Quoted
    284 Post(s)
    Potenza rep
    42949675

    Come usare correttamente il ciclo while in Matlab

    Ciao a tutti,

    è la prima volta che posto qui, quindi comincio complimentandomi con tutti i partecipanti a questa sezione perché davvero molto bravi e competenti. Vorrei approfittare della vostra competenza per chiedere lumi su un mio dubbio. Sto cercando di imparare a programmare in Matlab, vado per gradi e sto imparando i ''costrutti'' della programmazione, cioè le istruzioni condizionali (if, else if, etc.) e i cicli for e while.

    Ora, da quanto ho imparato so che tutto ciò che si può ciclare in for si può ciclare in while, ma non è necessariamente vero il contrario. Per puro esercizio ho scritto un programma che attraverso il ciclo for riesca a restituirmi il valore minimo presente in una matrice e la posizione. In particolare, questo sarebbe lo script:

    ...

    A=input('inserire matrice = ')

    [n_rows, n_cols] = size(A);

    minimo=A(1,1);

    for i=1:n_rows;
    for j=1:n_cols;
    if A(i,j)<minimo;
    minimo=A(i,j);
    end
    end
    end

    ...

    Ciò mi restituisce correttamente il minimo della matrice. Però, volendo fare la stessa cosa usando il ciclo while sbaglio qualcosa di banale, ma non riesco a capire cosa. Usando questo script:

    ...

    minimo=A(1,1);
    i=1;
    j=1;

    while i<=n_rows;
    while j<=n_cols;
    if A(i,j)<minimo;
    minimo=A(i,j);
    end
    j=j+1;
    end
    i=1+i;
    end

    ...

    In questo caso lo script però mi riporta il minimo soltanto della prima riga... mentre io vorrei che mi restituisse il minimo della matrice.

    Sapreste come dovrei modificare il ciclo while affinché Matlab mi restituisca il minimo della matrice?

    Grazie in anticipo per l'aiuto,
    Fabio

  2. #2

    Data Registrazione
    Oct 2009
    Messaggi
    9,596
    Blog Entries
    61
    Mentioned
    15 Post(s)
    Quoted
    640 Post(s)
    Potenza rep
    42949684
    Benedetto figliolo, se non mi sposti j=1 dentro al blocco while di i sarà durissima farcela

  3. #3
    L'avatar di Paolo1956
    Data Registrazione
    Jun 2010
    Messaggi
    5,770
    Mentioned
    1 Post(s)
    Quoted
    1579 Post(s)
    Potenza rep
    42949684
    Scusate,

    ma Matlab non ha una una funzione max/min da applicare agli array?

    Perché quei cicli gridano vendetta...

  4. #4
    L'avatar di FogOnLine
    Data Registrazione
    Feb 2014
    Messaggi
    10,252
    Mentioned
    62 Post(s)
    Quoted
    4128 Post(s)
    Potenza rep
    42949680
    Sí, con due max() annidati (se su matrice 2D).
    Il più interno restituisce il vettore che include i massimi di ciascuna colonna ed il secondo seleziona il massimo del vettore di massimi.

  5. #5
    L'avatar di Paolo1956
    Data Registrazione
    Jun 2010
    Messaggi
    5,770
    Mentioned
    1 Post(s)
    Quoted
    1579 Post(s)
    Potenza rep
    42949684
    Citazione Originariamente Scritto da FogOnLine Visualizza Messaggio
    Sí, con due max() annidati (se su matrice 2D).
    Il più interno restituisce il vettore che include i massimi di ciascuna colonna ed il secondo seleziona il massimo del vettore di massimi.
    Bentornata

  6. #6
    L'avatar di Paolo1956
    Data Registrazione
    Jun 2010
    Messaggi
    5,770
    Mentioned
    1 Post(s)
    Quoted
    1579 Post(s)
    Potenza rep
    42949684
    Comunque, per chiarire le idee al nostro amico:

    - quando sappiamo esattamente quanti passi occorrono è più corretto un ciclo for, se non altro è più chiaro e intellegibile
    - quando non lo sappiamo, perché deriva da una condizione da testare ad ogni ciclo si usa while.

    Esempino da squola:

    Codice:
    MaxCommonDiv [x,y]
    while(y>0)
    [x,y] = [y, x mod y];
    
    return x
    perché non hai idea di quanti passi occorrano

  7. #7
    L'avatar di ScientiaPotentiaEst
    Data Registrazione
    Mar 2019
    Messaggi
    302
    Mentioned
    0 Post(s)
    Quoted
    284 Post(s)
    Potenza rep
    42949675
    Sì Paolo, ci sono le funzioni max e min ma il mio obiettivo è quello di imparare ad usare il ciclo while. So che risparmierei molti passaggi e so anche che in questo caso - conoscendo il numero di iterazioni da fare avendo sia il numero di righe che di colonne - il ciclo for sia più efficiente del while, infatti l'ho usato. Però, siccome so che qualsiasi cosa che si può ciclare in for si può ciclare anche in while, vorrei riuscire a trovare il minimo della matrice anche con il ciclo while. Ti ringrazio per l'intervento.

    Grazie Cren, sono riuscito a risolvere con il tuo suggerimento. In effetti era una banalità...

  8. #8
    L'avatar di FogOnLine
    Data Registrazione
    Feb 2014
    Messaggi
    10,252
    Mentioned
    62 Post(s)
    Quoted
    4128 Post(s)
    Potenza rep
    42949680
    Se si legge un articolo di giornale che abbia lettere mancanti o parole mal scritte il nostro cervello "corregge" automaticamente gli errori e restituisce il senso corretto delle frasi. Con meccanismo analogo, quanto son più banali gli errori tanto più son difficili da scovare da chi ha scritto il codice.

    Mi permetto un suggerimento su Matlab. Capisco la volontà di sperimentare le singole istruzioni, ma la sua caratteristica principale è poter essere utilizzato in forma compatta per trattare matrici e porzioni delle stesse, evitando peraltro di usare come indici i e j che in Matlab sono utilizzati per I numeri immaginari (meglio abituarsi da subito a indici ii e jj).

    Un esempio, essendo A una matrice 2d di cui si voglia trovare il max e la sua posizione nella matrice.

    [max_val,pos_idx]=max(A(: )
    [row_idx,col_idx]=ind2sub(size(A),pos_idx)

    La notazione A(: )fa interpretare la matrice 2d come un vettore colonna, per questo la posizione del massimo all'interno della matrice va poi ricavata opportunamente.

  9. #9

    Data Registrazione
    Oct 2009
    Messaggi
    9,596
    Blog Entries
    61
    Mentioned
    15 Post(s)
    Quoted
    640 Post(s)
    Potenza rep
    42949684
    Citazione Originariamente Scritto da Paolo1956 Visualizza Messaggio
    Scusate,

    ma Matlab non ha una una funzione max/min da applicare agli array?

    Perché quei cicli gridano vendetta...
    Fate i puristi della vettorizzazione solo perché è il linguaggio sbagliato, se li avesse scritti in C++ con due iteratori const di std::vector< double > nessuno gli avrebbe detto niente

  10. #10
    L'avatar di Paolo1956
    Data Registrazione
    Jun 2010
    Messaggi
    5,770
    Mentioned
    1 Post(s)
    Quoted
    1579 Post(s)
    Potenza rep
    42949684
    Citazione Originariamente Scritto da Cren Visualizza Messaggio
    Fate i puristi della vettorizzazione solo perché è il linguaggio sbagliato, se li avesse scritti in C++ con due iteratori const di std::vector< double > nessuno gli avrebbe detto niente
    Sì, però tieni conto che i tempi cambiano e queste features sono oggi disponibili in una vasta gamma di linguaggi

Accedi