帮助优化matlab中的for循环

时间:2010-05-02 16:00:43

标签: optimization matlab

我有一个1乘N的双数组,由1和0组成。我想将所有1映射到符号'-3'和'3',所有0映射到符号'-1'和'1'同等。以下是我的代码。由于我的阵列约为800万,因此需要很长时间。如何加快速度?

[row,ll] = size(Data);
sym_zero = -1;
sym_one = -3;
for loop = 1 : row
    if Data(loop,1) == 0
        Data2(loop,1) = sym_zero;
                     if sym_zero == -1
                         sym_zero = 1;
                     else
                         sym_zero = -1;
                     end
    else
        Data2(loop,1) = sym_one;
                     if sym_one == -3
                         sym_zero = 3;
                     else
                         sym_zero = -3;
                     end
    end
end

4 个答案:

答案 0 :(得分:8)

这是非常重要的 MATLAB优化提示。

预分配!

通过简单的预分配,您的代码 快得多。只需添加

Data2 = zeros(size(Data));
for loop = 1: row 
...
for循环之前

在我的计算机您的代码上,预分配已在0.322s中终止,您的原始代码仍在运行。我删除了我原来的解决方案,因为你的这个优化非常快:)。

此外,由于我们讨论的是MATLAB,因此处理列向量的速度更快。

答案 1 :(得分:2)

希望你能遵循这一点,我希望我能正确理解你的代码:

nOnes = sum(Data);
nZeroes = size(Data,2) - nOnes;

Data2(find(Data)) = repmat([-3 3],1,nOnes/2)
Data2(find(Data==0)) = repmat([-1 1],1,nZeroes/2)

我会留给你处理奇怪的10 s。

答案 2 :(得分:1)

因此,忽略负号,输出项Data2的公式[loop,1] = Data [loop,1] * 2 + 1.那么为什么不首先使用简单的乘法来做到这一点 - 这应该是快速的它可以被矢量化。然后创建一个原始数组长度为1s的一半的数组,原始数组长度为-1s的一半,调用randperm就可以了。然后乘以那个。一切都是矢量化的,应该更快。

答案 3 :(得分:0)

[row,ll] = size(Data);
sym_zero = -1;
sym_one = -3;
for loop = 1 : row
    if ( Data(loop,1) ) // is 1
        Data2(loop,1) = sym_one;
        sym_one = sym_one * -1; // flip the sign
    else
        Data2(loop,1) = sym_zero;
        sym_zero = sym_zero * -1; // flip the sign
    end
end