Vettorizzazione "ricorsiva"

di il
4 risposte

Vettorizzazione "ricorsiva"

Ciao a tutti,
volevo sapere se e come è possibile risolvere questo problema.
Mettiamo di voler vettorizzare questo ciclo for:

A(1,1)=1
for i= 1:4
A(1,i+1)=A(1,i)+1
end

che ha come soluzione A=[1 2 3 4 5].

Provando con
A(1,1)=1
A(1,2:5)=A(1,1:4)+1

Matlab restituisce l'errore Index exceeds matrix dimensions, mentre creando precedentemente il vettore

A=zeros(1,5)

l'errore viene risolto ma la soluzione è A=[1 2 1 1 1]

perché, evidentemente, Matlab non aggiorna i valori mentre svolge i calcoli.

In generale quando il problema è di questo tipo esiste un modo per ottenere la soluzione senza utilizzare un ciclo for?

GRAZIE!!

4 Risposte

  • Re: Vettorizzazione "ricorsiva"

    Ciao,
    non mi è chiaro il problema.
    Vuoi un vettore di N elementi tutti distanziati di 1 (in generale di "n")?
    Oppure vuoi un vettore di lunghezza in parte definito fino all'elemento i-esimo, e da i+1 fino a N gli elementi siano uguali al precedente più "n"?
  • Re: Vettorizzazione "ricorsiva"

    Ciao,
    grazie per la risposta.
    Quello che ho riportato è solo un esempio il più banale possibile per spiegare il problema.

    In generale quello che mi interessa è un codice che crei un vettore dove, partendo dal primo elemento, gli elementi successivi siano determinati sulla base di una funzione da applicare all'elemento precedente, senza utilizzare il ciclo for.

    Per intenderci nell'esempio che ho postato la funzione che "lega" l'elemento successivo al precedente è +1, ma la soluzione che vorrei dovrebbe essere applicabile a una qualunque funzione (nel mio caso specifico la funzione contiene anche un numero casuale che rende tutto più complicato...)

    Spero di essere stato chiaro, grazie ancora per l'aiuto!
  • Re: Vettorizzazione "ricorsiva"

    Allora, vediamo un po'..

    se gli elementi successivi NON dipendono dagli elementi precedenti, il calcolo dovrebbe essere fattibile facilmente.

    Se però dipendono dagli elementi precedenti, credo che un ciclo sia necessario.

    Nel caso che hai mostrato nel primo messaggio:

    A = zeros(1,5) --> A = [0 0 0 0 0]
    A(1,1) = 0 --> A = [1 0 0 0 0]

    A(1,2:5) = A(1,1:4) + 1 = [1 0 0 0] + 1 = [2 1 1 1] --> A(1,1:5) = [1 2 1 1 1]

    Questo succede proprio perchè ad un dato istante aggiorni tutti gli elementi contemporaneamente, sulla base di una vecchia informazione: sono dunque abbastanza sicuro che un ciclo che scorra tutti gli elementi e li aggiorni di volta in volta sia necessario...
    Se qualcuno sostiene il contrario ben venga, son curioso di saperlo anche io..

    Domanda:
    per quale motivo vuoi evitare di usare un ciclo for?
    In generale, anche se ci fossero dei comandi Matlab che fanno al caso tuo, dunque senza usare te direttamente un ciclo for, probabilmente il ciclo viene comunque utilizzato nel corpo della funzione che richiami...

    Spero di esser stato un minimo di aiuto.

    Ciao
  • Re: Vettorizzazione "ricorsiva"

    Prima di postare ho provato a smanettare un po' e a cercare un po' su internet ma alla fine credo davvero sia necessario inserire un ciclo for, proprio per il discorso che fai te sul fatto che, altrimenti, aggiorna tutti gli elementi contemporaneamente.

    Principalmente la mia era curiosità, anche se in generale eliminare un ciclo for da una function permette (solitamente) un notevole risparmio di tempo e, visto che la mia era piuttosto "lenta", mi avrebbe fatto comodo!

    Grazie ancora per l'interessamento!

    Ciao
Devi accedere o registrarti per scrivere nel forum
4 risposte