C语言中如何按顺序无指定索引填充二维数组?拉普拉斯展开余子式问题
拉普拉斯展开中余子式矩阵生成的问题修复
我正在大学学习拉普拉斯展开,写代码时卡在了方阵余子式矩阵的生成环节。所有矩阵都是方阵,余子式矩阵阶数比原矩阵小1(n×n矩阵对应(n-1)×(n-1)余子式)。
我尝试为原矩阵第一行的每个元素生成对应的余子式矩阵(包含所有不在该元素所在行和列的元素),写了这段代码:
float minor[matrixDimension-1][matrixDimension-1]; for (i = 0; i < matrixDimension; i++) { for (j = 1; j < matrixDimension; j++) { for (k = 0; k < matrixDimension; k++) { if(k != i) { minor[j-1][k-1] = matrix[j][k]; } } } printf("minor:\n"); printf("%f, ", minor[0][0]); printf("%f,\n", minor[0][1]); printf("%f, ", minor[1][0]); printf("%f,\n", minor[1][1]); }
测试3×3矩阵{{1,2,3},{4,5,6},{7,8,9}}时,只有第一次循环能得到正确结果,后续循环结果不符合预期:
预期输出:
minor: 5.000000, 6.000000, 8.000000, 9.000000, minor: 4.000000, 6.000000, 7.000000, 9.000000, minor: 4.000000, 5.000000, 7.000000, 8.000000,
实际输出:
minor: 5.000000, 6.000000, 8.000000, 9.000000, minor: 5.000000, 7.000000, 8.000000, 9.000000, minor: 5.000000, 7.000000, 8.000000, 9.000000,
问题根源
代码里的索引计算逻辑错误:
- 当
k < i时,k-1会变成负数,触发数组越界,导致数据填充到错误的位置 - 直接用
k-1作为余子式的列索引,没有考虑被排除列的位置对后续列的影响,索引无法正确连续递增
修复后的代码
#include <stdio.h> int main() { const int matrixDimension = 3; float matrix[matrixDimension][matrixDimension] = {{1,2,3},{4,5,6},{7,8,9}}; for (int i = 0; i < matrixDimension; i++) { // 每次循环重新声明余子式矩阵,避免旧数据残留 float minor[matrixDimension-1][matrixDimension-1]; for (int j = 1; j < matrixDimension; j++) { int col_idx = 0; // 单独维护余子式的列索引 for (int k = 0; k < matrixDimension; k++) { if (k != i) { minor[j-1][col_idx] = matrix[j][k]; col_idx++; // 每填充一个元素,列索引自增 } } } // 打印余子式矩阵 printf("minor:\n"); printf("%f, %f,\n", minor[0][0], minor[0][1]); printf("%f, %f,\n", minor[1][0], minor[1][1]); } return 0; }
修复说明
- 新增
col_idx变量,专门追踪余子式矩阵的当前列位置,确保每次填充元素后索引正确递增,彻底解决负索引和错位问题 - 将
minor矩阵的声明放到外层循环内部,每次循环都创建新的矩阵,避免上一次循环的旧数据干扰结果 - 调整了打印语句的格式,让输出更简洁规范
内容的提问来源于stack exchange,提问作者Felipe Miklikowski
相关产品推荐
相关产品推荐

