A-M baby
This commit is contained in:
parent
764da6cbbb
commit
db842d013d
19005 changed files with 197040 additions and 7 deletions
45
Task/Matrix-arithmetic/C/matrix-arithmetic-1.c
Normal file
45
Task/Matrix-arithmetic/C/matrix-arithmetic-1.c
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
double det_in(double **in, int n, int perm)
|
||||
{
|
||||
if (n == 1) return in[0][0];
|
||||
|
||||
double sum = 0, *m[--n];
|
||||
for (int i = 0; i < n; i++)
|
||||
m[i] = in[i + 1] + 1;
|
||||
|
||||
for (int i = 0, sgn = 1; i <= n; i++) {
|
||||
sum += sgn * (in[i][0] * det_in(m, n, perm));
|
||||
if (i == n) break;
|
||||
|
||||
m[i] = in[i] + 1;
|
||||
if (!perm) sgn = -sgn;
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
/* wrapper function */
|
||||
double det(double *in, int n, int perm)
|
||||
{
|
||||
double *m[n];
|
||||
for (int i = 0; i < n; i++)
|
||||
m[i] = in + (n * i);
|
||||
|
||||
return det_in(m, n, perm);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
double x[] = { 0, 1, 2, 3, 4,
|
||||
5, 6, 7, 8, 9,
|
||||
10, 11, 12, 13, 14,
|
||||
15, 16, 17, 18, 19,
|
||||
20, 21, 22, 23, 24 };
|
||||
|
||||
printf("det: %14.12g\n", det(x, 5, 0));
|
||||
printf("perm: %14.12g\n", det(x, 5, 1));
|
||||
|
||||
return 0;
|
||||
}
|
||||
76
Task/Matrix-arithmetic/C/matrix-arithmetic-2.c
Normal file
76
Task/Matrix-arithmetic/C/matrix-arithmetic-2.c
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <tgmath.h>
|
||||
|
||||
void showmat(const char *s, double **m, int n)
|
||||
{
|
||||
printf("%s:\n", s);
|
||||
for (int i = 0; i < n; i++) {
|
||||
for (int j = 0; j < n; j++)
|
||||
printf("%12.4f", m[i][j]);
|
||||
putchar('\n');
|
||||
}
|
||||
}
|
||||
|
||||
int trianglize(double **m, int n)
|
||||
{
|
||||
int sign = 1;
|
||||
for (int i = 0; i < n; i++) {
|
||||
int max = 0;
|
||||
|
||||
for (int row = i; row < n; row++)
|
||||
if (fabs(m[row][i]) > fabs(m[max][i]))
|
||||
max = row;
|
||||
|
||||
if (max) {
|
||||
sign = -sign;
|
||||
double *tmp = m[i];
|
||||
m[i] = m[max], m[max] = tmp;
|
||||
}
|
||||
|
||||
if (!m[i][i]) return 0;
|
||||
|
||||
for (int row = i + 1; row < n; row++) {
|
||||
double r = m[row][i] / m[i][i];
|
||||
if (!r) continue;
|
||||
|
||||
for (int col = i; col < n; col ++)
|
||||
m[row][col] -= m[i][col] * r;
|
||||
}
|
||||
}
|
||||
return sign;
|
||||
}
|
||||
|
||||
double det(double *in, int n)
|
||||
{
|
||||
double *m[n];
|
||||
m[0] = in;
|
||||
|
||||
for (int i = 1; i < n; i++)
|
||||
m[i] = m[i - 1] + n;
|
||||
|
||||
showmat("Matrix", m, n);
|
||||
|
||||
int sign = trianglize(m, n);
|
||||
if (!sign)
|
||||
return 0;
|
||||
|
||||
showmat("Upper triangle", m, n);
|
||||
|
||||
double p = 1;
|
||||
for (int i = 0; i < n; i++)
|
||||
p *= m[i][i];
|
||||
return p * sign;
|
||||
}
|
||||
|
||||
#define N 18
|
||||
int main(void)
|
||||
{
|
||||
double x[N * N];
|
||||
srand(0);
|
||||
for (int i = 0; i < N * N; i++)
|
||||
x[i] = rand() % N;
|
||||
|
||||
printf("det: %19f\n", det(x, N));
|
||||
return 0;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue