我正在做一些視頻處理,我需要獲得每個幀的雙變量函數的梯度。 該函數被表示爲雙精度的二維數組。其中域是行和列索引,範圍是相應索引值的雙倍值。或者更簡單地說,功能f
爲double[][] matrix
這樣定義:獲取雙變量函數的梯度
f(x,y)=matrix[x][y]
我試圖使用它在Apache共享數學庫:
SmoothingPolynomialBicubicSplineInterpolator iterpolator = new SmoothingPolynomialBicubicSplineInterpolator();
BicubicSplineInterpolatingFunction f = iterpolator.interpolate(xs, ys, matrix.getData());
for (int i = 0; i < ans.length; i++) {
for (int j = 0; j < ans[0].length; j++) {
ans[i][j] = f.partialDerivativeY(i, j);
}
}
- 與XS,作爲x索引的排序陣列
(0,1,...,matrix.getRowDimension() - 1)
- ys在列維上相同
(0,1,...,matrix.getColumnDimension() - 1)
問題是,對於大小爲150X80
的典型矩陣,運行需要多達1.4
秒,這使得它與我的需求完全無關。所以,作爲這個庫的新手用戶,以及一般的編程數值分析,我想知道:
- 我做錯了什麼?
- 是否有另一種更快的方式可以完成此任務?
- 是否有另一個提供解決方案的開源庫(最好是maven友好的)?
1)你確定你需要每個點的漸變嗎?無論你做什麼,都是歐米茄(NM)。 2)爲什麼插值?你有沒有試過更直接的方法來計算偏導數(組成梯度)? 3)你有沒有介紹1.4秒鐘內大部分時間? – davin
1.我確實需要所有這些要點。 2.我正在插入以獲取公共數學API的函數表示形式,而不是因爲真的需要我。 3.時間進入插值命令,但正如我所看到的,我必須使用它來使用公共數學函數。我想聽聽更直接的方法。 – sagioto