⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 laindex.h

📁 LAPACK++ (Linear Algebra PACKage in C++) is a software library for numerical linear algebra that sol
💻 H
字号:
// -*-C++-*- // Copyright (C) 2004 // Christian Stimming <stimming@tuhh.de>// 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, 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; see the file COPYING.  If not, write to the Free// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,// USA.//      LAPACK++ (V. 1.1)//      (C) 1992-1996 All Rights Reserved./** @file * @brief Matrix index class LaIndex */#ifndef _LA_INDEX_H_#define _LA_INDEX_H_#include <iostream>#include "arch.h"/** @brief Matrix index class. * * This index class is used to adress submatrices of other matrices, * without actually copying any matrix elements in memory. * * Note that we name it "LaIndex" to avoid confusion with the * "index()" string function in C, or other generic Index() * functions. */class DLLIMPORT LaIndex{   private:      friend class LaGenMatDouble;      friend class LaGenMatFloat;      friend class LaGenMatInt;      friend class LaGenMatLongInt;      friend class LaGenMatComplex;      int start_;      int inc_;      int end_;   public:      /** Construct a null index. Start, Increment, and End are       * zero. null() will return true.        *       * When used for addressing in one of the matrix classes, a       * null index like this is equivalent to adressing "all       * elements". To get the first row of a matrix \c A, you       * could therefore write <tt>A( LaIndex(0), LaIndex()       * )</tt>. This corresponds to the MATLAB notation of a       * single <tt>:</tt> (colon).       */      inline LaIndex()	 : start_(0)	 , inc_(0)	 , end_(0)      {}            /** Construct an index that points only to one element, specified       * by the given argument.       *        * Start and End is the given argument; Increment is unity but has       * no effect. */      inline LaIndex(int start) 	 : start_(start)	 , inc_(1)	 , end_(start)      {}      /** Construct an index that points to a range of elements,       * starting from the first argument and ending at the second       * argument. The element at the starting index and the       * element at the ending index are both included. This       * corresponds to the MATLAB notation <tt>start:end</tt>.       *       * \a start and \a end are given by the two       * arguments. Increment is unity. \a end has to be greater       * or equal to \a start .*/      LaIndex(int start, int end);      /** Construct an index that points to a range of elements       * with a given increment. The element at the starting index       * is included; the element at the ending index is included       * if its difference to the starting index is an integer       * multiple of the increment.  This corresponds to the       * MATLAB notation <tt>start:increment:end</tt>, but note       * the different order of arguments in this constructor.       *       * The \a increment has to be nonzero. The \a end has to be       * greater or equal to \a start if \a increment is       * positive. If \a increment is negative, then \a end has to       * be lesser or equal to \a start . Please watch out with       * negative increments: The respective matrix functions may       * or may not be correctly implemented for negative       * increments. If in doubt, use only positive increments.       *       * Start, End, and Increment are given by the three       * arguments. (We apologize for the confusing order of the       * arguments.) */      LaIndex(int start, int end, int increment);      /** Copy constructor */      inline LaIndex(const LaIndex &s)	 : start_(s.start_)	 , inc_(s.inc_)	 , end_(s.end_)      {}   protected:      // must have multply defined start(), inc() and end() member      // functions for both const and non-const objects because      // compiler complains in LaVector*.h, for example, about      // assignment to const member.  (LaVector*.h line 112, 113,      // 114) FIXME: Probably we should return by-value, not      // by-reference!      /** Returns the start index by-reference. That is, the index       * of the first indexed element.       *       * DEPRECATED. Use the set() methods instead. */      inline int& start() { return start_;}      /** Returns the increment by-reference       *       * DEPRECATED. Use the set() methods instead.  */      inline int& inc() { return inc_;}      /** Returns the end index by-reference. That is, the index       * of the last indexed element. (Not to be confused with the       * index of the one-after-the-last element!)       *       * DEPRECATED. Use the set() methods instead.  */      inline int& end() { return end_;}   public:      /** Returns the start index. That is, the index of the first       * indexed element. */      inline int start() const { return start_;}      /** Returns the increment. It is guaranteed to be nonzero. */      inline int inc() const { return inc_;}      /** Returns the end index. That is, the index of the last       * indexed element.       *       * (Not to be confused with the index of the       * one-after-the-last element!) To be more precise, the       * element at this ending index is being used if and only if       * its difference to the starting index is an integer       * multiple of the increment. */      inline int end() const { return end_;}      /** Returns the number of elements that are indexed by this       * object. */      inline int length() const { return ((end()-start())/inc() + 1);}      /** Returns true if this is a null index which cannot be       * used for indexing. */      inline bool null() const { return (start() == 0 && 					 inc() == 0 && end() == 0);}   protected:      /** DEPRECATED. Changes this index so that it points to a       * range of elements, starting from the first argument and       * ending at the second argument.       *       * Start and End are given by the two arguments. Increment       * will be set to unity.        *       * Deprecated. Use the set() method instead. Defining such       * an operator() which is an assignment instead of a value       * retrieval makes the indexing operations quite hard to       * read.  Instead, use the set() method.       */      inline LaIndex& operator()(int start, int end){	 start_=start; inc_=1; end_=end; return *this;}   public:      /** Changes this index so that it points to a range of       * elements, starting from the first argument and ending at       * the second argument. The element at the starting index       * and the element at the ending index are both       * included. This corresponds to the MATLAB notation       * <tt>start:end</tt>.       *       * Start and End are given by the two arguments. Increment       * will be set to unity. */      inline LaIndex& set(int start, int end) {	 start_=start; inc_=1; end_=end; return *this;}      /** Changes this index so that it points to a range of       * elements with a given increment. The element at the       * starting index is included; the element at the ending       * index is included if its difference to the starting index       * is an integer multiple of the increment. The increment       * argument has to be nonzero. This corresponds to the       * MATLAB notation <tt>start:increment:end</tt>, but note       * the different order of arguments in this constructor.       *       * The \a increment has to be nonzero. The \a end has to be       * greater or equal to \a start if \a increment is       * positive. If \a increment is negative, then \a end has to       * be lesser or equal to \a start . Please watch out with       * negative increments: The respective matrix functions may       * or may not be correctly implemented for negative       * increments. If in doubt, use only positive increments.       *       * Start, End, and Increment are given by the three       * arguments. (We apologize for the confusing order of the       * arguments, but this follows the three-valued       * constructor.) */      LaIndex& set(int start, int end, int increment);      /** Shifts this index by the given argument.        *       * The given argument is added to the Start and End       * indices. Increment is unchanged.  */      inline LaIndex& operator+(int i) {	 start_+=i; end_+=i; return *this;}      /** Copy assignment */      inline LaIndex& operator=(const LaIndex& i) {	 start_=i.start_; inc_=i.inc_; end_=i.end_; 	 return *this;}      /** Equality predicate */      inline bool operator==(const LaIndex& s) {	 return start_ == s.start_ && inc_ == s.inc_ && end_ == s.end_;      }      /** Inequality predicate. (New in lapackpp-2.4.5) */      inline bool operator!=(const LaIndex& s) {	 return !operator==(s);      }};inline std::ostream& operator<<(std::ostream& s, const LaIndex& i){    s << "(" << i.start() << ":" << i.inc() << ":" << i.end() << ")";    return s;}#endif  //  LA_INDEX_H_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -