我正在进行一些视频处理,对于每个帧我需要获得双变量函数的渐变。
该函数表示为二维的双精度数组。其中domain是行和列索引,范围是相应索引值的double值。或者更简单地说,函数f
是为double[][] matrix
定义的:
f(x,y)=matrix[x][y]
我正在尝试使用Apache Commons Math库:
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);
}
}
(0,1,...,matrix.getRowDimension() - 1)
(0,1,...,matrix.getColumnDimension() - 1)
问题在于,对于大小为150X80
的典型矩阵,运行时需要1.4
秒,这使得它与我的需求完全无关。所以,作为这个库的新手用户,以及一般的程序化数值分析,我想知道:
答案 0 :(得分:0)
数值差异本身就是一个完整的主题,一个简单的谷歌应该为你提供足够的材料(只需维基可能就足够了)。有一些我无法知道的问题参数,所以我只能在这里大致说一下,但是有一些直接的方法可以确定给定点的梯度,即不需要插值的梯度。有关公式,请参阅维基百科(范围从简单的f(x+1)-f(x)
,其中h=1
到更高阶的公式。然后计算偏导数是一个简单的O(NM)
循环,里面有一个简单的公式(不需要插值)。
具体细节可以得到坚定不移:
如果你有现有的卷积工具,实现可以更容易(也许更快),因为这种方法实际上只是矩阵的卷积(注意;技术上它称为互相关)。