You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

修复说明

  1. 新增col_idx变量,专门追踪余子式矩阵的当前列位置,确保每次填充元素后索引正确递增,彻底解决负索引和错位问题
  2. 将minor矩阵的声明放到外层循环内部,每次循环都创建新的矩阵,避免上一次循环的旧数据干扰结果
  3. 调整了打印语句的格式,让输出更简洁规范

内容的提问来源于stack exchange,提问作者Felipe Miklikowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:37:28