| 11976 | |
| 11977 | extern "C" |
| 11978 | pure_expr *matrix_from_float_array(uint32_t n1, uint32_t n2, void *p) |
| 11979 | { |
| 11980 | if (n1 == 0 || n2 == 0) // empty matrix |
| 11981 | return pure_double_matrix(create_double_matrix(n1, n2)); |
| 11982 | if (!p) |
| 11983 | p = calloc(n1*n2, sizeof(double)); |
| 11984 | else { |
| 11985 | void *q = malloc(n1*n2*sizeof(double)); |
| 11986 | float *p1 = (float*)p; double *q1 = (double*)q; |
| 11987 | for (size_t i = 0; i < n1*n2; i++) q1[i] = (double)p1[i]; |
| 11988 | p = q; |
| 11989 | } |
| 11990 | if (!p) return 0; |
| 11991 | gsl_matrix_view v = gsl_matrix_view_array((double*)p, n1, n2); |
| 11992 | // take a copy of the view matrix |
| 11993 | gsl_matrix *m = (gsl_matrix*)malloc(sizeof(gsl_matrix)); |
| 11994 | gsl_block *b = (gsl_block*)malloc(sizeof(gsl_block)); |
| 11995 | assert(m && b && v.matrix.data); |
| 11996 | *m = v.matrix; |
| 11997 | b->size = n1*n2; |
| 11998 | b->data = m->data; |
| 11999 | m->block = b; |
| 12000 | pure_expr *x = new_expr(); |
| 12001 | x->tag = EXPR::DMATRIX; |
| 12002 | x->data.mat.p = m; |
| 12003 | x->data.mat.refc = new uint32_t; |
| 12004 | *x->data.mat.refc = 1; |
| 12005 | MEMDEBUG_NEW(x) |
| 12006 | return x; |
| 12007 | } |
| 12008 | |
| 12009 | extern "C" |
| 12010 | pure_expr *matrix_from_complex_float_array(uint32_t n1, uint32_t n2, void *p) |
no test coverage detected