为什么这个MATLAB脚本执行这么长时间?

时间:2016-12-24 22:02:07

标签: matlab performance optimization

我正在尝试使用和积解码时模拟BPSK AWGN通道上LDPC码的性能。

为此,我在MATLAB中编写了一个函数,该函数遵循in the 34th page of this paper描述的算法。但是,当我使用我用大尺寸奇偶校验矩阵编写的函数时(我需要使用1012 x 1518的矩阵),程序需要FOREVER进行一次迭代(我试图模拟性能)通过至少100k次迭代来获得良好估计的此通道中的代码。我正在使用的矩阵H是非常低密度(每列只有两个1),所以我希望脚本运行得更快。

我认为可能使用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 个答案:

答案 0 :(得分:2)

正如在其他答案中所述,矢量化通常会加快计算速度。这意味着不是为矩阵的每个元素多次运行相同的函数,而是只能为整个矩阵运行一次函数。如果您对循环和GridLayoutManager语句更熟悉,可以考虑使用c ++等语言来达到所需的速度。所以这是一个矢量化形式;

 int findFirstCompletelyVisibleItemPosition();
 int findLastCompletelyVisibleItemPosition(); 

答案 1 :(得分:1)

问题是你probbaly不应该使用for - 循环,嵌套循环甚至更少,因为Matlab是一种解释语言。为了加快速度,请尝试对操作进行矢量化,以利用MATLAB内置函数的速度。