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

二维动态数组赋值错误:线性方程组求解函数的循环问题

问题出在double** aa = a;这行代码——它根本没创建新矩阵,只是让aa和a指向同一个二维数组的指针。第一次循环修改了第0列后,原矩阵a已经被改动,后续循环用的都是被修改后的矩阵,自然所有列最后都变成了b。

给你两种解决方案,都能沿用现有代码结构:

方案1:每次循环创建新矩阵并复制原数据

这种方法直白易懂,每次循环都生成一个原矩阵的副本,修改副本的第k列后计算行列式,避免影响原矩阵:

double* solution(double** a, double* b, int n, double detA)
{
    double* sol = (double*)malloc(n * sizeof(double));
    for (int k = 0; k < n; k++)
    {
        // 分配新矩阵内存并复制原矩阵数据
        double** aa = (double**)malloc(n * sizeof(double*));
        for (int i = 0; i < n; i++)
        {
            aa[i] = (double*)malloc(n * sizeof(double));
            memcpy(aa[i], a[i], n * sizeof(double));
        }
        
        // 修改第k列为向量b
        for (int i = 0; i < n; i++)
        {
            aa[i][k] = b[i];
        }
        
        sol[k] = determinant(aa, n) / detA;
        
        // 释放新矩阵的内存,防止泄漏
        for (int i = 0; i < n; i++)
        {
            free(aa[i]);
        }
        free(aa);
    }
    return sol;
}

方案2:临时保存原列数据,修改后恢复(更高效)

如果矩阵阶数n较大,复制整个矩阵会浪费内存和时间。可以先把原矩阵第k列的数据临时保存,修改后计算行列式,再恢复原列,这样不用创建新矩阵:

double* solution(double** a, double* b, int n, double detA)
{
    double* sol = (double*)malloc(n * sizeof(double));
    double* temp_col = (double*)malloc(n * sizeof(double)); // 用于临时保存原列
    
    for (int k = 0; k < n; k++)
    {
        // 先保存原矩阵第k列的所有元素
        for (int i = 0; i < n; i++)
        {
            temp_col[i] = a[i][k];
        }
        
        // 修改第k列为b
        for (int i = 0; i < n; i++)
        {
            a[i][k] = b[i];
        }
        
        // 计算当前矩阵的行列式并求解
        sol[k] = determinant(a, n) / detA;
        
        // 恢复原矩阵的第k列,避免影响后续循环
        for (int i = 0; i < n; i++)
        {
            a[i][k] = temp_col[i];
        }
    }
    
    free(temp_col);
    return sol;
}

注意:两种方案都要记得释放分配的内存,避免内存泄漏。方案2的效率更高,推荐优先使用。

内容的提问来源于stack exchange,提问作者D. Alfano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:22:46