二维数组实现矩阵运算需关注内存行优先布局、行列维度约束校验、结果矩阵初始化清零及索引映射关系;加法要求行列一致,乘法要求左列等于右行,转置需按新维度分配或环状交换。

用二维数组实现矩阵运算,核心在于理解其内存布局、访问规律和运算约束。它不依赖外部库,靠原生C++语法就能完成加法、乘法、转置等操作,但细节处理稍有偏差就容易出错。
内存布局决定遍历效率
二维数组在内存中是连续的行优先存储。比如 int mat[3][4] 实际排布为:
mat[0][0] mat[0][1] mat[0][2] mat[0][3] mat[1][0] mat[1][1] …
这意味着按行访问(外层i循环行,内层j循环列)能获得最佳缓存命中率。
按列遍历虽逻辑可行,但会频繁跳转内存地址,性能明显下降。
加法与乘法的维度约束必须显式校验
矩阵加法要求两个矩阵行列数完全一致;乘法则要求左矩阵列数等于右矩阵行数。这些条件不能仅靠注释说明,应在运行时检查:
- 加法前比对 rows1 == rows2 && cols1 == cols2
- 乘法前验证 cols1 == rows2,否则结果矩阵维度无法确定
- 若不满足,应提前返回错误或终止,避免越界写入或静默错误
结果矩阵需独立分配且初始化清零
尤其乘法中,每个结果元素是累加得到的,未初始化会导致脏值参与计算:
- 静态数组可用 int result[ROWS][COLS] = {} 或循环赋0
- 动态分配时,用 memset(result, 0, sizeof(result)) 更安全
- 切忌复用输入数组作为输出——除非明确支持原地操作,否则极易覆盖未读取数据
对角线与转置操作依赖索引映射关系
方阵主对角线满足 i == j,副对角线满足 i + j == n - 1(下标从0开始);转置则是将 mat[i][j] 映射到 new_mat[j][i]:
- 非方阵转置后维度互换:m×n 变为 n×m,新数组必须按新尺寸申请
- 就地转置(in-place)仅适用于方阵,且需分层环状交换,避免覆盖
- 副对角线求和推荐单循环 sum += mat[i][n-1-i],比双重循环更高效











