?違いはありますか?私は彼らが同等だと思うが、そうではないようだ?なぜ誰が知っていますか?このテストは同音異義語ですか?</p> <pre><code>if((x>0 || (x<=0))) </code></pre> <p>と<code>if(true)</code>の違いは何であるいくつかの</p> <pre><code>double x; </code></pre> <p>考える
私はcppを初めて使っています。この質問は申し訳ありません。しかし、私は本当にこの問題を解決する必要があります double sigmaX = 0.1; double sigmaY = 0.1; measure_prob関数で
SimPFilter::SimPFilter() {
totalParticles = 100;
nFilters = 2;
gsl_rng_env_setup();
rng = gsl_rng_alloc(gsl_rng_mt19937);
gsl_rng_set(rng, time(NULL));
}
SimPFilter::~SimPFilter() {
}
void SimPFilter::initParticles(double initX, gsl_rng* rng){
for (int i=0; i < totalParticles; i++) {
particles[i].xp = particles[i].x = 0.5 + gsl_ran_gaussian(rng, sigmaX*sigmaX);
if(i > totalParticles/2)
particles[i].xp = particles[i].x = -0.5 + gsl_ran_gaussian(rng, sigmaX*sigmaX);
particles[i].wNormalized = 1/(totalParticles/nFilters);
int j = (int)i/(totalParticles/nFilters);
particles[i].id = j;
filters[j].nParticles = (totalParticles/nFilters);
particles[i].w = particles[i].wp = particles[i].wNormalized = 1/totalParticles;
}
for(int i =0; i<nFilters; i++){
filters[i].weight = filters[i].weightPrev = 1.0/nFilters;
}
}
void SimPFilter::transition(gsl_rng* rng){
for (int i=0; i < totalParticles; i++) {
double temp = particles[i].x;
particles[i].xp = temp;
particles[i].x += gsl_ran_gaussian(rng, sigmaX*sigmaX); //the centre of each region
}
}
double SimPFilter::measure_prob(particle *p, double obser_y, gsl_rng* rng){
double x = p->x;
//cout << "x value is " << x << endl;
double prob = gsl_ran_gaussian_pdf (obser_y - (x*x), sigmaY);
//cout << "probability " << prob << endl;
std::cout << std::boolalpha;
//cout << (x>0 || (x<=0)) << endl;
if(true){
//cout << "probability2 " << prob << endl;
return prob;
}
return prob;
}
void SimPFilter::updateWeight(double obser_y, gsl_rng* rng){
for (int i=0; i < totalParticles; i++) {
double temp = particles[i].w;
particles[i].wp = particles[i].w;
particles[i].w = measure_prob(&particles[i], obser_y, rng);
}
//normalized particle weight
double eachFilterSum[nFilters];
for(int i=0; i < totalParticles; i++){
int id = particles[i].id;
eachFilterSum[id] += particles[i].w;
}
for(int i=0; i < totalParticles; i++){
particles[i].wNormalized = particles[i].w/eachFilterSum[particles[i].id];
}
//update each filter's weight
double eachFilterW[nFilters];
for(int i=0; i< totalParticles; i++){
//cout << "prticle i's weight1 "<<particles[i].w << endl;
int id = particles[i].id;
eachFilterW[id] += particles[i].wNormalized;
}
double sigmaweight =0; // simga pi n t-1 * wnt
for(int j=0; j<nFilters; j++){
sigmaweight += filters[j].weightPrev * eachFilterW[j];
}
for(int j=0; j<nFilters; j++){
double temp = filters[j].weight;
filters[j].weight = filters[j].weightPrev * eachFilterW[j]/sigmaweight;
filters[j].weightPrev = temp;
}
}
void SimPFilter::resample(gsl_rng* rng){
particle * newParticles;
newParticles = (particle*) malloc(totalParticles * sizeof(particle));
int index =(int)gsl_rng_uniform (rng)* totalParticles;
double beta = 0.0;
double maxWeight =0;
for (int i=0; i < totalParticles; i++) {
maxWeight = max(maxWeight, particles[i].wNormalized* filters[particles[i].id].weight);
}
for(int j=0; j < totalParticles; j++){
beta += (rng, 0, 2*maxWeight);
while(beta > particles[index].wNormalized * (filters[particles[index].id].weight)){
beta -= particles[index].wNormalized * (filters[particles[index].id].weight);
index = (index+1) % totalParticles;
}
newParticles[j] = particles[index];
}
for(int i=0; i<totalParticles; i++){
particles[i] = newParticles[i];
particles[i].w = particles[i].wNormalized = particles[i].wp =1/filters[particles[i].id].nParticles;
}
//update each filter particles number
vector<int> countP;
for(int i=0; i<nFilters; i++){
countP.push_back(0);
}
for(int i=0; i< totalParticles; i++){
countP.at(particles[i].id)++;
}
for(int i=0; i< nFilters; i++){
filters[i].nParticles = countP.at(i);
}
for(int i=0; i< nFilters;i++)
cout << "n particle value is " << filters[i].nParticles << endl;
free(newParticles);
}
`、私は(真の)場合は、調べる、または(x> = 0 || X < 0)場合には、異なる結果を与えます。 2つのオブジェクトを追跡することができる場合(true)、if(x> = 0 || x < 0)を使用すると、すぐに1つのオブジェクトに収束します。私は本当に混乱しています...
「x」とは何ですか? –
'x 'が何であるかは非常に異なります。副作用のある表現ですか? '>'や '<='演算子がオーバーロードされた型ですか?潜在的な 'x <0'演算子のオーバーロードは、論理演算子、または' || '演算子をオーバーロードしたものを返しますか? –
xが 'float'または' double'でNaN(Not a Number)の場合、両方の条件はfalseになります。その場合、それらは全く同等ではありません。 – SirGuy