extern int matrix_inv(double** a_matrix, int ndimen) { double tmp, tmp2, b_tmp[40], c_tmp[40]; int k, k1, k2, k3, j, i, j2, i2, kme[40], kmf[40]; i2 = j2 = 0; for (k = 0; k < ndimen; k++) { tmp2 = 0.0; for (i = k; i < ndimen; i++) { for (j = k; j < ndimen; j++) { if (fabs(a_matrix[i][j]) <= fabs(tmp2)) continue; tmp2 = a_matrix[i][j]; i2 = i; j2 = j; } } if (i2 != k) { for (j = 0; j < ndimen; j++) { tmp = a_matrix[i2][j]; a_matrix[i2][j] = a_matrix[k][j]; a_matrix[k][j] = tmp; } } if (j2 != k) { for (i = 0; i < ndimen; i++) { tmp = a_matrix[i][j2]; a_matrix[i][j2] = a_matrix[i][k]; a_matrix[i][k] = tmp; } } kme[k] = i2; kmf[k] = j2; for (j = 0; j < ndimen; j++) { if (j == k) { b_tmp[j] = 1.0 / tmp2; c_tmp[j] = 1.0; } else { b_tmp[j] = -a_matrix[k][j] / tmp2; c_tmp[j] = a_matrix[j][k]; } a_matrix[k][j] = 0.0; a_matrix[j][k] = 0.0; } for (i = 0; i < ndimen; i++) { for (j = 0; j < ndimen; j++) { a_matrix[i][j] = a_matrix[i][j] + c_tmp[i] * b_tmp[j]; } } } for (k3 = 0; k3 < ndimen; k3++) { k = ndimen - k3 - 1; k1 = kme[k]; k2 = kmf[k]; if (k1 != k) { for (i = 0; i < ndimen; i++) { tmp = a_matrix[i][k1]; a_matrix[i][k1] = a_matrix[i][k]; a_matrix[i][k] = tmp; } } if (k2 != k) { for (j = 0; j < ndimen; j++) { tmp = a_matrix[k2][j]; a_matrix[k2][j] = a_matrix[k][j]; a_matrix[k][j] = tmp; } } } return (0); }
时间: 2023-06-19 21:04:50 浏览: 49
这是一个求解矩阵的逆矩阵的函数,使用的是高斯-约旦消元法。函数的输入参数为一个二维数组 a_matrix,表示要求逆矩阵的原矩阵,以及矩阵的维度 ndimen。函数的返回值为一个整数,表示求解的结果,一般返回 0 表示求解成功。在函数中,首先对原矩阵进行了一些变换,使得原矩阵变为一个单位矩阵,然后将变换的过程记录下来,最后通过变换过程计算出逆矩阵。需要注意的是,这个函数可能存在一些问题,比如计算精度不够高等,因此在使用时需要进行一定的检查和验证。
相关问题
extern void dgemm_(char*, char*, int*, int*, int*, double*, double*, int*, double*, int*, double*, double*, int*);
extern void dgemm_(char*, char*, int*, int*, int*, double*, double*, int*, double*, int*, double*, double*, int*);
这是一个C语言的函数声明,它声明了一个名为dgemm_的函数,该函数有13个参数,返回值类型为void。这个函数实际上是一个Fortran函数,使用了Fortran的调用约定(calling convention)。在C语言中调用Fortran函数时,需要使用extern关键字进行声明,并且需要在函数名后面加上下划线。这个函数的作用是进行矩阵乘法运算,其中参数含义如下:
- char*:表示矩阵运算中的转置方式,取值可以为‘N’(不转置),‘T’(转置)或‘C’(共轭转置)。
- int*:表示输入矩阵A的行数、列数和矩阵B的列数,分别对应于第3、4和5个参数。
- double*:表示输入的矩阵A、B和输出的矩阵C。
- int*:表示矩阵A、B和C在内存中存储时的步长(stride)。
- int*:表示该参数控制了内部循环的块大小,一般可以设置为32或64。
extern int __sigsetjmp (struct __jmp_buf_tag *__env, int __savemask) __THROWNL
extern int __sigsetjmp (struct __jmp_buf_tag *__env, int __savemask) __THROWNL是一个函数声明,它声明了一个名为__sigsetjmp的函数。该函数的参数是一个指向struct __jmp_buf_tag类型的指针__env和一个整型变量__savemask,并且该函数的返回值是整型。此函数的功能是在__env指定的jmp_buf结构中设置信号掩码,并且返回0。这个函数通常用于保存环境以便后续的longjmp调用可以跳转回来。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [linux 下异常处理初步记录 setjmp 和 longjmp](https://blog.csdn.net/weixin_45647912/article/details/108471986)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [C标准库源码解剖(9):控制函数assert.h, setjmp.h和signal.h](https://blog.csdn.net/chuifuhuo6864/article/details/100883066)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]