C++ 给定一个大小为nxm的矩阵,我们如何计算所有可能的大小为(L)的平方矩阵之和?
给定这个3x3(nxm)矩阵,我如何遍历并得到所有可能的平方子矩阵的和,即(在这个特殊情况下为1x1,2x2) 我知道这里, 每个元素都是一个单独的子矩阵(1x1), 其余方子矩阵如下:C++ 给定一个大小为nxm的矩阵,我们如何计算所有可能的大小为(L)的平方矩阵之和?,c++,matrix,multidimensional-array,C++,Matrix,Multidimensional Array,给定这个3x3(nxm)矩阵,我如何遍历并得到所有可能的平方子矩阵的和,即(在这个特殊情况下为1x1,2x2) 我知道这里, 每个元素都是一个单独的子矩阵(1x1), 其余方子矩阵如下: 2 2 3 4 我尝试过我的方法,但失败了很多次,主要原因是我在编程中对矩阵感到困惑。 我的做法: 这里,“l”是方子矩阵的大小,“n”是主矩阵行的大小,“m”是主矩阵列的大小 for (i=0; i<n-l; i++){ for (j=1; j<n-i+1; j++){
2 2
3 4
我尝试过我的方法,但失败了很多次,主要原因是我在编程中对矩阵感到困惑。
我的做法:
这里,“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++;
}
for(i=0;i我重写了您的代码以使其正确,并给出了完整示例:
输出:
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
我重写了您的代码以使其正确,并给出了完整示例:
输出:
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
这就是你案件的解决办法
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;
}
}
for(inti=0;i+(l-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;
}
}
for(int i=0;i+(l-1)“谢谢”帮助了…“谢谢”帮助了…“非常感谢”代码很容易理解,现在我在调试后完全理解了。太好了,现在试试10000乘10000的矩阵和5000乘5000的子矩阵。你知道人类发明乘法是为了一次又一次地替换同一事物的重复加法吗?不客气@Abhilash@n.代词m。我看不出关于重复的关系我只是想帮助解决这个简单的问题,特别是关于矩阵索引的问题。你在一次又一次地添加相同的矩阵元素。对于远离输入矩阵边缘的元素,你可以将每个元素添加L^2次。你可以用一次添加o来代替fa[i][j]*L*L
。对于靠近边缘的元素,因子会更小。通过画一些正方形很容易计算出来。“非常感谢”代码很容易理解,现在我在调试后完全理解了。太好了,现在试试10000乘10000的矩阵和5000乘5000的子矩阵。你知道人类发明乘法是为了一次又一次地替换同一事物的重复加法吗?不客气@Abhilash@n.代词m。我看不出关于重复的关系我只是想帮助解决这个简单的问题,特别是关于矩阵索引的问题。你在一次又一次地添加相同的矩阵元素。对于远离输入矩阵边缘的元素,你可以将每个元素添加L^2次。你可以用一次添加o来代替fa[i][j]*L*L
。对于靠近边缘的元素,因子会更小。通过绘制一些正方形很容易计算出来。
#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
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;
}
}