Esercizio vettori Matlab

di il
2 risposte

Esercizio vettori Matlab

Ciao a tutti, sono nuova sul forum e sto da poco iniziando a usare Matlab. L'esercizio che sto provando a risolvere, mi chiede di creare una function che, dati in input un numero a>=2 e un numero N, generi un vettore x che contenga tutte le potenze di a che sono minori o uguali a N.
Cioè il vettore x è del tipo x=[a^0 a^1 ... a^n ], con a^0, a^1,...,a^n<=N.

Io ho scritto questo codice
function [x] = esercizio(a,N)
if a<2
    error('inserisci un numero maggiore o uguale a 2');
end
x=zeros(n,1);

if a>=2
    for i=1:n
    while a^i<=N
        x(i)=a^i;
    end
    end
end
end

Ho pensato di inizializzare il vettore x come vettore nullo e di sostituirci i valori delle potenze di a fino a che fossero minori di N.
Quando lo mando in esecuzione però, giustamente mi viene dato l'errore perché la variabile n non è definita. Come posso risolvere?
Avevo anche pensato di impostare inizialmente x come vettore vuoto, ma comunque resta il problema di far variare l'indice i...

2 Risposte

  • Re: Esercizio vettori Matlab

    Di principio l'idea di inizializzare un vettore od una matrice è buona perchè riduce i tempi di esecuzione del codice, tuttavia non è "obbligatorio" e nel tuo caso non vedo come possa essere possibile.

    Considerando il tipo di problema che devi risolvere, l'inizializzazione del vettore non è un problema, la curva esponenziale cresce molto velocemente e, a mono di non scegliere un valore di "N" molto grande e uno di "a" molto piccolo, il vettore risultante avrà pochi elementi.

    Per quanto riguarda il codice che hai scritto:
    [*] ottima l'idea di inserire un controllo sul valore di "a", potresti aggiungerne uno per "N"
    [*] dal momento che se il valore di "a" è "<" la funzione genera un errore (vedi punto precedente) il blocco "if" nella funzione non serve, se "a" supera il controllo di errore, sarà per forza ">=2"
    [*] i due loop non sono necessari e, anche ammesso di conoscere il valore di "n" (e non lo conosciamo) creano potenzialmente un loop infinito; infatti, nel ciclo "while" interno il valore di "i" non cambia, per cui, se alla prima iterazione la condizione "a^i<=N" è verificata, il ciclo while si ripeterà all'infinito

    Dal momento che non si conosce il valore di "n" che fa terminare l'esecuzione della fnzione, quello che puoi fare è:

    [*] creare un contatore (es. "pow_val") che verrà incrementato ad ogni iterazione del ciclo while
    [*] creare un ciclo while "infinito", nel senso che la sua condizione è sempre verificata
    [*] effettuare il calcolo "a^pow_val e verificare se il risultato sia "<=N": se sì aggiungi il valore al vettore di output, in caso contrario usi l'istruzione "break" per forzare l'uscita dal ciclo while
    [*] il contatore, oltre che per calcolare il valore della potenza, va usato come indice per accedere al vettore
    
    
    pow_val=0
    while(1)
       tmp=a^pow_val
       if(tmp <= N)
          v(pow_val+1)=tmp
          pow_val=pow_val+1
       else
          break
       end
    end
    
  • Re: Esercizio vettori Matlab

    Grazie mille!
Devi accedere o registrarti per scrivere nel forum
2 risposte