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); }