2014-10-31 134 views
0

我有2个向量,其中一个(结构体(点)的vector1)填充了X点数量,另一个(结构体的vector2(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 
+1

你*知道*你应该越来越多?基于什么?你有样品输入和预期的输出,显示你的代码没有做你想要的吗? – 2014-10-31 00:32:10

+0

嗨格雷格,我有样品输出。这是点匹配。这也在2循环内运行。所以忽略这些匹配从不重置。 – snurby77 2014-10-31 00:33:50

+3

与您的问题无关,但如果您关心的是性能,您希望跳过'sqrt'并与距离平方比较,就像'if(deltaX * deltaX + deltaY * deltaY <= 25)匹配++; '。 – 2014-10-31 00:39:00

回答

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(); 
    } 
0

什么是你的代码错误是,在平方之前使用abs()。 当然,在平方之前没有必要取绝对值,但如果你打算那么你想要使用晶圆厂,就像abs取得并返回一个整数。这额外的四舍五入可能是为什么没有得到正确的答案。

+1

实际上并不清楚这是否为真。如果包含[''](http://en.cppreference.com/w/cpp/numeric/math/fabs),则会出现浮点重载。如果只包含[''](http://en.cppreference.com/w/cpp/numeric/math/abs),那么我们只有整数过载。 – 2014-10-31 14:57:43

+0

嗨,大家,原来我的代码之前有一个问题,当它翻译所有的点。现在我想,可爱的负面信号很重要。但包括,我很欣赏你们的意见! – snurby77 2014-10-31 23:43:05

+0

@ snurby77,你会介意发表你刚刚写下的答案,然后接受它吗?这样,访问这个问题并遇到同样问题的其他人将能够直接跳到它。 – 2015-01-13 18:20:09