From a63c83a55c527e6e95c92cf2ef65ae575902387e Mon Sep 17 00:00:00 2001 From: mquinson Date: Tue, 13 Jun 2006 08:52:24 +0000 Subject: [PATCH] Some new functions to this. Bloatware, here we come. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2372 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- include/xbt/matrix.h | 13 ++++++ src/xbt/xbt_matrix.c | 95 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 98 insertions(+), 10 deletions(-) diff --git a/include/xbt/matrix.h b/include/xbt/matrix.h index 1ffab4b8c6..ce207170b9 100644 --- a/include/xbt/matrix.h +++ b/include/xbt/matrix.h @@ -36,10 +36,20 @@ typedef struct { xbt_matrix_t xbt_matrix_new(int lines, int rows, const unsigned long elmsize, void_f_pvoid_t * const free_f); +xbt_matrix_t xbt_matrix_new_sub(xbt_matrix_t from, + int lsize, int rsize, + int lpos, int rpos, + pvoid_f_pvoid_t *const cpy_f); void xbt_matrix_free(xbt_matrix_t matrix); void xbt_matrix_free_voidp(void *d); +void xbt_matrix_copy_values(xbt_matrix_t dest, xbt_matrix_t src, + int lsize, int rsize, + int lpos_dst,int rpos_dst, + int lpos_src,int rpos_src, + pvoid_f_pvoid_t *const cpy_f); + void xbt_matrix_dump(xbt_matrix_t matrix, const char *name, int coords, void_f_pvoid_t display_fun); void xbt_matrix_dump_display_double(void*d); @@ -48,7 +58,10 @@ void xbt_matrix_dump_display_double(void*d); xbt_matrix_t xbt_matrix_double_new_zeros(int lines, int rows); xbt_matrix_t xbt_matrix_double_new_id(int lines, int rows); xbt_matrix_t xbt_matrix_double_new_rand(int lines, int rows); +xbt_matrix_t xbt_matrix_double_new_seq(int lines, int rows); xbt_matrix_t xbt_matrix_double_new_mult(xbt_matrix_t A,xbt_matrix_t B); +void xbt_matrix_double_addmult(xbt_matrix_t A,xbt_matrix_t B, + /*OUT*/ xbt_matrix_t C); SG_END_DECL() diff --git a/src/xbt/xbt_matrix.c b/src/xbt/xbt_matrix.c index 89c9485f4d..0238b479c7 100644 --- a/src/xbt/xbt_matrix.c +++ b/src/xbt/xbt_matrix.c @@ -11,7 +11,7 @@ #include "xbt/log.h" #include "xbt/matrix.h" -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(matrix,xbt,"2D data storage"); +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_matrix,xbt,"2D data storage"); /** \brief constructor */ xbt_matrix_t xbt_matrix_new(int lines, int rows, @@ -26,6 +26,18 @@ xbt_matrix_t xbt_matrix_new(int lines, int rows, return res; } +/** \brief Creates a matrix being a submatrix of another one */ +xbt_matrix_t xbt_matrix_new_sub(xbt_matrix_t from, + int lsize, int rsize, + int lpos, int rpos, + pvoid_f_pvoid_t *const cpy_f) { + + xbt_matrix_t res=xbt_matrix_new(lsize,rsize, + from->elmsize, from->free_f); + xbt_matrix_copy_values(res,from,lsize,rsize,0,0,lpos,rpos,cpy_f); + return res; +} + /** \brief destructor */ void xbt_matrix_free(xbt_matrix_t mat) { int i; @@ -70,15 +82,57 @@ void xbt_matrix_dump(xbt_matrix_t matrix, const char*name, int coords, void xbt_matrix_dump_display_double(void*d) { fprintf(stderr,"%.2f",*(double*)d); } +/** \brief Copy the values from the matrix src into the matrix dst + * \param dest: destination + * \param src: source + * \param lsize: number of lines to copy + * \param rsize: number of rows to copy + * \param lpos_dst: line offset on destination matrix + * \param rpos_dst: row offset on destination matrix + * \param lpos_src: line offset on destination matrix + * \param rpos_src: row offset on destination matrix + */ +void xbt_matrix_copy_values(xbt_matrix_t dst, xbt_matrix_t src, + int lsize, int rsize, + int lpos_dst,int rpos_dst, + int lpos_src,int rpos_src, + pvoid_f_pvoid_t *const cpy_f) { + int i,j; + + DEBUG10("Copy a %dx%d submatrix from %dx%d(of %dx%d) to %dx%d (of %dx%d)", + lsize,rsize, + lpos_src,rpos_src,src->lines,src->rows, + lpos_dst,rpos_dst,dst->lines,dst->rows); + + /* everybody knows that issue is between the chair and the screen (particulary in my office) */ + xbt_assert(src->elmsize == dst->elmsize); + /* don't check free_f since the user may play weird games with this */ + + xbt_assert(lpos_src+lsize <= src->lines); + xbt_assert(rpos_src+rsize <= src->rows); + + xbt_assert(lpos_dst+lsize <= dst->lines); + xbt_assert(rpos_dst+rsize <= dst->rows); + + /* Lets get serious here */ + for (i=0;ielmsize*lsize); + } + } + +} /** \brief Creates a new matrix of double filled with zeros */ xbt_matrix_t xbt_matrix_double_new_zeros(int lines, int rows) { xbt_matrix_t res = xbt_matrix_new(lines, rows,sizeof(double),NULL); - int i,j; - for (i=0; idata,0,sizeof(res->data)); return res; } @@ -102,19 +156,40 @@ xbt_matrix_t xbt_matrix_double_new_rand(int lines, int rows) { xbt_matrix_get_as(res,i,j,double) = (double)rand(); return res; } +/** \brief Creates a new matrix of double randomly by subsequent numbers */ +xbt_matrix_t xbt_matrix_double_new_seq(int lines, int rows) { + xbt_matrix_t res = xbt_matrix_new(lines, rows,sizeof(double),NULL); + int i; + + for (i=0; idata[i*res->elmsize] = i; + + return res; +} /** \brief Creates a new matrix being the multiplication of two others */ xbt_matrix_t xbt_matrix_double_new_mult(xbt_matrix_t A,xbt_matrix_t B) { xbt_matrix_t result = xbt_matrix_double_new_zeros(A->lines, B->rows); + + xbt_matrix_double_addmult(A,B,result); + return result; +} + +/** \brief add to C the result of A*B */ +void xbt_matrix_double_addmult(xbt_matrix_t A,xbt_matrix_t B, + /*OUT*/ xbt_matrix_t C) { int i,j,k; - for (i=0; ilines; i++) - for (j=0; jrows; j++) + xbt_assert2(A->lines == C->lines, + "A->lines != C->lines (%d vs %d)",A->lines,C->lines); + xbt_assert(B->rows == C->rows); + + for (i=0; ilines; i++) + for (j=0; jrows; j++) for (k=0; klines; k++) - xbt_matrix_get_as(result,i,j,double) += + xbt_matrix_get_as(C,i,j,double) += xbt_matrix_get_as(A,i,k,double) * xbt_matrix_get_as(B,k,j,double); - - return result; } + -- 2.20.1