我有2个向量,一个(结构的向量1(点))用X量的点填充,另一个(结构的向量2(PrimeTemplate))用Y量的点填充。我想找到低于阈值的所有值,我觉得我的代码不会这样做。现在我只会忽略一个点是否映射到多个其他点。我错过了什么?我只生成了几点,我知道我应该得到更多。
struct Template{
int tempX;
int tempY;
};
struct PrimeTemplate{
double tempX;
double tempY;
};
int matches = 0;
for (int outerLoop = 0; outerLoop < vector1 .size(); outerLoop++)
{
for (int innerLoop = 0; innerLoop < vector2.size(); innerLoop++)
{
double tempEuclidianX = std::pow(abs(vector1 [outerLoop].tempX - vector2[innerLoop].tempX), 2.0);
double tempEuclidianY = std::pow(abs(vector1 [outerLoop].tempY - vector2[innerLoop].tempY), 2.0);
double Euclidian = sqrt(tempEuclidianX + tempEuclidianY);
if (Euclidian <= 5) //less than threshold
{
matches++;
}
}
}
来自文件的示例输入看起来像这样(两个不同的文件,随机数)(不用担心获取数据,它就在那里)
245 21
452 54
124 68
485 78
111 29
97 75
78 113
300 124
411 101
答案 0 :(得分:0)
你的代码有什么问题,你在平方之前使用abs()。 当然,在平方之前根本不需要取绝对值,但是如果你要那么你想要使用fabs,就像abs一样,并返回一个整数。这个额外的四舍五入可能是为什么没有得到正确的答案。
答案 1 :(得分:0)
这是我用来计算一对之间最短距离的方法。它循环遍历文本文件并加载您看到的向量。事实证明,这个问题在我的实现之前是在这个代码之前,这是生物识别点的标准化。
for (int outerLoop = 0; outerLoop < Tvector.size(); outerLoop++)
{
for (int innerLoop = 0; innerLoop < QPrimeVector.size(); innerLoop++)
{
double tempEuclidianX = std::pow((QPrimeVector[innerLoop].tempX - Tvector[outerLoop].tempX), 2.0);
double tempEuclidianY = std::pow((QPrimeVector[innerLoop].tempY - Tvector[outerLoop].tempY), 2.0);
double Euclidian = sqrt(tempEuclidianX + tempEuclidianY);
if (Euclidian <= THRESHOLD) //less than threshold and not taken already
{
if (Euclidian < minEuclidian)
{
minEuclidian = Euclidian;
if (!Tvector[outerLoop].marked)
{
matched = innerLoop;
}
}
}
if (matched != -1)
{
matches++;
}
matched = -1;
minEuclidian = 10;
}
if (matches > masterMatchCount)
{
masterMatchCount = matches;
deltaThetaMaster = deltaTheta;
deltaXMaster = deltaX;
deltaYMaster = deltaY;
}
}
for (int reset = 0; reset < Tvector.size(); reset++)
{
Tvector[reset].marked = false; //reset all the matches
}
QPrimeVector.clear();
}