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

时间:2017-03-14 09:21:31

标签: algorithm matrix

我想在N*N矩阵中找到所有局部最大值,其约束条件是每找到2个峰值必须至少离开M个单元格(在两个方向上)。换句话说,对于非常高峰P,如果峰值低于P,则忽略P周围(2M+1)*(2M+1)子矩阵内的局部最大值。

以局部最大值表示(2M+1)*(2M+1)子矩阵中以元素为中心的最大元素。

对于天真的方法,复杂性为O(N*N*M*M)。有没有一种有效的算法来实现这一目标?

这是N = 5且M = 1(3 * 3网格)的样本矩阵:

enter image description here

2 个答案:

答案 0 :(得分:2)

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

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

有线性卷积算子(以及它们背后的大量理论),它们产生x和y方向的偏导数(例如SobelPrewitt)和二阶导数。

已经有blob detection的偶数算法,这似乎与您的任务相关(例如Laplacian of Gaussian)。

如果您正在寻找速度,您可能想看看您是否可以从linear separability,预过滤内核(associativity)或DFT中受益。还要注意,这种任务通常会大大有利于并行化。看看你是否可以利用多个核心,GPU或FPGA来提升性能。

答案 1 :(得分:1)

我会采用一种填充方法(实际上并不是洪水填充,但是当我想出它时,洪水填充就是我想到的):

  1. 找到所有最小值。将它们放入已排序的列表/堆栈中。
  2. 从列表中选择(并删除)第一项(最低最低值)。
  3. 如果元素标记为已使用,请丢弃该项目并转到2.
  4. 在项目周围标记子矩阵内的所有元素。
  5. 转到2.
  6. 当列表为空时,algortihm结束。

    总费用:O(N * N + p * log p + p * M * M)其中p是最小值。