/* * Open BEAGLE * Copyright (C) 2001-2007 by Christian Gagne and Marc Parizeau * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Contact: * Laboratoire de Vision et Systemes Numeriques * Departement de genie electrique et de genie informatique * Universite Laval, Quebec, Canada, G1K 7P4 * http://vision.gel.ulaval.ca * */ /*! * \file beagle/src/Matrix.cpp * \brief Source code of class Matrix. * \author Christian Gagne * \author Marc Parizeau * $Revision: 1.20.2.2 $ * $Date: 2007/08/21 02:07:24 $ */ #include "beagle/Beagle.hpp" #include #include using namespace Beagle; /*! * \brief Construct a Beagle Matrix. * \param inRows Number of rows in the matrix. * \param inCols Number of colums in the matrix. * \param inValue Value of matrix elements. */ Matrix::Matrix(unsigned int inRows, unsigned int inCols, double inValue) : Beagle::Object(), PACC::Matrix(inRows,inCols,inValue) { } /*! * \brief Construct a Beagle matrix from a PACC matrix. * \param inMatrix PACC matrix model. */ Matrix::Matrix(const PACC::Matrix& inMatrix) : Beagle::Object(), PACC::Matrix(inMatrix) { } /*! * \brief Construct a Beagle matrix from a PACC vector. * \param inVector PACC vector model. */ Matrix::Matrix(const PACC::Vector& inVector) : Beagle::Object(), PACC::Matrix(inVector) { } /*! * \brief Construct a Beagle matrix from a Beagle vector. * \param inVector Beagle vector model. */ Matrix::Matrix(const Beagle::Vector& inVector) : Beagle::Object(), PACC::Matrix(inVector) { } /*! * \brief Operator=, copy a PACC matrix into a Beagle matrix. * \param inMatrix PACC matrix to copy. * \return Reference to actual matrix. */ Matrix& Matrix::operator=(const PACC::Matrix& inMatrix) { Beagle_StackTraceBeginM(); PACC::Matrix::operator=(inMatrix); return *this; Beagle_StackTraceEndM("Matrix& Matrix::operator=(const PACC::Matrix& inMatrix)"); } /*! * \brief Operator=, copy a PACC vector into a Beagle matrix. * \param inVector PACC vector to copy. * \return Reference to actual matrix. */ Matrix& Matrix::operator=(const PACC::Vector& inVector) { Beagle_StackTraceBeginM(); PACC::Matrix::operator=(inVector); return *this; Beagle_StackTraceEndM("Matrix& Matrix::operator=(const PACC::Vector& inVector)"); } /*! * \brief Operator=, copy a Beagle vector into a Beagle matrix. * \param inVector Beagle vector to copy. * \return Reference to actual matrix. */ Matrix& Matrix::operator=(const Beagle::Vector& inVector) { Beagle_StackTraceBeginM(); PACC::Matrix::operator=(inVector); return *this; Beagle_StackTraceEndM("Matrix& Matrix::operator=(const Beagle::Vector& inVector)"); } /*! * \brief Read matrix from a XML subtree. * \param inIter XML iterator to read the matrix from. */ void Matrix::read(PACC::XML::ConstIterator inIter) { Beagle_StackTraceBeginM(); resize(0,0); if(!inIter) return; if(inIter->getType() != PACC::XML::eString) throw Beagle_IOExceptionNodeM(*inIter, "expected string to read matrix!"); std::istringstream lISS(inIter->getValue()); std::vector< double,BEAGLE_STLALLOCATOR > lTmpVec; while(lISS.good()) { double lValue=DBL_MAX; lISS >> lValue; if(lValue==DBL_MAX) break; lTmpVec.push_back(lValue); int lDelim=lISS.get(); if((lISS.good()==false) || (lDelim==-1)) break; if(lDelim==int(';')) { if((getCols()!=0) && (getCols()!=lTmpVec.size())) { std::ostringstream lOSS; lOSS << "Bad number of columns (" << lTmpVec.size() << ") in matrix row " << getRows(); lOSS << ". Expected " << getCols() << " columns read."; throw Beagle_IOExceptionMessageM(lOSS.str().c_str()); } const unsigned int lLastRow = getRows(); resize(lLastRow+1, lTmpVec.size()); for(unsigned int i=0; i