Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 求双变量函数的梯度_Java_Math_Apache Commons Math - Fatal编程技术网

Java 求双变量函数的梯度

Java 求双变量函数的梯度,java,math,apache-commons-math,Java,Math,Apache Commons Math,我正在做一些视频处理,对于每一帧,我需要得到一个双变量函数的梯度。 该函数表示为二维双精度数组。其中,域是行和列索引,范围是相应索引值的双倍值。或者更简单地说,函数f是为双[]矩阵定义的,如下所示: fx,y=矩阵[x][y] 我正在尝试使用Apache Commons数学库: SmoothingPolynomialBicubicSplineInterpolator iterpolator = new SmoothingPolynomialBicubicSplineInterpolator();

我正在做一些视频处理,对于每一帧,我需要得到一个双变量函数的梯度。 该函数表示为二维双精度数组。其中,域是行和列索引,范围是相应索引值的双倍值。或者更简单地说,函数f是为双[]矩阵定义的,如下所示:

fx,y=矩阵[x][y]

我正在尝试使用Apache Commons数学库:

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的排序数组 Y在列维度0,1,…,矩阵上相同。getColumnDimension-1 问题是,对于150X80大小的典型矩阵,运行时间长达1.4秒,这与我的需求完全无关。因此,作为该库的新手用户,以及一般的编程数值分析,我想知道:

我做错什么了吗? 有没有其他更快的方法可以帮助我完成这项任务? 是否有另一个开源库提供解决方案,最好是maven友好的?
数字差异化本身就是一个完整的主题,一个简单的谷歌应该提供足够的材料让你使用wiki就足够了。你的问题有一些参数我不知道,所以我只能在这里泛泛地说,但是有一些直接的方法可以确定给定点的梯度,也就是说,不需要插值的方法。有关从简单的fx+1-fx(其中h=1)到更高阶的公式,请参见维基百科。然后,计算偏导数是一个简单的ONM循环,里面有一个超级简单的公式,不需要插值

具体情况可能会变得棘手:

需要减少边缘的高阶公式,或 完全丢弃。 您的精确速度要求可能会使更复杂的公式变得无用,具体取决于平台,有时高阶公式的查找时间会使它们太慢;同样,这取决于缓存等。。这很容易测试,公式简单;对它们进行编码并进行基准测试。 具体的实现也取决于您的错误需求。该理论提供了误差范围,因此将在您需要的公式中发挥作用;但同样,速度要求也是一个权衡。如果你知道你将要处理的矩阵类型的细节,如果你知道这样的事情的话,那么这个值实际上可以降低。
如果您有现有的卷积工具,那么实现可能会更容易,甚至更快,因为这种方法实际上只是矩阵注释的卷积;从技术上讲,它被称为互相关。

1您确定每个点都需要梯度吗?不管你做什么,那都是omegaNM。2你为什么要插值?你有没有尝试过一种更直接的方法来计算构成梯度的偏导数?3你有没有分析过这1.4秒的大部分时间都花在了什么地方。我确实需要所有这些要点。2.我插值是为了得到commons math API的函数表示,而不是因为我真的需要。3.时间进入插值命令,但在我看来,为了使用commons数学函数,我必须使用它。我想听听更直接的方法。