[Matlab] Problemi con il Ciclo For

folgore1
Salve a tutti :-D
Come da oggetto ho un problema con il ciclo for in Matlab.In pratica dovrei implementare questo segnale:
$\sum_{m=0}^10 (m+1)*[\delta(n-2m)-\delta(n-2m-1)]$ con $0<=n<=25$.
Ho fatto in questo modo:
n = [0:25];
m = [0:10];
for i = 1:length(m)
x = ((m(i)+1).*([n == 2*m(i)]-[n == 2*m(i)+1]))
end
e giustamente mi genera questa iterezioni di cui vorrei farne la somma!Qualcuno puoi aiutarmi?Vi ringrazio in anticipo!
x =
Columns 1 through 16
1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Columns 17 through 26
0 0 0 0 0 0 0 0 0 0
x =
Columns 1 through 16
0 0 2 -2 0 0 0 0 0 0 0 0 0 0 0 0
Columns 17 through 26
0 0 0 0 0 0 0 0 0 0
x =
Columns 1 through 16
0 0 0 0 3 - 3 0 0 0 0 0 0 0 0 0 0
Columns 17 through 26
0 0 0 0 0 0 0 0 0 0
x =
Columns 1 through 16
0 0 0 0 0 0 4 - 4 0 0 0 0 0 0 0 0
Columns 17 through 26
0 0 0 0 0 0 0 0 0 0
x =
Columns 1 through 16
0 0 0 0 0 0 0 0 5 -5 0 0 0 0 0 0
Columns 17 through 26
0 0 0 0 0 0 0 0 0 0
x =
Columns 1 through 16
0 0 0 0 0 0 0 0 0 0 6 -6 0 0 0 0
Columns 17 through 26
0 0 0 0 0 0 0 0 0 0
x =
Columns 1 through 16
0 0 0 0 0 0 0 0 0 0 0 0 7 -7 0 0
Columns 17 through 26
0 0 0 0 0 0 0 0 0 0
x =
Columns 1 through 16
0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 -8
Columns 17 through 26
0 0 0 0 0 0 0 0 0 0
x =
Columns 1 through 16
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Columns 17 through 26
9 -9 0 0 0 0 0 0 0 0
x =
Columns 1 through 16
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Columns 17 through 26
0 0 10 -10 0 0 0 0 0 0
x =
Columns 1 through 16
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Columns 17 through 26
0 0 0 0 11 -11 0 0 0 0

Risposte
Raptorista1
Direi di aggiungere una variabile in cui memorizzare, ad ogni ciclo del for, la somma "aggiornata a quel ciclo".
Sai come fare una cosa del genere?

folgore1
"Raptorista":
Direi di aggiungere una variabile in cui memorizzare, ad ogni ciclo del for, la somma "aggiornata a quel ciclo".
Sai come fare una cosa del genere?

Si infatti avevo pensato anche io ad una cosa del genere...solo che nn saprei come procedere...

Raptorista1
Non c'è nulla di difficile: prima dichiari una variabile e la inizializzi a zero; ad ogni ciclo le aggiungi il valore dell'addendo corrispondente.
Prova a scrivere qualche termine della sommatoria in maniera esplicita, questo dovrebbe aiutarti a capire come fare.

folgore1
"Raptorista":
Non c'è nulla di difficile: prima dichiari una variabile e la inizializzi a zero; ad ogni ciclo le aggiungi il valore dell'addendo corrispondente.
Prova a scrivere qualche termine della sommatoria in maniera esplicita, questo dovrebbe aiutarti a capire come fare.

Ti ringrazio molto per l'aiuto :-D in effetti avevo trovato in rete il procedimento che mi hai descritto tu ma nn avevo capito bene.Ad ogni modo il grafico coincide con quello atteso ed è il seguente:
n = [0:25];
m = [0:10];
h = 0;
for i = 1:length(m)
x = (m(i)+1).*([n == 2*m(i)]-[n == 2*m(i)+1]);
h = x + h;
end
x = h;
stem(n,x);

