我有一个大小为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;
}
答案 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.