home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 60 / IOPROG_60.ISO / soft / c++ / gsl-1.1.1-setup.exe / {app} / src / matrix / submatrix_source.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-11-01  |  2.1 KB  |  67 lines

  1. /* matrix/submatrix_source.c
  2.  * 
  3.  * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
  4.  * 
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or (at
  8.  * your option) any later version.
  9.  * 
  10.  * This program is distributed in the hope that it will be useful, but
  11.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * General Public License for more details.
  14.  * 
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19.  
  20. QUALIFIED_VIEW(_gsl_matrix,view)
  21. FUNCTION (gsl_matrix, submatrix) (QUALIFIED_TYPE(gsl_matrix) * m, 
  22.                                   const size_t i, const size_t j,
  23.                                   const size_t n1, const size_t n2)
  24. {
  25.   QUALIFIED_VIEW(_gsl_matrix,view) view = NULL_MATRIX_VIEW; 
  26.  
  27.   if (i >= m->size1)
  28.     {
  29.       GSL_ERROR_VAL ("row index is out of range", GSL_EINVAL, view);
  30.     }
  31.   else if (j >= m->size2)
  32.     {
  33.       GSL_ERROR_VAL ("column index is out of range", GSL_EINVAL, view);
  34.     }
  35.   else if (n1 == 0)
  36.     {
  37.       GSL_ERROR_VAL ("first dimension must be non-zero", GSL_EINVAL, view);
  38.     }
  39.   else if (n2 == 0)
  40.     {
  41.       GSL_ERROR_VAL ("second dimension must be non-zero", GSL_EINVAL, view);
  42.     }
  43.   else if (i + n1 > m->size1)
  44.     {
  45.       GSL_ERROR_VAL ("first dimension overflows matrix", GSL_EINVAL, view);
  46.     }
  47.   else if (j + n2 > m->size2)
  48.     {
  49.       GSL_ERROR_VAL ("second dimension overflows matrix", GSL_EINVAL, view);
  50.     }
  51.  
  52.   {
  53.      TYPE(gsl_matrix) s = NULL_MATRIX;
  54.  
  55.      s.data = m->data + MULTIPLICITY * (i * m->tda + j);
  56.      s.size1 = n1;
  57.      s.size2 = n2;
  58.      s.tda = m->tda;
  59.      s.block = m->block;
  60.      s.owner = 0;
  61.  
  62.     ((VIEW(_gsl_matrix, view) *)&view)->matrix = s;     
  63.      return view;
  64.   }
  65. }
  66.  
  67.