[Matlab] Problemi con il Ciclo For
Salve a tutti
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

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
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?
Sai come fare una cosa del genere?
"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...
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.
Prova a scrivere qualche termine della sommatoria in maniera esplicita, questo dovrebbe aiutarti a capire come fare.
"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

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);
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

Che cosa intendi con $R_8(n)$? È un segnale particolare? Se non ci mostri la tua implementazione è comunque difficile capire che errore hai commesso.
"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 ?
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):
Il vettore x dovrebbe a questo punto essere quello da te desiderato.
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.
"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?
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.
"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.
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.
"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
