[pure-lang-svn] SF.net SVN: pure-lang:[820] pure/trunk
Status: Beta
Brought to you by:
agraef
From: <ag...@us...> - 2008-09-21 22:53:34
|
Revision: 820 http://pure-lang.svn.sourceforge.net/pure-lang/?rev=820&view=rev Author: agraef Date: 2008-09-21 22:53:28 +0000 (Sun, 21 Sep 2008) Log Message: ----------- Add function to determine the stride of a matrix. Modified Paths: -------------- pure/trunk/lib/primitives.pure pure/trunk/runtime.cc pure/trunk/runtime.h Modified: pure/trunk/lib/primitives.pure =================================================================== --- pure/trunk/lib/primitives.pure 2008-09-21 22:32:31 UTC (rev 819) +++ pure/trunk/lib/primitives.pure 2008-09-21 22:53:28 UTC (rev 820) @@ -412,11 +412,13 @@ /* Basic matrix operations: size, dimensions and indexing. */ -private matrix_size matrix_dim; -extern int matrix_size(expr *x), expr* matrix_dim(expr *x); +private matrix_size matrix_dim matrix_stride; +extern int matrix_size(expr *x), int matrix_stride(expr *x); +extern expr* matrix_dim(expr *x); #x::matrix = matrix_size x; dim x::matrix = matrix_dim x; +stride x::matrix = matrix_stride x; private matrix_elem_at matrix_elem_at2; extern expr* matrix_elem_at(expr* x, int i); Modified: pure/trunk/runtime.cc =================================================================== --- pure/trunk/runtime.cc 2008-09-21 22:32:31 UTC (rev 819) +++ pure/trunk/runtime.cc 2008-09-21 22:53:28 UTC (rev 820) @@ -4096,6 +4096,33 @@ } extern "C" +uint32_t matrix_stride(pure_expr *x) +{ + switch (x->tag) { + case EXPR::MATRIX: { + gsl_matrix_symbolic *m = (gsl_matrix_symbolic*)x->data.mat.p; + return m->tda; + } +#ifdef HAVE_GSL + case EXPR::DMATRIX: { + gsl_matrix *m = (gsl_matrix*)x->data.mat.p; + return m->tda; + } + case EXPR::CMATRIX: { + gsl_matrix_complex *m = (gsl_matrix_complex*)x->data.mat.p; + return m->tda; + } + case EXPR::IMATRIX: { + gsl_matrix_int *m = (gsl_matrix_int*)x->data.mat.p; + return m->tda; + } +#endif + default: + return 0; + } +} + +extern "C" int32_t matrix_type(pure_expr *x) { uint32_t t = (uint32_t)x->tag; Modified: pure/trunk/runtime.h =================================================================== --- pure/trunk/runtime.h 2008-09-21 22:32:31 UTC (rev 819) +++ pure/trunk/runtime.h 2008-09-21 22:53:28 UTC (rev 820) @@ -660,13 +660,19 @@ /* Basic matrix operations. These work with all supported GSL matrix types. matrix_size determines the number of elements in a matrix, matrix_dim the - number of rows and columns, which are returned as a pair (n,m). matrix_type - determines the exact type of a matrix, returning an integer denoting the - subtype tag (0 = symbolic, 1 = double, 2 = complex, 3 = integer matrix; -1 - is returned if the given object is not a matrix). */ + number of rows and columns, which are returned as a pair (n,m). + matrix_stride returns the real row length of a matrix, which may be larger + than its column count if the matrix is actually a slice of a larger matrix. + (This value won't be of much use in Pure programs since there is no way to + access the "extra" elements in each row, but may be useful if the data + pointer is passed to an external C routine.) matrix_type determines the + exact type of a matrix, returning an integer denoting the subtype tag (0 = + symbolic, 1 = double, 2 = complex, 3 = integer matrix; -1 is returned if + the given object is not a matrix). */ uint32_t matrix_size(pure_expr *x); pure_expr *matrix_dim(pure_expr *x); +uint32_t matrix_stride(pure_expr *x); int32_t matrix_type(pure_expr *x); /* Matrix elements can be retrieved either by a single index (using row-major This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |