[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.
|