2014-10-31 148 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