Exemple #1
0
int is_magic(int N, int *m[])
{
int i, j;
int *sum; /* array to store the sum of lines, columns and diagonals */
	
if (m == NULL || N <=0)
	return 0;

sum = calloc(N+N+2, sizeof(int));

for (i = 0; i < N; i++)
	for (j = 0; j < N; j++) {
                /* sum of each  line */
		sum[i] += mat_elem(m, N, i, j);

                /* sum of each column */
		sum[N+j] += mat_elem(m, N, i, j);

                /* sum of main diagonal */
		if (i == j)
			sum[N+N] += mat_elem(m, N, i, j);

                /* sum of secondary diagonal */
		if ((i + j + 1) == N)
			sum[N+N+1] += mat_elem(m, N, i, j);
	}
        /* use transitivity to verify the magic property of sums */
for (i = 1; i < N+N+2; i++)
	if (sum[i] != sum[i-1])
		return 0;

free(sum);

return 1;
}
void swap_row(double *a, double *b, int r1, int r2, int n)
{
	double tmp2;
	int i;

	if (r1 == r2) return;
	parallel_for(i(0),n,[&](i i)
	 {
        double tmp, *p1, *p2;
		p1 = mat_elem(a, r1, i, n);
		p2 = mat_elem(a, r2, i, n);
		tmp = *p1, *p1 = *p2, *p2 = tmp;
	});
	
	tmp2 = b[r1], b[r1] = b[r2], b[r2] = tmp2;
}
int main(int argc, char** argv) {
  char* filename;
  FILE *fp;
  int m, n, i, info;
  double **a;
  double det;
  int *ipiv;

  if (argc < 2) {
    fprintf(stderr, "Usage: %s inputfile\n", argv[0]);
    exit(1);
  }
  filename = argv[1];

  /* read matrix A from a file */
  fp = fopen(filename, "r");
  if (fp == NULL) {
    fprintf(stderr, "Error: file can not open\n");
    exit(1);
  }
  read_dmatrix(fp, &m, &n, &a);
  if (m != n) {
    fprintf(stderr, "Error: non-square matrix\n");
    exit(1);
  }
  printf("Matrix A:\n");
  fprint_dmatrix(stdout, n, n, a);

  /* perform LU decomposition */
  ipiv = alloc_ivector(n);
  dgetrf_(&n, &n, mat_ptr(a), &n, vec_ptr(ipiv), &info);
  if (info != 0) {
    fprintf(stderr, "Error: LAPACK::dgetrf failed\n");
    exit(1);
  }
  printf("Result of LU decomposition:\n");
  fprint_dmatrix(stdout, n, n, a);
  printf("Pivot for LU decomposition:\n");
  fprint_ivector(stdout, n, ipiv);

  /* calculate determinant */
  det = 1.0;
  for (i = 0; i < n; ++i) {
    det *= mat_elem(a, i, i);
    if (ipiv[i] != i+1) det = -det;
  }
  printf("Determinant of A = %lf\n", det);
  
  free_dmatrix(a);
  free_ivector(ipiv);
}
int main(int argc, char** argv) {
  char* filename;
  FILE *fp;

  int m, n;
  int i, j, k;
  double **a;
  double *b;

  if (argc < 2) {
    fprintf(stderr, "Usage: %s inputfile\n", argv[0]);
    exit(1);
  }
  filename = argv[1];

  /* read matrix A and vector B from a file */
  fp = fopen(filename, "r");
  if (fp == NULL) {
    fprintf(stderr, "Error: file can not open\n");
    exit(1);
  }
  read_dmatrix(fp, &m, &n, &a);
  if (m != n) {
    fprintf(stderr, "Error: inconsistent number of equations\n");
    exit(1);
  }
  read_dvector(fp, &n, &b);
  if (m != n) {
    fprintf(stderr, "Error: inconsistent number of equations\n");
    exit(1);
  }
  printf("Matrix A:\n");
  fprint_dmatrix(stdout, n, n, a);
  printf("Vector B (transposed):\n");
  fprint_dvector(stdout, n, b);

  /* perform Gauss elimination */
  for (k = 0; k < n; ++k) {
    for (i = k + 1; i < n; ++i) {
      for (j = k + 1; j < n; ++j) {
        mat_elem(a, i, j) -= mat_elem(a, k, j) * mat_elem(a, i, k) / mat_elem(a, k, k);
      }
      b[i] -= b[k] * mat_elem(a, i, k) / mat_elem(a, k, k);
    }
  }
  printf("Result of Gauss elimination (only upper triangular has meaning):\n");
  fprint_dmatrix(stdout, n, n, a);
  printf("Transformed vector B:\n");
  fprint_dvector(stdout, n, b);

  /* backward substitution */
  for (k = n-1; k >= 0; --k) {
    for (j = k + 1; j < n; ++j) {
      b[k] -= mat_elem(a, k, j) * b[j];
    }
    b[k] /= mat_elem(a, k, k);
  }
  printf("Solution X (transposed):\n");
  fprint_dvector(stdout, n, b);
  
  free_dmatrix(a);
  free_dvector(b);
}