给一个效率比较高的算法吧
假设存有矩阵的是int mat[][]
1对每行分别计算该行某个元素之后有多少个连续的0(包括它本身),记录进数组int a[][]中
比如mat[0][0]、mat[0][1]、、mat[0][10]都是0,而mat[0][11]是1,那么记录a[0][0]=11,a[0][1]=10,,a[0][10]=1,a[0][11]=0
这个步骤用循环次数为mn的双层循环即可实现
2枚举所求矩阵的左上角坐标,然后枚举这个矩阵的行数,利用之前记录的a数组可知这个矩阵的列数,如此得到一个左上角坐标和行数已知的尽可能大的全0子矩阵,然后判断这个子矩阵大小是否最大的,是则记录
代码大致如下
for (i=0;i<m;i++)//枚举左上角所在的行
for (j=0;j<n;j++)//枚举左上角所在的列
{
int c=a[i][j];//变量c用于记录当前所得子矩阵的列数
for (r=1;i+r<=n;r++)//枚举子矩阵的行数
{
if (a[i+r-1][j]<c) c=a[i+r-1][j];//判断是否行数增加后子矩阵的列数会减少
if (rc>S) ;//变量S记录当前求得的最大全0矩阵的大小
}
}
Print Tab(5 j); Mat(i, j)这里最后直接加个;就OK了。
Sum = Sum + Mat(i, j)这里的Mat(i, j)改成Mat(3, j)就行了,因为是要求第三行的元素之和,所以改成3。
此是最佳答案,望采纳。
这个代码是偏matlab风格的,意思就是以矩阵为基础来进行的计算或者比较,你这个时候应该把UCHAR_MAX看成是大小与oROI一样,每个元素都为UCHAR_MAX的矩阵,然后把每个UCHAR_MAX中和oROI中的对应位置上的元素相比较,得到的结果仍然还是一个大小与oROI一样的矩阵,这个时候它的元素就应该是0或者1了,那么countNonZero就是计算这个矩阵中1的个数。所以能用int a = (oROI<UCHAR_MAX)&(oROI>0)类型是不匹配的
设矩阵元素为mat[i][j],则主对角线上元素下标满足i==j
C语言代码如下:
#include<stdioh>
int main() {
int mat[4][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};
int i, j;
printf("主对角线上行列下标都为奇数的元素为:");
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (i == j && i % 2 == 1)
printf("%d ", mat[i][j]);
}
}
printf("\n");
return 0;
}
运行结果如下:
在对SynthText的gtmat中的wordBB中的数据进行处理时,我遇到一个问题:确保每一个值都在[0,1]内。如果用循环,就没有体现出python的逼格。于是找了三种方法(仅展示使每一个元素都小于1的方法)
以上就是关于一个M*N的矩阵,元素取值1或0,问如何找到最大的矩阵,其所有的元素都为0全部的内容,包括:一个M*N的矩阵,元素取值1或0,问如何找到最大的矩阵,其所有的元素都为0、vb 知识。,程序改错。 将M行M列二维数组Mat 中的元素按照矩阵的形式输出,并计算第三行个元素之和、关于opencv mat类型和countNonZero函数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)