2017-06-14 3 views
0

Je souhaite remplacer les boucles for par bsxfun pour calculer la convolution dans Matlab. Après le script:convolution avec bsxfun au lieu de boucles dans Matlab

for Rx = 1:Num_Rx 
    for Tx= 1:Num_Tx 
     Received(Rx,:)=Received(Rx,:)+conv(squeeze(channel(Rx,Tx,:))', Transmitted(Tx,:)); 
    end 
end 

% Received is a Num_Rx by N matrix, Transmitted is a Num_Tx by N matrix and channel is a 3D matrix with dimension Num_Rx, Num_Tx, N. 

Quand j'ai changé le code comme:

Received = bsxfun(@plus, Received, bsxfun(@conv, permute(squeeze(channel), [3 1 2]), Transmitted)); 

erreur est sorti, qui a dit: « deux dimensions non unique de tableaux d'entrée doit être adaptée ».

Comment corriger cette ligne? Merci beaucoup!

+0

Cette boucle fonctionne pour vous? les dimensions des deux côtés du «+» ne sont pas les mêmes. – EBH

Répondre

0

Pourquoi voulez-vous remplacer les boucles par bsxfun? Si les tailles impliquées dans la convolution ne sont pas particulièrement petites, alors la convolution va prendre la plupart de vos frais généraux et la différence entre les boucles et une version vectorisée de cet appel va être minime. Une option que vous avez, si vous pouvez vous permettre le stockage temporaire et ne pas trop bousculer vos chiffres, est d'utiliser la FFT pour faire cette convolution à la place. Cela ressemblerait à quelque chose comme

Transmitted = reshape(Transmitted, [1 Num_Tx size(Transmitted, 2)]); 
N = size(Transmitted, 3) + size(channel, 3) - 1; 
Received = ifft(fft(channel, N, 3).*fft(Transmitted, N, 3), N, 3); 
Received = squeeze(sum(Received, 2)); 
+0

Si 'channel' et' Transmitted' sont tous deux réels, vous pouvez aussi ajouter l'indicateur '' symmetric'' à l'appel 'ifft' pour vous assurer que' Received' est réel aussi. – CKT