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

如果两个矩阵的所有元素都相同,则它们是相同的。所以下面的伪代码将小矩阵与大矩阵中的一个块进行比较:

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 回答