我正在實施二維Lanczos插值算法,我剛剛完成。作爲現代的紳士,在我向公衆發佈此方法之前,我想單元測試它。然而,與一般方法相比,我總是發現單元測試數學方法非常困難。測試數學導向方法的正確性
正如有些人所知,lanczos插值的結果取決於多種事物,包括您要插值的值和目標值。這樣就很難測試「已知角落案例」等,就像你使用常規方法一樣。
我想過的一件事是採取Lanczos插值的另一個實現,然後採取一些隨機值並計算它們,並查看結果是否相同,但這使我依賴於另一個庫的正確性。
任何人有任何提示或可以引用我的任何文學?
編輯:下面的代碼:
private val Radius = 3 // Taken from GDAL
private def lanczos(v: Double) =
if (v == 0) 1
else if (math.abs(v) > 0 && math.abs(v) < Radius)
(Radius * math.sin(math.Pi * v) *
math.sin(math.Pi * v/Radius)/math.pow(math.Pi * v, 2))
else 0
override def cubicInterpolation(
p: Array[Array[Double]],
x: Double,
y: Double): Double = {
val xs = x.toInt - Radius + 1
val xe = x.toInt + Radius
val ys = y.toInt - Radius + 1
val ye = y.toInt + Radius
var accum = 0.0
for (i <- xs to xe; j <- ys to ye) {
accum += p(i)(j) * lanczos(y - j) * lanczos(x - i)
}
accum
}
感謝,
約翰
無論是否需要外部庫,您總是依賴於測試的正確性。 – 2014-11-01 21:32:33
這是真的。但是如果您想用多個輸入參數測試一個數學方法,而您找不到任何清晰的*角落案例*,我該如何決定測試參數?我如何有效地測試它們? – 2014-11-01 21:36:54
嗯,我想單元測試的目的是(a)文檔,和(b)幫助你確定你的代碼是否正確,(c)在未來維護期間防止迴歸。你的代碼有哪些失敗模式? – 2014-11-01 21:38:37