#ifndef MATRIX_IN_sizeVERSE #define MATRIX_IN_sizeVERSE #include "common.h" #define N_size 3 double** mat_T(int m,int n, double **a){ double **result=new double*[m]; for(int i=0;ip) { p=abs(A[j*N_size+i]); row=j; } } if(0==p) { std::cout<< "矩阵奇异,无法计算逆" <= 0; i--) { x[i]=y[i]; for(int j = N_size-1;j > i;j--) { x[i] = x[i] - U[i*N_size+j]*x[j]; } x[i] /= U[i*N_size+i]; } return x; } /*****************矩阵原地转置BEGIN_size********************/ int getN_sizeext(int i, int m, int n) { return (i%n)*m + i/n; } int getPre(int i, int m, int n) { return (i%m)*n + i/m; } /* 处理以下标i为起点的环 */ void movedata(double *mtx, int i, int m, int n) { double temp = mtx[i]; // 暂存 int cur = i; // 当前下标 int pre = getPre(cur, m, n); while(pre != i) { mtx[cur] = mtx[pre]; cur = pre; pre = getPre(cur, m, n); } mtx[cur] = temp; } /* 转置,即循环处理所有环 */ void transpose(double *mtx, int m, int n) { for(int i=0; i i) next = getN_sizeext(next, m, n); if(next == i) movedata(mtx, i, m, n); } } /*****************矩阵原地转置EN_sizeD********************/ //LUP求逆(将每列b求出的各列x进行组装) double * LUP_solve_inverse(double A[N_size*N_size]) { //创建矩阵A的副本,注意不能直接用A计算,因为LUP分解算法已将其改变 double *A_mirror = new double[N_size*N_size](); double *inv_A=new double[N_size*N_size]();//最终的逆矩阵(还需要转置) double *inv_A_each=new double[N_size]();//矩阵逆的各列 //double *B =new double[N_size*N_size](); double *b =new double[N_size]();//b阵为B阵的列矩阵分量 for(int i=0;i