#include < stdio.h >
#include < math.h >
#include < stdlib.h >
#define EPS 1e-6
#define FO "%-20.7lg"
#define N 3
void multm(double * a, double * b, int m, int n, int k, double * c);
void fscanfm(FILE * stream, double * a, int m, int n);
void copym(double * a, double * b, int m, int n);
void fprintm(FILE * stream, double * a, int m, int n, char * aa);
int ni2(double * a, double * b, int n); //矩阵的逆
void t(double * a, double * b, int m, int n); //转置a(mxn)
int main(void) {
double a[N][N] = {
12,
9,
67,
78,
6,
36,
66,
8,
9
};
double b[N][N],
i[N][N];
int flag;
fprintm(stdout, a[0], N, N, "A");
flag = ni2(a[0], b[0], N);
if (flag) {
fprintm(stdout, b[0], N, N, "逆为");
multm(a[0], b[0], N, N, N, i[0]);
fprintm(stdout, i[0], N, N, "I");
}
return 0;
}
int ni2(double * a, double * b, int n) {
int i,
j,
k;
int t;
double d;
double * temp;
temp = (double * ) malloc(n * (2 * n) * sizeof(double));
if (!temp) {
printf("存储分配失败!\n");
free(temp);
return 0;
}
for (i = 0; i < n; i++) for (j = 0; j < n; j++) temp = a;
for (i = 0; i < n; i++) for (j = n; j < 2 * n; j++) if (j - i == n) temp = 1.0;
else temp = 0.0;
for (j = 0; j < n; j++) //a的0---(n-1)列
{
t = j;
for (i = j + 1; i < n; i++) //找绝对值最大的
if (fabs(temp) > fabs(temp[t * 2 * n + j])) t = i;
if (fabs(temp[t * 2 * n + j]) <= EPS) {
printf("不可逆!\n");
return 0;
}
if (t != j) for (k = 0; k < 2 * n; k++) //交换行
{
d = temp[j * 2 * n + k];
temp[j * 2 * n + k] = temp[t * 2 * n + k];
temp[t * 2 * n + k] = d;
}
d = temp[j * 2 * n + j]; //d应放这儿,而不是for()中
for (k = j; k < 2 * n; k++) //第j行同除以temp[jj]
{
temp[j * 2 * n + k] /= d;
}
for (i = j + 1; i < n; i++) //把下面消为零
{
d = -temp;
for (k = 0; k < 2 * n; k++) temp += temp[j * 2 * n + k] * d;
}
}
for (j = 1; j < n; j++) //把上三角也消为零
{
for (i = 0; i < j; i++) {
d = -temp;
for (k = j; k < 2 * n; k++) temp += temp[j * 2 * n + k] * d;
}
}
for (i = 0; i < n; i++) //a的逆赋值给b
for (j = 0; j < n; j++) b = temp;
free(temp);
return 1;
}
void multm(double * a, double * b, int m, int n, int k, double * c) {
int i,
j,
l,
u;
for (i = 0; i < m; i++) for (j = 0; j < k; j++) {
u = i * k + j;
c = 0.0;
for (l = 0; l < n; l++) c += a * b[l * k + j];
}
}
void fscanfm(FILE * stream, double * a, int m, int n) {
int i,
j;
if (n == 1) for (i = 0; i < m; i++) {
fscanf(stream, "%lf", a + i);
} else {
for (i = 0; i < m; i++) for (j = 0; j < n; j++) {
fscanf(stream, "%lf", a + i * n + j);
}
}
}
void copym(double * a, double * b, int m, int n) {
int i,
j,
u;
for (i = 0; i < m; i++) for (j = 0; j < n; j++) {
u = i * n + j;
b = a;
}
}
void fprintm(FILE * stream, double * a, int m, int n, char * aa) {
int i,
j,
k;
fprintf(stream, "%s:\n", aa);
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
k = i * n + j;
if (fabs(a[k]) <= EPS) a[k] = 0.0;
fprintf(stream, FO, a[k]);
}
fprintf(stream, "\n");
}
}
void t(double * a, double * b, int m, int n) {
int i,
j;
for (i = 0; i < m; i++) for (j = 0; j < n; j++) b[j * m + i] = a;
}
矩阵的逆
原创
©著作权归作者所有:来自51CTO博客作者mb643d15e043b20的原创作品,请联系作者获取转载授权,否则将追究法律责任
下一篇:道德经
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
【数据结构】特殊矩阵的压缩存储
【数据结构】第三章——栈、队列与数组详细介绍特殊矩阵的压缩存储……
数据结构 C语言 矩阵 压缩存储 数组 -
逆矩阵的性质
线性代数学习笔记
矩阵 线性代数 逆矩阵