是否有一个库(使用任何语言)可以搜索矩阵中的模式,如正则表达式适用于字符串?像矩阵的常规表达式,或任何矩阵模式搜索方法?
答案 0 :(得分:1)
如果你不反对使用J,你可以使用-:
(匹配)运算符找出两个矩阵是否相等。例如:
X =: 4 3 $ i.12
X
0 1 2
3 4 5
6 7 8
9 10 11
Y =: 4 3 $ (1+i.12)
Y
1 2 3
4 5 6
7 8 9
10 11 12
X -: X
1
X -: Y
0
匹配运算符的一个不错的功能是,您可以使用它来比较任意维度的数组;如果A
是3x3x4数组且B
是2x1数组,则A-:B
会返回0
。
要确定矩阵是否是另一个矩阵的子矩阵,您可以使用E:
(区间成员)运算符,如下所示:
X =: 2 2 $ 1 2 4 5
X
1 2
4 5
Y =: 4 3 $ (1+i.12)
Y
1 2 3
4 5 6
7 8 9
10 11 12
X E. Y
1 0 0
0 0 0
0 0 0
0 0 0
结果左上角的1表示Y的等于X的部分具有给定像素作为其左上角。原因是Y中可能存在多个重叠的X副本,只有标记一个像素才能看到每个匹配图块的位置。
答案 1 :(得分:0)
这是一个不同的问题,因为字符串正则表达式(例如sed
,grep
)在一维字符串上逐行工作。
除非你的矩阵是一维的(基本上是向量),否则这些程序及其使用的算法将无法工作。
祝你好运!答案 2 :(得分:0)
只需使用Aho-Corasick(时间O(矩阵大小))在输入矩阵的每一行中搜索模式的行。结果应足够小,以便快速将其加入到最终结果中。
答案 3 :(得分:0)
我不认为存在任何类似于高于1的维度的正则表达式,但是如果你想匹配一个精确的模式而不是一类模式,那么我可能建议你阅读卷积(或者更确切地说{{ 3}})
原因是,有许多高度优化的库函数(例如IPP)可以比你自己希望的更快地完成这项工作。此方法也可以扩展到更高的维度。
此外,这不一定会给你一个“匹配”,而是一个相关图中的“峰值”,如果该峰值等于你正在搜索的模式的平方系数之和,它将对应于匹配对