diff options
Diffstat (limited to 'gsl-1.9/matrix/getset_source.c')
-rw-r--r-- | gsl-1.9/matrix/getset_source.c | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/gsl-1.9/matrix/getset_source.c b/gsl-1.9/matrix/getset_source.c new file mode 100644 index 0000000..e55c05b --- /dev/null +++ b/gsl-1.9/matrix/getset_source.c @@ -0,0 +1,228 @@ +/**********************************************************************/ +/* The functions below are obsolete */ +/**********************************************************************/ + +int +FUNCTION (gsl_matrix, get_row) (TYPE (gsl_vector) * v, + const TYPE (gsl_matrix) * m, + const size_t i) +{ + const size_t M = m->size1; + const size_t N = m->size2; + const size_t tda = m->tda; + + if (i >= M) + { + GSL_ERROR ("row index is out of range", GSL_EINVAL); + } + + if (v->size != N) + { + GSL_ERROR ("matrix row size and vector length are not equal", + GSL_EBADLEN); + } + + { + ATOMIC *v_data = v->data; + const ATOMIC *row_data = m->data + MULTIPLICITY * i * tda; + const size_t stride = v->stride ; + size_t j; + + for (j = 0; j < N; j++) + { + unsigned int k; + + for (k = 0; k < MULTIPLICITY; k++) + { + v_data[MULTIPLICITY * stride * j + k] + = row_data[MULTIPLICITY * j + k]; + } + } + } + + return GSL_SUCCESS; +} + +int +FUNCTION (gsl_matrix, get_col) (TYPE (gsl_vector) * v, + const TYPE (gsl_matrix) * m, + const size_t j) +{ + const size_t M = m->size1; + const size_t N = m->size2; + const size_t tda = m->tda; + + if (j >= N) + { + GSL_ERROR ("column index is out of range", GSL_EINVAL); + } + + if (v->size != M) + { + GSL_ERROR ("matrix column size and vector length are not equal", + GSL_EBADLEN); + } + + + { + ATOMIC *v_data = v->data; + const ATOMIC *column_data = m->data + MULTIPLICITY * j; + const size_t stride = v->stride ; + size_t i; + + for (i = 0; i < M; i++) + { + unsigned int k; + + for (k = 0; k < MULTIPLICITY; k++) + { + v_data[stride * MULTIPLICITY * i + k] = + column_data[MULTIPLICITY * i * tda + k]; + } + } + } + + return GSL_SUCCESS; +} + +int +FUNCTION (gsl_matrix, set_row) (TYPE (gsl_matrix) * m, + const size_t i, + const TYPE (gsl_vector) * v) +{ + const size_t M = m->size1; + const size_t N = m->size2; + const size_t tda = m->tda; + + if (i >= M) + { + GSL_ERROR ("row index is out of range", GSL_EINVAL); + } + + if (v->size != N) + { + GSL_ERROR ("matrix row size and vector length are not equal", + GSL_EBADLEN); + } + + { + const ATOMIC *v_data = v->data; + ATOMIC *row_data = m->data + MULTIPLICITY * i * tda; + const size_t stride = v->stride ; + size_t j; + + for (j = 0; j < N; j++) + { + unsigned int k; + + for (k = 0; k < MULTIPLICITY; k++) + { + row_data[MULTIPLICITY*j + k] + = v_data[MULTIPLICITY * stride * j + k]; + } + } + } + + return GSL_SUCCESS; +} + +int +FUNCTION (gsl_matrix, set_col) (TYPE (gsl_matrix) * m, + const size_t j, + const TYPE (gsl_vector) * v) +{ + const size_t M = m->size1; + const size_t N = m->size2; + const size_t tda = m->tda; + + if (j >= N) + { + GSL_ERROR ("column index is out of range", GSL_EINVAL); + } + + if (v->size != M) + { + GSL_ERROR ("matrix column size and vector length are not equal", + GSL_EBADLEN); + } + + { + const ATOMIC *v_data = v->data; + ATOMIC *column_data = m->data + MULTIPLICITY * j; + const size_t stride = v->stride ; + size_t i; + + for (i = 0; i < M; i++) + { + unsigned int k; + + for (k = 0; k < MULTIPLICITY; k++) + { + column_data[MULTIPLICITY * i * tda + k] + = v_data[MULTIPLICITY * stride * i + k]; + } + } + } + + return GSL_SUCCESS; +} + + +TYPE (gsl_vector) * +FUNCTION (gsl_vector, alloc_row_from_matrix) (TYPE(gsl_matrix) * m, + const size_t i) +{ + TYPE (gsl_vector) * v; + + const size_t M = m->size1; + + if (i >= M) + { + GSL_ERROR_VAL ("row index is out of range", GSL_EINVAL, 0); + } + + v = (TYPE (gsl_vector) *) malloc (sizeof (TYPE (gsl_vector))); + + if (v == 0) + { + GSL_ERROR_VAL ("failed to allocate space for vector struct", + GSL_ENOMEM, 0); + } + + v->data = m->data + MULTIPLICITY * i * m->tda ; + v->size = m->size2; + v->stride = 1; + v->block = 0; + + return v; +} + +TYPE (gsl_vector) * +FUNCTION (gsl_vector, alloc_col_from_matrix) (TYPE(gsl_matrix) * m, + const size_t j) +{ + TYPE (gsl_vector) * v; + + const size_t N = m->size2; + + if (j >= N) + { + GSL_ERROR_VAL ("column index is out of range", GSL_EINVAL, 0); + } + + v = (TYPE (gsl_vector) *) malloc (sizeof (TYPE (gsl_vector))); + + if (v == 0) + { + GSL_ERROR_VAL ("failed to allocate space for vector struct", + GSL_ENOMEM, 0); + } + + v->data = m->data + MULTIPLICITY * j ; + v->size = m->size1; + v->stride = m->tda; + v->block = 0; + + return v; +} + |