【问题标题】:Given a matrix of size nxm, how can we calculate the sum of all possible square matrices of size (L)?给定一个大小为 nxm 的矩阵,我们如何计算所有可能的大小为 (L) 的方阵的总和?
【发布时间】:2021-04-06 03:50:07
【问题描述】:

给定这个 3x3(nxm) 矩阵,我如何遍历并获得所有可能的平方子矩阵的总和,即(在这种特殊情况下为 1x1,2x2)

2 2 3
3 4 5
4 5 5

我知道这里, 每个元素都是一个单独的子矩阵(1x1), 其余方子矩阵如下:

2 2
3 4
2 3
4 5
3 4
4 5
4 5
5 5

我尝试了我的方法并多次失败,主要原因是我对编程中的矩阵感到困惑。 我的方法: 这里,'l' 是方子矩阵的大小,'n' 是主矩阵的行大小,'m' 是主矩阵的列大小,

for (i=0; i<n-l; i++){
            for (j=1; j<n-i+1; j++){
                sum = 0;
                for (p=i; p<l+i; p++){
                    for (q=1; q<l+j+1; q++){
                        sum += a[p][q];
                    }
                }
               cout << sum << endl;
            }
            l++;
        }

【问题讨论】:

    标签: c++ matrix multidimensional-array


    【解决方案1】:

    这是你的情况的解决方案。

    for(int i=0; i+(l-1)<n; i++){
        for(int j=0; j+(l-1)<m; j++){
            int sum = 0;
            for(int a=0; a<l; a++){
                for(int b=0; b<l; b++){
                    sum += matrix[i+a][j+b];
                }
            }
            cout << sum << endl;
        }
    }
    

    或者你可以尝试在Tio.run上运行完整代码

    【讨论】:

    • "非常感谢" 代码很通俗易懂,现在调试完完全明白了..
    • 太好了,现在尝试一个 10000 x 10000 矩阵和 5000 x 5000 子矩阵。你知道人类发明了乘法来代替一遍又一遍地重复加法吗?
    • @n.'pronouns'm。我看不到矩阵中重复乘法和加法的关系。也许你可以和我们分享一下。我只是想帮助解决这个简单的案例,尤其是关于矩阵索引。
    • 您一遍又一遍地添加相同的矩阵元素。对于远离输入矩阵边缘的元素,您将每个元素添加 L^2 次。您可以将其替换为添加 a[i][j]*L*L。对于靠近边缘的元素,该因子会更小。通过画一些正方形很容易弄清楚。
    【解决方案2】:

    我重写了您的代码以使其正确,还做了完整的示例:

    Try it online!

    #include <vector>
    #include <algorithm>
    #include <iostream>
    
    int main() {
        std::vector<std::vector<int>> a = {{2, 2, 3}, {3, 4, 5}, {4, 5, 5}};
        size_t n = a.size(), m = a.size() > 0 ? a[0].size() : 0;
        
        for (size_t l = 1; l <= std::min(n, m); ++l)
            for (size_t i = 0; i < n - l + 1; ++i)
                for (size_t j = 0; j < m - l + 1; ++j) {
                    int sum = 0;
                    for (size_t p = i; p < i + l; ++p)
                        for (size_t q = j; q < j + l; ++q)
                            sum += a[p][q];
                    std::cout << l << ", " << i << ", " << j << ": " << sum << std::endl;
                }
    }
    

    输入:

    2 2 3
    3 4 5
    4 5 5
    

    输出:

    1, 0, 0: 2
    1, 0, 1: 2
    1, 0, 2: 3
    1, 1, 0: 3
    1, 1, 1: 4
    1, 1, 2: 5
    1, 2, 0: 4
    1, 2, 1: 5
    1, 2, 2: 5
    2, 0, 0: 11
    2, 0, 1: 14
    2, 1, 0: 16
    2, 1, 1: 19
    3, 0, 0: 33
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      相关资源
      最近更新 更多