今天是c语言基础打卡的第35天,主要内容是矩阵的操作,希望大家能够理解呢,我就给大家记一下重点,给点课后题提示0.0。
相关链接:
【第35题】给定两个 a X b 和 c X d 的矩阵 ,求两个矩阵的乘积
🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)⏳全文大约阅读时间: 10min
🎁主要知识点
矩阵乘法
三重循环冲,就是模拟矩阵乘法的规则
void multiplyMatrix(int a, int b, int matA[maxn][maxn], int c, int d, int matB[maxn][maxn], int matRet[maxn][maxn]) {
// assert(b == c);
int i, j, k;
for(i = 0; i < a; ++i) {
for(j = 0; j < d; ++j) {
matRet[i][j] = 0;
for(k = 0; k < b; ++k) {
matRet[i][j] += matA[i][k] * matB[k][j]; // 矩阵乘法的计算规则
}
}
}
}
📓课后习题
面试题 01.08. 零矩阵
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。
解题思路
为了节约空间,可以利用第一行和第一列元素进行标记此行是否清零。为了第一列的元素能确定是否需要清零,可以用一个变量进行标记。
同时,为了防止第一行元素过早被污染,转换元素的时候最后再处理第一行。
void setZeroes(int** matrix, int matrixSize, int* matrixColSize){
int m = matrixSize,n = matrixColSize[0];//记录行列值
bool flag_col0 = false;
for(int i = 0;i < m;++i){ //更新第一行第一列所有元素作为标记
if(!matrix[i][0]) flag_col0 = true; //记录第一列是否有0元素
for(int j = 1;j < n; ++j){ //从第第二行开始更新第一行和第一列元素
if(!matrix[i][j])
matrix[i][0] = matrix[0][j] = 0;
}
}
for(int i = m - 1; i >= 0; --i){//从最最后一行开始更新元素 防止覆盖 因为第一行为标记元素
for(int j = 1;j < n;++j){
if((!matrix[i][0]) || (!matrix[0][j]))//有标记需要变成0
matrix[i][j] = 0;
}
if(flag_col0)
matrix[i][0] = 0;
}
}
📑写在最后
今晚考试0.0,还没看完,慌张,今天的这个题有点难了 ,希望大家能理解,有什么不理解的欢迎留言或者你能找到的联系方式问我也是可以的。