Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
Algorithm 寻找矩阵中所有局部极小值(极大值)的有效算法是什么?_Algorithm_Matrix - Fatal编程技术网

Algorithm 寻找矩阵中所有局部极小值(极大值)的有效算法是什么?

Algorithm 寻找矩阵中所有局部极小值(极大值)的有效算法是什么?,algorithm,matrix,Algorithm,Matrix,我想在一个N*N矩阵中找到所有的局部极大值,有一个约束条件,每找到2个峰值必须在两个方向上至少相距M个单元。换句话说,对于发现的峰值P,如果该峰值低于P,则忽略P周围2M+1*2M+1子矩阵内的局部最大值 局部最大值是指以元素为中心的2M+1*2M+1子矩阵中的最大元素 对于naive方法,复杂性为*N*M*M。是否有有效的算法来实现这一点 这是N=5和M=13*3网格的样本矩阵: 我会使用泛洪填充法,它实际上不是泛洪填充,但泛洪填充是我想到它时想到的: 找到所有的极小值。将它们放入一个已排序的

我想在一个N*N矩阵中找到所有的局部极大值,有一个约束条件,每找到2个峰值必须在两个方向上至少相距M个单元。换句话说,对于发现的峰值P,如果该峰值低于P,则忽略P周围2M+1*2M+1子矩阵内的局部最大值

局部最大值是指以元素为中心的2M+1*2M+1子矩阵中的最大元素

对于naive方法,复杂性为*N*M*M。是否有有效的算法来实现这一点

这是N=5和M=13*3网格的样本矩阵:


我会使用泛洪填充法,它实际上不是泛洪填充,但泛洪填充是我想到它时想到的:

找到所有的极小值。将它们放入一个已排序的列表/堆栈中。 从列表中选择并删除第一项。 如果元素标记为已使用,则丢弃该项目并转到2。 将项目周围子矩阵内的所有元素标记为已使用。 去2号。 当列表为空时,算法结束


总成本:在*N+p*log p+p*M*M中,p是最小值的数目。

由于矩阵看起来像图像,使用图像处理技术似乎是自然选择

您可以将峰值局部最大值或最小值定义为局部偏导数零交叉的图像区域。如果你想在这些地方寻找负曲率的最大值,如果你想寻找正曲率的最小值->二阶导数

有可用的线性卷积算子及其背后的大量理论,可以产生x和y方向的偏导数,例如二阶导数

甚至已经有了与您的任务相关的算法,例如


如果您正在寻找速度,您可能想看看是否可以从中受益,过滤内核的预计算,或。还要注意的是,这种任务通常会从并行化中受益匪浅。看看您是否可以利用多个内核、GPU或FPGA来提高性能。

请同时提供数据的详细信息。什么是峰值?有比它的邻居更大的值吗?大于1,或大于0.1或大于0.01?问题似乎未确定。常数矩阵的输出是什么?每个点都是一个局部极大值,但是您的附加约束允许多个解,包括不同基数的解。@JohnColeman很好。高原相邻点的等值存在将是一个复杂问题。澄清这些问题是否存在以及如何处理这些问题对于实施解决方案是必要的。局部最大值定义为宽度为2M+1的周围子矩阵中的最大元素。如果是高原,可以选择任何峰值。所以,是的,有多种可能的解决方案,找到任何一种都是可以的。当你试图找到所有的极小值时,你不会已经看到M*M邻域了吗?不,我想你只是看看最近的邻域。第一次扫描将获得所有局部极小值,而不管是否接近其他极小值。查看最近的邻居而不是M*M邻居是使该算法比简单方法更便宜的关键。我想你需要一些对数项吗?似乎您的解决方案需要维护一个排序的list@PetarPetrovic谢谢增加了排序列表的成本。当p足够小时,这可以工作。但在最坏的情况下,p可以是N*N/2。是的,我的矩阵用于图像处理。但我不是在寻找边缘,索贝尔,普雷维特,我是在寻找相同颜色区域的斑点中心。有什么算法可以做到这一点吗?@NeoWang你可以再看看高斯对数的拉普拉斯函数。它用于斑点检测。我自己还没有使用它,但是我希望您将内核大小调整为您想要查找的blob的大小,然后在输出图像中应用一些阈值。然后可以对候选中心进行某种聚集聚类,并生成一个平均位置作为实际的水滴中心。也许有更好的方法。