2017-06-14 50 views
0

我想用bsxfun替換for循環來計算Matlab中的卷積。 以下是該腳本:與bsxfun的卷積代替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. 

當我改變代碼:

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

錯誤就出來了,上面寫着:「輸入數組的兩個非單維必須匹配」。

我該如何糾正這條線?非常感謝!

+0

這個循環是否適合你? '+'兩邊的尺寸是不一樣的。 – EBH

回答

0

你爲什麼要用bsxfun替換循環?如果卷積涉及的大小不是特別小,那麼卷積將佔用大部分開銷,並且循環與此調用的某些矢量化版本之間的差異將會很小。

你有一個選擇,如果你能負擔得起臨時存儲並且它不會與你的數字太多混淆,那就是使用FFT來進行這種卷積。這看起來像

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

如果'channel'和'Transmitted'都是真實的,你也可以在''ifft'調用中添加''symmetric''標誌來確保'Received'也是真實的。 – CKT