Funzione writen Convoluzione in MATLAB dando guai
-
29-09-2019 - |
Domanda
Hey there, Sto avendo difficoltà a scrivere la MATLAB equivalente della funzione conv(x,y)
. Non riesco a capire il motivo per cui questo dà l'uscita corretta. Per le matrici
x1 = [1 2 1]
e x2 = [3 1 1]
.
Ecco quello che ho
x1 = [1 2 1];
x2 = [3 1 1];
x1len = leng(x1);
x2len = leng(x2);
len = x1len + x2len - 1;
x1 = zeros(1,len);
x2 = zeros(1,len);
buffer = zeros(1,len);
answer = zeros(1,len);
for n = 1:len
buffer(n) = x(n);
answer(n) = 0;
for i = 1:len
answer(n) = answer(n) + x(i) * buffer(i);
end
end
Il conv(x1,x2)
MATLAB dà 3 7 6 3 1
come l'uscita, ma questo mi sta dando 3 5 6 6 6
la risposta.
Dove ho sbagliato andato?
Inoltre, mi spiace per la formattazione sono sulla mini opera.
Soluzione
Oltre a non avere x
definito, e avendo tutti zeri per le variabili x1
, x2
, buffer
e answer
, io non sono certo il motivo per cui avete i vostri cicli annidati creati come sono. Non so il motivo per cui è necessario riprodurre il comportamento di CONV in questo modo, ma ecco come vorrei impostare una soluzione nidificato ciclo for:
X = [1 2 1];
Y = [3 1 1];
nX = length(X);
nY = length(Y);
nOutput = nX+nY-1;
output = zeros(1,nOutput);
for indexY = 1:nY
for indexX = 1:nX
indexOutput = indexY+indexX-1;
output(indexOutput) = output(indexOutput) + X(indexX)*Y(indexY);
end
end
Tuttavia, dal momento che questo è MATLAB, ci sono alternative a Vettorializzare loop in questo modo. Una tale soluzione è il seguente, che utilizza le funzioni SUM , SPDIAGS , e FLIPUD :
output = sum(spdiags(flipud(X(:))*Y));
Altri suggerimenti
Nel codice come indicato, tutti i vettori sono azzerato prima di iniziare, ad eccezione di x
che non viene mai definito. Quindi è difficile capire esattamente quello che stai ricevendo in. Ma un paio di cose da notare:
- Nel vostro ciclo
for
interno si utilizza valori dibuffer
che non sono ancora stati impostati dal ciclo esterno. - Il ciclo interno copre sempre la gamma
1:len
completo piuttosto che spostando un vettore rispetto all'altro.
Si potrebbe anche voler pensare a "vettorizzazione" po 'di questo, piuttosto che loop for
nidificazione -. Ad esempio, il vostro ciclo interno è solo il calcolo di un prodotto scalare, per i quali esiste già una perfetta buona funzione di Matlab
(Naturalmente lo stesso si può dire per conv
-? Ma immagino che stai reimplementare sia come compiti a casa o per capire come funziona)