【发布时间】:2016-07-22 03:00:26
【问题描述】:
我正在尝试实现一个 K-nn 分类器。这个问题的一部分是从一个例子到另一个例子的欧几里得距离。我在计算它时遇到问题,因为 sum 最终是 NaN。
问题出在这个代码块中:
for(int i=0;i<fdataset.size();i++){
float sum=0;
for(int k=0;k<fdataset[i].size();k++){
if(mask[k]){
sum+=(fdataset[i][k]-example[k])*(fdataset[i][k]-example[k]);
}
}
results[i]=sqrt(sum);
}
fdataset 是 vector< vector<float> >,example 是 vector<float>。应该没有问题。那么,为什么我会遇到这个问题?
谢谢!
【问题讨论】:
-
"如果参数小于 -0,则引发 FE_INVALID 并返回 NaN。"来自
std::sqrt -
@Maikel
sum何时可以为负数?(fdataset[i][k]-example[k])*(fdataset[i][k]-example[k])总是积极的或0 -
是 sum NaN 还是结果包含 NaN?
-
检查fdataset是否包含
NaN或example是否包含NaN。 -
为了清楚起见,除了“某处输入错误”之外,您极不可能因为任何其他原因获得 NaN。由于代码和数据不完整,这里的任何人都无法说出某个地方是什么——但我想说,你不太可能发现编译器或硬件错误。
标签: c++ classification nan knn