加速在C ++中反转元素(int类型)

时间:2015-06-02 07:32:58

标签: c++ visual-studio-2010 visual-studio-2012

我有一个大小为1 by 500的向量,其类型为integer。给定可逆概率为P.对于vector中的每个元素,我将创建一个随机数,如果随机数小于P,则该元素被反转。例如,我有

vec=    [1   0   0   1   0   1]
random= [0.1 0.6 0.8 0.2 0.1 0.2]
P=0.5;
vec_new=[0   0   0   0   1   0] 

For first element vec[0]=1 and random[0]=0.1<P=0.5 then vec_new[0]=invert of vec[0]=0, and so on 我实现了它,但是,我认为我的代码不是那么快,你能看到并告诉我如何加速C++中的反转部分吗?目前,我用过

vec_new[k]=vec[k]+1)%2;//Invert 

这是我的代码

//Assume vec=[1 0 0 1 0 1]
vector<int>  vec_new;
for(int i=0;i<vec.size();i++)
if(ranom_number<P)//random_number is within 0 to 1
    vec[i]=(vec[i]+1)%2;//Invert vec;
}

2 个答案:

答案 0 :(得分:1)

  

你能看到并告诉我如何加速C ++中的反转部分吗?

考虑:

vec[i] = !static_cast<bool>(vec[i]);

如果您只有两个可能的值(0和1),您可能希望直接使用bool。

答案 1 :(得分:0)

反转可以表示为单个操作v[i] = 1 - v[i]。我不认为这是瓶颈。矢量很小(<4KB),RNG很可能是循环中最慢的部分。

另外,如果程序的这一部分成为瓶颈,我会感到惊讶。获得500个随机数可能是循环中最慢的部分,但这是相对的 - 它仍然非常快。

可能不太理想的一件事是使用浮点数。不要生成介于0.0和1.0之间的数字。生成0到N之间的整数,并检查它是否小于N * P.