[pure-lang-svn] SF.net SVN: pure-lang:[821] pure/trunk/runtime.cc
Status: Beta
Brought to you by:
agraef
From: <ag...@us...> - 2008-09-21 23:02:17
|
Revision: 821 http://pure-lang.svn.sourceforge.net/pure-lang/?rev=821&view=rev Author: agraef Date: 2008-09-21 23:02:11 +0000 (Sun, 21 Sep 2008) Log Message: ----------- Optimize the case of contiguous matrices in direct indexing. Modified Paths: -------------- pure/trunk/runtime.cc Modified: pure/trunk/runtime.cc =================================================================== --- pure/trunk/runtime.cc 2008-09-21 22:53:28 UTC (rev 820) +++ pure/trunk/runtime.cc 2008-09-21 23:02:11 UTC (rev 821) @@ -4139,24 +4139,38 @@ switch (x->tag) { case EXPR::MATRIX: { gsl_matrix_symbolic *m = (gsl_matrix_symbolic*)x->data.mat.p; - const size_t i = _i/m->size2, j = _i%m->size2, k = i*m->tda+j; - return m->data[k]; + if (m->tda > m->size2) { + const size_t i = _i/m->size2, j = _i%m->size2, k = i*m->tda+j; + return m->data[k]; + } else + return m->data[_i]; } #ifdef HAVE_GSL case EXPR::DMATRIX: { gsl_matrix *m = (gsl_matrix*)x->data.mat.p; - const size_t i = _i/m->size2, j = _i%m->size2, k = i*m->tda+j; - return pure_double(m->data[k]); + if (m->tda > m->size2) { + const size_t i = _i/m->size2, j = _i%m->size2, k = i*m->tda+j; + return pure_double(m->data[k]); + } else + return pure_double(m->data[_i]); } case EXPR::CMATRIX: { gsl_matrix_complex *m = (gsl_matrix_complex*)x->data.mat.p; - const size_t i = _i/m->size2, j = _i%m->size2, k = 2*(i*m->tda+j); - return make_complex(m->data[k], m->data[k+1]); + if (m->tda > m->size2) { + const size_t i = _i/m->size2, j = _i%m->size2, k = 2*(i*m->tda+j); + return make_complex(m->data[k], m->data[k+1]); + } else { + const size_t k = 2*_i; + return make_complex(m->data[k], m->data[k+1]); + } } case EXPR::IMATRIX: { gsl_matrix_int *m = (gsl_matrix_int*)x->data.mat.p; - const size_t i = _i/m->size2, j = _i%m->size2, k = i*m->tda+j; - return pure_int(m->data[k]); + if (m->tda > m->size2) { + const size_t i = _i/m->size2, j = _i%m->size2, k = i*m->tda+j; + return pure_int(m->data[k]); + } else + return pure_int(m->data[_i]); } #endif default: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |