用于矩阵模式搜索的类似regexp的库

时间:2010-08-19 11:21:01

标签: regex algorithm matrix language-theory

是否有一个库(使用任何语言)可以搜索矩阵中的模式,如正则表达式适用于字符串?像矩阵的常规表达式,或任何矩阵模式搜索方法?

4 个答案:

答案 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)

我发现了两件事:gawkperl脚本。

这是一个不同的问题,因为字符串正则表达式(例如sedgrep)在一维字符串上逐行工作。

除非你的矩阵是一维的(基本上是向量),否则这些程序及其使用的算法将无法工作。

祝你好运!

答案 2 :(得分:0)

只需使用Aho-Corasick(时间O(矩阵大小))在输入矩阵的每一行中搜索模式的行。结果应足够小,以便快速将其加入到最终结果中。

答案 3 :(得分:0)

我不认为存在任何类似于高于1的维度的正则表达式,但是如果你想匹配一个精确的模式而不是一类模式,那么我可能建议你阅读卷积(或者更确切地说{{ 3}})

原因是,有许多高度优化的库函数(例如IPP)可以比你自己希望的更快地完成这项工作。此方法也可以扩展到更高的维度。

此外,这不一定会给你一个“匹配”,而是一个相关图中的“峰值”,如果该峰值等于你正在搜索的模式的平方系数之和,它将对应于匹配对