我想规范化粒子列表中的权重。这些权重属于粒子对象。我尝试通过将它们除以权重之和来对它们进行标准化。所有重量均以双打声明。当程序开始在列表的开头划分时,值是正确的,但是在第二次或第三次除法后不久,我得到错误的结果..这导致操作后权重之和不是1,这就是它应该。任何人都可以帮我解决这个问题吗?也许与线程有关?先谢谢..
// normalizing weights
double weightsum = 0;
double check = 0;
List<ParticleRobot> temporalparticleSet = new List<ParticleRobot>();
for (int i = 0; i < particleSet.Count; i++)
{
weightsum = weightsum + this.particleSet[i].Weight;
}
Program.Weightsum = weightsum;
Console.WriteLine("Sum of unnormalized particleweights is " + weightsum);
foreach (ParticleRobot p in this.particleSet)
{
Program.Weight = p.Weight;
p.Weight = Program.Weight / Program.Weightsum;
Console.WriteLine("Updated Particleweight is now : " + p.Weight);
}
// checking that they sum up to 1
for (int i = 0; i < particleSet.Count; i++)
{
check = check + this.particleSet[i].Weight;
}
Console.WriteLine("Check: Sum of particles-weights is = " + check);
答案 0 :(得分:0)
可能不是线程问题。在任何数值分析书中阅读浮点数学。查看http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html。舍入错误,精度问题,取消问题都可能有所贡献。
答案 1 :(得分:0)
首先,什么是temporalparticleSet?你真的想要循环而不是this.particleSet吗?除此之外,我根本没有看到代码的任何问题。我会修改:
Program.Weight = p.Weight;
p.Weight = Program.Weight / Program.Weightsum;
到
p.Weight = p.Weight / Program.Weight;
也是p.Weight一双?可能是一些舍入问题。您是否尝试过使用断点并单步执行它?
答案 2 :(得分:0)
我担心Program.Weight会修改它所分配的值或不是相同的数据类型。
我会尝试更改以下行:
Program.Weight = p.Weight;
p.Weight = Program.Weight / Program.Weightsum;
到
p.Weight = p.Weight / Program.Weightsum;
还需要考虑舍入错误。
答案 3 :(得分:0)
大量数字的累积可能会失去精确度。以下是两种可以提供帮助的技术: