【题目内容】
对一二维矩阵进行求逆操作
【输入形式】
一个二维矩阵
【输出形式】
该矩阵的逆矩阵
【测试用例1】
输入:
1 0 0
-2 1 0
0 0 1
输出:
1 0 0
2 1 0
0 0 1
#include <stdio.h>
#define N 3
int juzhen[N][N],n=N;
int ans[N][N];
int r[N];
int nx(int n)
{
int sum = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < i; j++)
{
if (r[j] > r[i]) sum++;
}
}
if (sum & 1) return -1;
return 1;
}
int yuzi_ans;
void dfs(int yuzi[N][N], int sum, int pos,int n) {
if (sum == n ) {
int s = 1;
for (int i = 0; i < n; i++)
s *= yuzi[i][r[i]];
yuzi_ans += nx(n) * s;
return;
}
for (int i = 0; i < n; i++)
{
if (pos >> i & 1) continue;
pos = pos | 1 << i;
r[sum] = i;
dfs(yuzi,sum + 1,pos,n);
pos = pos ^ 1 << i;
}
}
int f(int yuzi[N][N],int n) {
yuzi_ans = 0;
dfs(yuzi, 0, 0,n);
return yuzi_ans;
}
void nijuzhen() {
int yuzi[N][N];
int bansui[N][N];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int p = 0;
for (int k = 0; k < n - 1; k++) {
if (p == i) {
p++;
}
int q = 0;
for (int r = 0; r < n - 1; r++) {
if (q == j) {
q++;
}
yuzi[k][r] = juzhen[p][q++];
}
p++;
}
int flag = 1;
if ((i + j) & 1) flag = -1;
bansui[j][i] = f(yuzi,n-1)*flag;
}
}
printf("逆矩阵为:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", bansui[i][j]);
}
printf("\n");
}
}
int main()
{
printf("请输入3*3矩阵值:\n");
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
scanf("%d", &juzhen[i][j]);
nijuzhen();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
double** expand_matrix;
double** new_matrix;
void initExpandMatrix(double ** mat, double ** expand_mat, int);
int adjustMatrix(double ** expand_mat, int len);
void calculateExpandMatrix(double ** expand_mat, int len);
void getNewMatrix(double ** expand_mat, double ** new_mat, int len);
void printMatrix(double ** mat, int len);
double** getProductMatrix(double ** init_mat, double ** new_mat, int len);
double** getInvMatrix(double ** mat, int len);
int main() {
int len;
scanf("%d", &len);
double** init_mat = (double **)malloc(sizeof(double *) * len);
for (int i = 0; i < len; i++) {
init_mat[i] = (double *)malloc(sizeof(double) * len);
}
/* 测试示例
1 2 -1
3 4 -2
5 -4 1
*/
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
scanf("%lf", &init_mat[i][j]);
}
}
printf("====== init_matrix ======\n");
printMatrix(init_mat, len);
printf("==== inverse matrix ====\n\n");
double ** new_mat = getInvMatrix(init_mat, len);
printMatrix(new_mat, len);
printf("====== init * inv ======\n\n");
double** product_mat = getProductMatrix(init_mat, new_mat, len);
printMatrix(product_mat, len);
return 0;
}
// inverse matrix
double** getInvMatrix(double ** mat, int len) {
// 扩展矩阵定义 //
expand_matrix = (double**)malloc(sizeof(double *) * len);
for (int i = 0; i < len; i++) {
expand_matrix[i] = (double *)malloc(sizeof(double ) * (len * 2));
}
// 逆矩阵定义 //
new_matrix = (double**)malloc(sizeof(double *) * len);
for (int i = 0; i < len; i++) {
new_matrix[i] = (double *)malloc(sizeof(double ) * len);
}
// init
initExpandMatrix(mat, expand_matrix, len);
// adjust
int canAdjust = adjustMatrix(expand_matrix, len);
if (canAdjust == 0) {
return NULL;
}
// calc expand
calculateExpandMatrix(expand_matrix, len);
// 取后面的N*N矩阵,即为所求 //
getNewMatrix(expand_matrix, new_matrix, len);
return new_matrix;
}
// init expand_matrix
void initExpandMatrix(double ** mat, double ** expand_mat, int len) {
for (int i = 0; i < len; i++) {
for (int j = 0; j < len * 2; j++) {
if (j < len) {
expand_mat[i][j] = mat[i][j];
} else {
if (j == len + i) {
expand_mat[i][j] = 1;
} else {
expand_mat[i][j] = 0;
}
}
}
}
}
// adjust expand matrix
int adjustMatrix(double ** expand_mat, int len) {
for (int i = 0; i < len; i++) {
if (expand_mat[i][i] == 0) {
int j;
for (j = 0; j < len; j++) {
if (expand_mat[j][i] != 0) {
double* tmp = expand_mat[i];
expand_mat[i] = expand_mat[j];
expand_mat[j] = tmp;
break;
}
}
if (j >= len) {
printf("Inv Matrix does not exists\n");
return false;
}
}
}
return true;
}
// calc
void calculateExpandMatrix(double ** expand_mat, int len) {
for (int i = 0; i < len; i++) {
double fir_ele = expand_mat[i][i];
for (int j = 0; j < len * 2; j++) {
expand_mat[i][j] /= fir_ele; // 该行所有元素除以首元素 //
}
for (int m = 0; m < len; m++) {
if (m == i) {
continue;
}
// 倍数 //
double times = expand_mat[m][i];
for (int n = 0; n < len * 2; n++) {
expand_mat[m][n] -= expand_mat[i][n] * times;
}
}
}
}
// get res
void getNewMatrix(double ** expand_mat, double ** new_mat, int len) {
for (int i = 0; i < len; i++) {
for (int j = 0; j < len * 2; j++) {
if (j >= len) {
new_mat[i][j - len] = expand_mat[i][j];
}
}
}
}
// print matrix
void printMatrix(double** mat, int len) {
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
printf("%.1lf ", mat[i][j]);
}
putchar('\n');
}
putchar('\n');
}
// matrix multiplying
double** getProductMatrix(double** init_mat, double** new_mat, int len) {
double** product_mat = (double**)malloc(sizeof(double*) * len);
for (int i = 0; i < len; i++) {
product_mat[i] = (double*)malloc(sizeof(double) * len);
}
// need initializing to zero
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
product_mat[i][j] = 0;
}
}
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
for (int k = 0; k < len; k++) {
product_mat[i][j] += init_mat[i][k] * new_mat[k][j];
}
}
}
return product_mat;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!