正規表現が文字列に対して機能するように、行列のパターンを検索できるライブラリ(任意の言語)はありますか?行列の通常の表現、または任意の行列パターン検索方法のようなものですか?
4 に答える
-:
J の使用に抵抗がない場合は、 (match) 演算子を使用して 2 つの行列が等しいかどうかを調べることができます。例えば:
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 演算子の優れた機能の 1 つは、これを使用して任意の次元の配列を比較できることです。が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 は、X と等しい Y の部分の左上隅に特定のピクセルがあることを意味します。これは、Y に埋め込まれた X の複数の重複コピーが存在する可能性があり、1 つのピクセルにフラグを立てるだけで、一致するすべてのタイルの位置を確認できるためです。
Aho-Corasick(時間O(行列サイズ))を使用して、入力行列の各行のパターンの行を検索するだけです。結果は、最終結果にすばやく結合できるように十分に小さい必要があります。
1 より大きい次元の正規表現のようなものは存在しないと思いますが、パターンのクラスではなく正確なパターンに一致させたい場合は、畳み込み (または相互相関)を読むことをお勧めします。
その理由は、高度に最適化されたライブラリ関数 (IPP など) が多数あり、これを自分で達成したいよりも高速に実行できるからです。また、この方法はより高い次元にもスケーリングします。
また、これは必ずしも「一致」を与えるとは限りませんが、そのピークが検索しているパターンの二乗係数の合計に等しい場合、一致に対応する相関マップの「ピーク」を提供します。