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.

È stato utile?

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 di buffer 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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top