考虑到我有一个像这样的矩阵(mXn):
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0
0 | 1 | 1 | 2 | 1 | 1 | 0 | 0 | 0
0 | 1 | 4 | 9 | 4 | 1 | 0 | 0 | 0
1 | 2 | 9 | # | 9 | 2 | 1 | 0 | 0
0 | 1 | 4 | 9 | 4 | 1 | 0 | 0 | 0
0 | 1 | 1 | 2 | 1 | 1 | 0 | 0 | 0
0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0
Run Code Online (Sandbox Code Playgroud)
哪里有#
随机设置的点.靠近它的值以波的形式受到影响.距离该点越近,值越接近10.
#
假设它将在更大的尺度上使用,哪种算法可以很好地发现?
编辑:我更感兴趣的是如何找到第一个非零数字,而不是找到#
它自己,这是目的,但不是真正的问题.想象一个充满零的巨大矩阵和#
隐藏的某个地方.该算法的详尽部分是找到第一个非零值.
找到第一个非零值仅在信号对称且不包含旋转时才有效.考虑从Internet借来的以下示例(零=蓝色,最大=红色),注意第一个非零值位于右上角:
http://www.mathworks.com/matlabcentral/fileexchange/screenshots/1134/original.jpg
您可能想要了解渐变下降.通用算法是为连续函数定义的(您的是离散的),但您仍然可以使用它.
它基本上在矩阵的某处初始化,在该点寻找渐变并向该方向移动,然后重复直到它收敛.您可以通过随机采样来初始化它(选择一个随机单元格直到达到非零值,您可以预期这比遍历更快并且平均找到非零值,自然取决于您的矩阵和信号大小)
一些属性:
限制:
这对你来说可能是一种矫枉过正,这可能是合适的,我不知道,你没有提供更多细节,但看看它可能是值得的.请注意,有一整套算法,有许多变化和优化.先看一下维基百科的文章;)