2016-12-24 13 views
1

私は、sum-productデコードを使用するときに、BPSK AWGNチャネルでLDPCコードのパフォーマンスをシミュレートしようとしています。なぜこのMATLABスクリプトは実行に時間がかかりますか?

これについては、in the 34th page of this paperのアルゴリズムに従ったMATLABで関数を記述しました。しかし、私が大きな次元のパリティチェック行列(1012 x 1518の行列を使用する必要があります)を使って書いた関数を使用すると、プログラムはFOREVERを1回繰り返します(パフォーマンスをシミュレートしようとしています)このチャネルのコードを100k回以上反復して評価してください)。私が使用している行列Hは、が非常にで、低密度です(1列に2つしかありません)ので、スクリプトの実行速度が速くなると思います。

floatを使って0と1だけの行列を表すのは問題かもしれないと思っていましたが、これが大きな変化を意味するかどうかはわかりません。また、私は、これらの行列がブール値であった場合、私の関数で使用する演算の実行方法を知りません。

だれでも考えていますか?私は以下に書いた関数を入れます。

function y = sum_product(r, H, I_max) 

[m , n] = size(H); 

I = 0; 

for i = 1:n 
    for j = 1:m 
     if H(j,i) == 1 
      M(j,i) = r(i); 
     else 
      M(j,i) = 0; 
     end 
    end 
end 

M = sparse(M); 

E = M; 

while 1 

for j = 1:m 
    for i = 1:n 
     aux = 1; 
     if H(j,i) == 1 
      for l = 1:n 
       if l~=i & H(j,l) == 1 
        aux = tanh(M(j,l)/2)*aux; 
       end 
      end 
      E(j,i) = log(1+aux)-log(1-aux); 
     end 
    end 
end 

for i = 1:n 
    aux = 0; 
    for j = 1:m 
     if H(j,i) == 1 
      aux = aux + E(j,i); 
     end 
    end 

    L(i) = aux + r(i); 

    z(i) = L(i)<=0; 
end 

if I == I_max | mod((H*transpose(z)) , 2) == 0 
    break; 
else 
    for i = 1:n 
     for j = 1:m 
      aux = 0; 
      if H(j,i) == 1 
       for l = 1:m 
        if l~=j & H(l,i) == 1 
         aux = aux + E(l,i); 
        end 
       end 
      M(j,i) = aux + r(i); 
      end 
     end 
    end 
I = I + 1; 
end 
end 

y = z; 

end 
+2

どのバージョンのMATLABですか?パフォーマンスの問題を再現する 'r'、' H'、 'I_max'の値は?大部分の計算時間が費やされた場所を特定するためにあなたのコードをプロファイルしましたか? – excaza

答えて

2

他の答えで述べたように、ベクトル化はしばしば計算を高速化します。つまり、行列の各要素に対して同じ関数を複数回実行する代わりに、行列全体に対して関数を1回だけ実行することができます。ループやif elseステートメントの方が快適な場合は、C++などの言語を使用して目的の速度に到達することを検討することができます。ここではベクトル化された形式があります。

function z = sum_product(r, H, It_max) 
    m = size(H,1); 
    n = size(H,2); 
    M = repmat(r,m,1); 
    L = zeros(m,n); 
    E = zeros(m,n); 
    x = reshape(1:numel(H),m,n).'; 
    idx1= reshape(x(logical(H')),[],m).'; 
    idx2= reshape(find(H),[],n); 
    for It = 0:It_max 
     tn = tanh(M(idx1)/2); 
     pr = bsxfun(@rdivide,prod(tn,2),tn); 
     E(idx1) = log((1+ pr)./(1-pr)); 
     sumE = sum(E(idx2)); 
     L = sumE + r; 
     z = L <= 0; 
     if all(mod(H * z.',2) == 0) 
      break; 
     end 
     M(idx2) = bsxfun(@plus,bsxfun(@minus,sumE , E(idx2)),r); 
    end 
end 
1

問題は、MATLABはインタプリタ言語であるとして、あなたはprobbaly、さらに少ないのでfor -loops、ネストされたループを使用してはならないということです。作業を高速化するために、MATLABの組み込み関数の速度を利用するように操作をベクトル化してみてください。

+0

ここでは解釈とコンパイルは関係ありません。速いループを持つ多くの翻訳された言語があります。言語の成熟に伴ってMATLABのループ化された組み込み関数とベクトル化された組み込み関数のパフォーマンスのギャップも縮小しているため、これはもはや有効な絶対ブランケットステートメントではなくなりました。 OPは、計算時間がどこに費やされているかを識別するために[コードをプロファイルする]必要があります(https://www.mathworks.com/help/matlab/matlab_prog/profiling-for-improving-performance.html)。 – excaza

関連する問題