我有一个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
答案 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)
我会留给你处理奇怪的1
和0
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