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