我想在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网格)的样本矩阵:
答案 0 :(得分:2)
由于您的矩阵看起来像图像,使用图像处理技术似乎是自然的选择。
您可以将峰值(局部最大值或最小值)定义为两个局部偏导数零交叉的图像区域。如果你想在这些地方寻找最大值,那么如果你正在寻找最小值,请注意正曲率(曲率 - >二阶导数)。
有线性卷积算子(以及它们背后的大量理论),它们产生x和y方向的偏导数(例如Sobel,Prewitt)和二阶导数。
已经有blob detection的偶数算法,这似乎与您的任务相关(例如Laplacian of Gaussian)。
如果您正在寻找速度,您可能想看看您是否可以从linear separability,预过滤内核(associativity)或DFT中受益。还要注意,这种任务通常会大大有利于并行化。看看你是否可以利用多个核心,GPU或FPGA来提升性能。
答案 1 :(得分:1)
我会采用一种填充方法(实际上并不是洪水填充,但是当我想出它时,洪水填充就是我想到的):
当列表为空时,algortihm结束。
总费用:O(N * N + p * log p + p * M * M)其中p是最小值。