folgore1
Avrei un'altra domanda...ho provato a generare allo stesso modo il segnale $x(n) = R_8 (n) \sum_(k=0)^n k^3$ ma non mi restituisce quello calcolato analiticamente :(

apatriarca
Che cosa intendi con $R_8(n)$? È un segnale particolare? Se non ci mostri la tua implementazione è comunque difficile capire che errore hai commesso.

folgore1
"apatriarca":
Che cosa intendi con $R_8(n)$? È un segnale particolare? Se non ci mostri la tua implementazione è comunque difficile capire che errore hai commesso.

Si certo!Avete ragione,scusatemi!
Allora innanzitutto $R_8(n)$ è una finestra rettangolare di durata $8$ definita nell'intervallo $0<=n<=7$.Essa viene moltiplicata per la sommatoria : $\sum_(k=0)^n k^3$.
n = [0:7];
k = [0:length(n)-1];
x = 0; % è la variabile di accumulo
for i = 1:length(n)
     x = x + (k(i).^3)
end

x =

     0


x =

     1


x =

     9


x =

    36


x =

   100


x =

   225


x =

   441


x =

   784

In pratica mi restituisce i valori di ogni ciclo (i valori restituiti corrispondono a quelli calcolati da me analiticamente) piuttosto che restituirmi il vettore
x = [0 1 9 36 100 225 441 784];

come devo procedere a questo punto ?

apatriarca
Se vuoi ottenere tutto il vettore allora devi memorizzare tutti i valori intermedi invece che sovrascriverli. In altre parole puoi scrivere qualcosa come il seguente (non l'ho provato su matlab):

r = 8;
c = [0:(r - 1)] .^ 3; % calcolo direttamente tutti i cubi 
x = zeros(size(k));

for i = 2:r % ho saltato il caso i = 1 perché il valore è uguale a 0 e avresti comunque dovuto calcolarlo separatamente. 
    x(i) = x(i-1) + c(i);
end


Il vettore x dovrebbe a questo punto essere quello da te desiderato.

folgore1
"apatriarca":
Se vuoi ottenere tutto il vettore allora devi memorizzare tutti i valori intermedi invece che sovrascriverli. In altre parole puoi scrivere qualcosa come il seguente (non l'ho provato su matlab):

r = 8;
k = [0:length(n)-1];
c = [0:(r - 1)] .^ 3; % calcolo direttamente tutti i cubi 
x = zeros(size(k));

for i = 2:r % ho saltato il caso i = 1 perché il valore è uguale a 0 e avresti comunque dovuto calcolarlo separatamente. 
    x(i) = x(i-1) + c(i);
end

Il vettore x dovrebbe a questo punto essere quello da te desiderato.

Si cmq funziona!Ma quindi facendo
x = zeros(size(k));
hai inizializzato il vettore x poi con
x(i) = x(i-1) + c(i);
hai sommato ciascun cubo per il cubo precedente?Giusto?

apatriarca
Esatto, $x(i-1)$ è il valore precedente della tua somma e $c(i)$ è il cubo corrente. Per cui calcoli il nuovo valore $x(i)$ aggiungendo il cubo corrente alla somma precedente.

folgore1
"apatriarca":
Esatto, $x(i-1)$ è il valore precedente della tua somma e $c(i)$ è il cubo corrente. Per cui calcoli il nuovo valore $x(i)$ aggiungendo il cubo corrente alla somma precedente.

Ok!Ti ringrazio molto per la tua risposta!Quindi praticamente il ciclo for itera un'operazione ricorsiva fino a quando non terminano i valori dell'indice i.

apatriarca
I valori vengono calcolati in modo iterativo e non ricorsivo. Vengono cioè calcolati tutti i valori da i=1 fino ad i = 7 in ordine.

folgore1
"apatriarca":
I valori vengono calcolati in modo iterativo e non ricorsivo. Vengono cioè calcolati tutti i valori da i=1 fino ad i = 7 in ordine.

Ho capito!Ti ringrazio :-D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.