Mercurial > hg > octave-nkf
diff liboctave/dMatrix.cc @ 3864:e78705239df5
[project @ 2001-11-16 12:56:20 by jwe]
author | jwe |
---|---|
date | Fri, 16 Nov 2001 12:56:22 +0000 |
parents | 7b4bdb12b77b |
children | 7da18459c08b |
line wrap: on
line diff
--- a/liboctave/dMatrix.cc +++ b/liboctave/dMatrix.cc @@ -1991,203 +1991,42 @@ Matrix Matrix::cumprod (int dim) const { - int nr = rows (); - int nc = cols (); - Matrix retval (nr, nc); - - if (nr > 0 && nc >0) - { - if ((nr == 1 && dim == 0) || dim == 1) - { - for (int i = 0; i < nr; i++) - { - double prod = elem (i, 0); - for (int j = 0; j < nc; j++) - { - retval.elem (i, j) = prod; - if (j < nc - 1) - prod *= elem (i, j+1); - } - } - } - else - { - for (int j = 0; j < nc; j++) - { - double prod = elem (0, j); - for (int i = 0; i < nr; i++) - { - retval.elem (i, j) = prod; - if (i < nr - 1) - prod *= elem (i+1, j); - } - } - } - } - return retval; + MX_CUMMULATIVE_OP (Matrix, double, *=); } Matrix Matrix::cumsum (int dim) const { - int nr = rows (); - int nc = cols (); - Matrix retval (nr, nc); - - if (nr > 0 && nc > 0) - { - if ((nr == 1 && dim == 0) || dim == 1) - { - for (int i = 0; i < nr; i++) - { - double sum = elem (i, 0); - for (int j = 0; j < nc; j++) - { - retval.elem (i, j) = sum; - if (j < nc - 1) - sum += elem (i, j+1); - } - } - } - else - { - for (int j = 0; j < nc; j++) - { - double sum = elem (0, j); - for (int i = 0; i < nr; i++) - { - retval.elem (i, j) = sum; - if (i < nr - 1) - sum += elem (i+1, j); - } - } - } - } - return retval; + MX_CUMMULATIVE_OP (Matrix, double, +=); } Matrix Matrix::prod (int dim) const { - Matrix retval; - - int nr = rows (); - int nc = cols (); - - if (nr > 0 && nc > 0) - { - if ((nr == 1 && dim == 0) || dim == 1) - { - retval.resize(nr, 1); - for (int i = 0; i < nr; i++) - { - retval.elem (i, 0) = 1.0; - for (int j = 0; j < nc; j++) - retval.elem (i, 0) *= elem (i, j); - } - } - else - { - retval.resize (1, nc); - for (int j = 0; j < nc; j++) - { - retval.elem (0, j) = 1.0; - for (int i = 0; i < nr; i++) - retval.elem (0, j) *= elem (i, j); - } - } - } - else - { - retval.resize (1, 1); - retval.elem (0, 0) = 1.0; - } - - return retval; + MX_REDUCTION_OP (Matrix, *=, 1.0, 1.0); } Matrix Matrix::sum (int dim) const { - Matrix retval; - - int nr = rows (); - int nc = cols (); - - if (nr > 0 && nc > 0) - { - if ((nr == 1 && dim == 0) || dim == 1) - { - retval.resize (nr, 1); - for (int i = 0; i < nr; i++) - { - retval.elem (i, 0) = 0.0; - for (int j = 0; j < nc; j++) - retval.elem (i, 0) += elem (i, j); - } - } - else - { - retval.resize (1, nc); - for (int j = 0; j < nc; j++) - { - retval.elem (0, j) = 0.0; - for (int i = 0; i < nr; i++) - retval.elem (0, j) += elem (i, j); - } - } - } - else - { - retval.resize (1, 1); - retval.elem (0, 0) = 0.0; - } - return retval; + MX_REDUCTION_OP (Matrix, +=, 0.0, 0.0); } Matrix Matrix::sumsq (int dim) const { - Matrix retval; - - int nr = rows (); - int nc = cols (); - - if (nr > 0 && nc > 0) - { - if ((nr == 1 && dim == 0) || dim == 1) - { - retval.resize (nr, 1); - for (int i = 0; i < nr; i++) - { - retval.elem (i, 0) = 0.0; - for (int j = 0; j < nc; j++) - { - double d = elem (i, j); - retval.elem (i, 0) += d * d; - } - } - } - else - { - retval.resize (1, nc); - for (int j = 0; j < nc; j++) - { - retval.elem (0, j) = 0.0; - for (int i = 0; i < nr; i++) - { - double d = elem (i, j); - retval.elem (0, j) += d * d; - } - } - } - } - else - { - retval.resize (1, 1); - retval.elem (0, 0) = 0.0; - } - return retval; +#define ROW_EXPR \ + double d = elem (i, j); \ + retval.elem (i, 0) += d * d + +#define COL_EXPR \ + double d = elem (i, j); \ + retval.elem (0, j) += d * d + + MX_BASE_REDUCTION_OP (Matrix, ROW_EXPR, COL_EXPR, 0.0, 0.0); + +#undef ROW_EXPR +#undef COL_EXPR } Matrix