類似の行列をすばやく特定できるように、ある種のアルゴリズムを探しています。行列は永続的に保存されないため、各行列を簡単に保存できる値にマッピングする方法が必要です。その後、同じマッピングを将来使用できます。行列を作成し、計算値とすばやく比較します。
私が同様の行列を定義する方法は、垂直線、水平線、主対角線、および副対角線によってミラーリングされたときにそれらが同一であるかどうかということです。
例えば
1 2 3
4 5 6
7 8 9
以下のすべての行列と同じものとして識別されます
3 2 1
6 5 4
9 8 7
-----
7 8 9
4 5 6
1 2 3
-----
1 4 7
2 5 8
3 6 9
-----
9 6 3
8 5 2
7 4 1
私はこの問題に何日も悩まされてきました。行列は永続的に保存されないため、直接比較することはできません。誰かが私を正しい方向に向けることができますか?ありがとう
8つの対称行列のそれぞれのハッシュ値を計算し、それらの最小のものだけを保持します-これでうまくいくはずです。これにより、同値類の各行列に同じ値が得られます。
1つのハッシュ値を格納する代わりに、5つのハッシュ値を格納します
M0= 1 2 3
4 5 6
7 8 9
以下のすべての行列と同じものとして識別されます
M1からM4を作成する操作は以下のとおりです。
M1= 3 2 1 (vertical mirror M1:= VM(M0) )
6 5 4
9 8 7
-----
M2= 7 8 9 (horizontal mirror M2:= HM(M0) )
4 5 6
1 2 3
-----
M3= 1 4 7 (transpose M3= T(M0) )
2 5 8
3 6 9
-----
M4= 9 6 3 (M4= VM(T(MO) )
8 5 2
7 4 1
すべての同等の行列(元の行列に加えて合計7つ)は、VM()、HM()、およびT()の組み合わせとして記述できます。
したがって、行列に8つのハッシュ値を保持している場合は、ハッシュ値を比較できます。
行列M0のハッシュ値を計算するには(この場合、数値は数字のみです)、それを文字列 "123456789"に変換し、ハッシュ関数を使用できます。
これがお役に立てば幸いです。
数学を使用して類似性を識別することができます。条件としての類似性のために、最初の行列の後に与えた各例を想定しました。
あなたの例のマトリックスの場合-
Let Ux = 1 2 3
4 5 6
7 8 9
Let Ix = 0 0 1
0 1 0
1 0 0
Ux
とIx
の行列乗算を実行すると、次のようになります。
Ux . Ix = 3 2 1
6 5 4
9 8 7
これが条件1です。
もしあなたがそうするなら
Ix . Ux = 7 8 9
4 5 6
1 2 3
これが条件2です。したがって、Ixを使用して、定義した2つの類似条件を特定できます。
条件3の場合、それはTranspose(Ux)です。
条件4の場合、Trasnpose(Ix。Ux。Ix)です。
お役に立てれば!
封筒裏の計算に基づいて、次のアプローチをお勧めします。個々の行、各列、各対角線、および4つのコーナーを合計すると、9つの数値のセットが得られます。ソート済み。このソートされた番号のリストは、リストしたすべてのケースとそのローテーションで同一ですが、一意である必要があります(つまり、他の配置と衝突しないようにします)。この分析が真の場合、その9つの数値リストの 簡単なハッシュ関数 を保存値として使用できます。
(もちろん、ローテーションが類似性分類から除外されている場合は、図面に戻る必要があります。)