代码之家  ›  专栏  ›  技术社区  ›  clyfe

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

  •  8
  • clyfe  · 技术社区  · 14 年前

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

    4 回复  |  直到 14 年前
        1
  •  1
  •   estanford    14 年前

    如果你不反对用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
    

    match运算符的一个很好的特性是,可以使用它来比较任意维度的数组;如果 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的重叠副本,并且只有标记一个像素才能让您看到每个匹配的图块的位置。

        2
  •  0
  •   The Alchemist    14 年前

    我发现了两件事: gawk 和A perl 脚本。

    这是另一个问题,因为字符串正则表达式可以工作(例如, sed , grep )一维字符串上的逐行工作。

    除非你的矩阵是一维的(基本上是向量),否则这些程序和它们使用的算法是行不通的。

    祝你好运!

        3
  •  0
  •   jkff    14 年前

    只需使用aho corasick(time o(matrix size))搜索输入矩阵每行中的模式行。结果应该足够小,以便快速将其加入到最终结果中。

        4
  •  0
  •   Doug    14 年前

    我不认为存在任何类似于1以上维度的正则表达式的东西,但是如果您想匹配一个精确的模式而不是一类模式,那么我建议您阅读卷积(或者更确切地说 Cross-correlation )

    原因是,有许多高度优化的库函数(如IPP)可以比您希望自己实现的速度更快。这种方法也适用于更高的尺寸。

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