Ich versuche, die Leistung eines LDPC-Codes auf einem BPSK-AWGN-Kanal zu simulieren, wenn die Summenprodukt-Decodierung verwendet wird.Warum dauert die Ausführung dieses MATLAB-Skripts so lange?
Dafür habe ich eine Funktion in MATLAB geschrieben, die dem beschriebenen Algorithmus in the 34th page of this paper folgt. Wenn ich jedoch die Funktion verwende, die ich mit Parity-Check-Matrizen großer Dimension geschrieben habe (ich brauche eine Matrix von 1012 x 1518), nimmt das Programm FOREVER, um eine einzige Iteration zu machen (ich versuche die Performance zu simulieren) des Codes in diesem Kanal durch mindestens 100k Iterationen, um eine gute Schätzung zu haben). Die Matrix H, die ich verwende, ist sehr niedrige Dichte (es hat nur zwei 1 pro Spalte), so würde ich erwarten, dass das Skript viel schneller laufen.
Ich dachte, dass möglicherweise float
verwenden, um Matrizen mit nur Nullen und Einsen darzustellen, kann das Problem sein, aber ich bin mir nicht sicher, ob dies eine große Veränderung bedeuten würde. Außerdem würde ich nicht wissen, wie einige der Operationen, die ich in meiner Funktion verwende, ausgeführt werden, wenn diese Matrizen boolesch sind.
Hat also jemand eine Idee? Ich werde die Funktion schreiben, die ich unten geschrieben habe.
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
Welche Version von MATLAB? Was sind die Werte von "r", "H" und "I_max", die das Leistungsproblem reproduzieren? Haben Sie [Ihren Code profiliert] (https://www.mathworks.com/help/matlab/matlab_prog/profiling-for-improving-performance.html), um festzustellen, wo die meiste Rechenzeit verbracht wird? – excaza