二维动态数组赋值错误:线性方程组求解函数的循环问题
问题出在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
相关产品推荐
相关产品推荐

