0

私は問題があります。私は別の行列(ベクトル)内の行列(ベクトル)を見つけようとするタスクに取り組んでおり、行列のサイズは次のとおりです。

マッシブマトリックス:1024x768スモールマトリックス:36x49

基本的に、私の理論は、大きな行列を小さな行列のサイズのブロックに分割することでした。つまり、小さな行列がどのブロックに存在するかを確認して、ブロックを出力することができました。ただし、均等に分割されるわけではありませんが、小さな行列が実際に大きな行列に存在するかどうかを判断する方法が必要です。

例として、テストデータを使用します。

M1 = 
    0 1 0 0 
    1 1 1 1
    0 0 0 0
    1 0 1 1

M2 = 

    0 1
    1 1

次に、行列を2x2のブロックに分割し、その方法でチェックします。私は小さな行列のみを使用しており、行列は均等に分割できるため、これは単純ですが、上記の問題は理解して理解するのがはるかに複雑です。

基本的に、(1024x768)を(36x49)のブロックサイズに分割できる必要があります。そうすれば、その特定のマトリックスがどこにあるかを確認することができます。私はこのアルゴリズムを使用しています:

// Assume: 
// matrix1ColSize = 768
// matrix2ColSize = 49
const int ROW_BOUNDS = matrix1.size() - matrix2.size();
const int COL_BOUNDS = matrix1ColSize - matrix2ColSize;

bool found = false;

for(int i=0; (i < ROW_BOUNDS); i++)
{
    bool matchFound = false;

    for(int j=0; (j < COL_BOUNDS); j++) {
        // logic here
    }
    cout << endl;
}

誰かアドバイスをいただけますか?これは今私を本当に苛立たせています:(!

4

1 に答える 1

0

すべての要素が同じ場合、2 つの行列は同じです。したがって、次の疑似コードは、小さな行列を大きな行列のブロックと比較します。

Initialize result to "true"
For each position in the small matrix
    Read the value from the large matrix; call it x1
    Read the value from the small matrix; call it x2
    If x1 is not equal to x2, set result to "false"
    (Optional) If x1 is not equal to x2, stop looking at other positions
Here, use the result

このロジックは 2 つのネストされたループ内にあるため、そこには 4 つのネストされたループがあります。混乱するのが怖い場合は、実装を関数内に配置してください。ネストされた 4 つのループを使用する場合は、頑張ってください。

C++ の場合:

bool is_equal = true;
for (int y = 0; y < 49; ++y)
{
    for (int x = 0; x < 36; ++x)
    {
        if (matrix1.at(j + x, i + y) != matrix2.at(x, y))
        {
            is_equal = false;
            goto DONE; // optional
        }
    }
}
DONE:;

編集: このコードは、行列にカスタム クラスを使用することを前提としています。コードをもう一度見てみると、おそらくベクトルのベクトル ( std::vector<std::vector<int>>)を使用していることがわかるので、matrix2[y][x]代わりにmatrix2.at(x, y).

于 2012-04-19T17:45:06.773 に答える