确定C ++中给定NxN矩阵的所有平方子矩阵

时间:2016-06-15 16:52:03

标签: c++ matrix code-generation submatrix

通过NxN方阵,我想通过删除相同数量的行和列来确定所有可能的平方子矩阵。

为了确定所有可能的2x2矩阵,我需要循环4次。类似地,对于3x3矩阵,我需要循环6次,依此类推。有没有办法用C ++生成代码,以便动态生成循环代码?我已经检查了一些与C ++代码生成相关的答案,但是大多数都使用了python。我不知道python。那么,是否可以编写代码来生成C ++代码?

1 个答案:

答案 0 :(得分:1)

如果我得到你所说的,你的意思是你需要M个循环来选择M行,M个M循环用于M x M子矩阵,1&lt; = M <= N

您不需要2 * M循环来执行此操作。无需动态生成具有越来越多循环的代码!

基本上,您需要“组合”i_ {1},i_ {2},...,i_ {M}和j_ {1},j_ {2},...,j_ {的所有可能组合M}使得1&lt; = i_ {1}&lt; i_ {2}&lt; ......&lt; i_ {M}&lt; = N(并且类似于j)

如果您拥有所有此类i_ {1},...,i_ {M}的所有可能组合,那么您基本上已完成。

比如说你正在使用10 x 10矩阵,你需要4 x 4个子矩阵。

假设您最初选择了行{1,2,3,4}和{1,2,3,4}列。接下来选择列{1,2,3,5}。接下来是{1,2,3,6},依此类推,直到{1,2,3,10}。接下来选择{1,2,4,5},下一个{1,2,4,6},依此类推,直到达到{7,8,9,10}。这是您可以在序列中生成所有(“10选择4”)组合的一种方式。

继续,编写一个生成此序列的函数,您就完成了。它可以作为输入M,N,当前组合(作为M值的数组)并返回下一个组合。

您需要调用此序列来选择下一行和下一列。

我放松了一点。如果事情不明确,我可以编辑以更新我的答案。

编辑:

我将假设循环索引从0开始(C ++方式!)。为了进一步详细说明,给定一个组合作为输入,可以通过将组合视为各种“计数器”(除了没有数字重复)来生成下一个组合。

免责声明:我没有运行或测试下面的代码片段。但是你可以看到这个想法。另外,我不再使用C ++了。如果有任何错误,请耐心等待。

// Requires M <= N as input, (N as in N x N matrix)
void nextCombination( int *currentCombination, int M, int N ) {
    int *arr = currentCombination;
    for( int i = M - 1; i >= 0; i-- ) {
        if( arr[i] < N - M + i ) {
            arr[i]++;
            for( i = i + 1, i < M; i++ ) {
                arr[i] = arr[i - 1] + 1;
            }
            break;
        }
    }

}

// Write code for Initialization: arr = [0, 1, 2, 3]
nextCombination( arr, 4, 10 );
// arr = [0, 1, 2, 4]

// You can check if the last combination has been reached by checking if arr[0] == N - M + 1. Please incorporate that into the function if you wish.

编辑:

  

实际上我想检查所有可能的子矩阵的奇点。我的方法是计算所有子矩阵,然后找到它们的决定因素。在计算2x2矩阵的行列式之后,我将存储它们并在计算3x3矩阵的行列式时使用。等等。你能建议我一个更好的方法吗?我没有空间和时间的限制。 - 醋

使用您建议的直接方法是基于构成子矩阵的行 - 列组合来索引决定因素。首先在哈希映射中存储1 x 1子矩阵的存储决定因素(基本上是条目本身)。

因此,对于10 x 10的情况,哈希映射看起来像这样      { "0-0" : arr_{0, 0}, "0-1" : arr_{0, 1}, . . . "1-0" : arr_{1, 0}, "1-1" : arr_{1, 1}, . . . "9-9" : arr_{9, 9} }

当M = 2时,您可以使用通常的公式(已初始化1 x 1子矩阵的行列式)计算行列式,然后添加到哈希映射。 2 x 2子矩阵的哈希字符串看起来像1:3-2:8,其中原始10 x 10矩阵中的行索引为1,3,列索引为2,8。通常,对于mxm子矩阵,行列式可以通过查找所有必要的(已经)计算的(m - 1)x(m - 1)行列式来确定 - 这是一个简单的哈希映射查找。再次,将计算结果添加到哈希映射计算后。

当然,您可能需要稍微修改nextCombination()函数 - 它当前假设行和列索引从0到N - 1运行。

另一方面,由于要从1 x 1开始处理所有子矩阵,因此不需要像nextCombination()函数那样的东西。给定2 x 2矩阵,您只需再选择一行和一列以形成3 x 3矩阵。因此,您需要选择一个行索引(这不是构成2 x 2子矩阵的行索引的一部分)和类似的一个列索引。但是对于每个2 x 2矩阵执行此操作将生成重复的3 x 3矩阵 - 您需要考虑某种方法来消除重复。避免重复的一种方法是仅选择索引大于子矩阵中最高行/列索引的行/列。

我再次松散地定义了这个想法。你可以建立它。