📄 gmc.h
字号:
// -*-C++-*- // Copyright (C) 2004 // Christian Stimming <stimming@tuhh.de>// Row-order modifications by Jacob (Jack) Gryn <jgryn at cs dot yorku dot ca>// 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./** @file * @brief General Dense Rectangular Complex-valued Matrix Class */// LAPACK++ (V. 1.1)// (C) 1992-1996 All Rights Reserved.//// Lapack++ Rectangular Matrix Class//// Dense (nonsingular) matrix, assumes no special structure or properties.//// ) allows 2-d indexing// ) non-unit strides// ) deep (copy) assignment// ) std::cout << A.info() prints out internal states of A// ) indexing via A(i,j) where i,j are either integers or// LaIndex #ifndef _LA_GEN_MAT_COMPLEX_H_#define _LA_GEN_MAT_COMPLEX_H_#ifndef LA_COMPLEX_SUPPORT/* An application must define LA_COMPLEX_SUPPORT if it wants to use * complex numbers here. */# error "The macro LA_COMPLEX_SUPPORT needs to be defined if you want to use complex-valued matrices."#endif#include "arch.h"#include "lafnames.h"#include VECTOR_COMPLEX_H#include LA_INDEX_H#include LA_GEN_MAT_DOUBLE_Hclass LaGenMatComplex;class LaGenMatDouble;class LaGenMatFloat;class LaGenMatInt;class LaGenMatLongInt;/** \brief General Dense Rectangular Complex Matrix Class * * This is the basic LAPACK++ complex-valued matrix. It is a dense * (nonsingular) matrix, assumes no special structure or properties. * * - allows 2-d indexing * - non-unit strides * - deep (copy) assignment * - std::cout << A.info() prints out internal states of A * - indexing via A(i,j) where i,j are either integers or LaIndex * * Multiplication of this matrix should be done by the functions in * blas1pp.h, blas2pp.h and blas3pp.h, * e.g. Blas_Mat_Mat_Mult(). (There are also some operators in * blaspp.h, but we advice against them because they will always * allocate a new matrix for the result even though you usually * already have a matrix at hand for writing the result into.) * Transpositions of matrices usually do not have to be calculated * explicitly, but you can directly use the different multiplication * functions that will use a matrix as a transposed one, * e.g. Blas_Mat_Trans_Mat_Mult(). * * To switch on the support for complex-valued matrices, you need to * define the macro LA_COMPLEX_SUPPORT in your application before * including the Lapack++ header files. */class DLLIMPORT LaGenMatComplex{ public: /** The type of the value elements. */ typedef COMPLEX value_type; /** Convenience typedef of this class to itself to make * common function definitions easier. (New in * lapackpp-2.4.5) */ typedef LaGenMatComplex matrix_type; /** Internal wrapper type; don't use that in an * application. */ typedef VectorComplex vec_type; private: vec_type v; LaIndex ii[2]; int dim[2]; // size of original matrix, not submatrix //int sz[2]; // size of this submatrix void init(int m, int n); int size0; int size1; static int debug_; // trace all entry and exits into methods and // operators of this class. This variable is // explicitly initalized in lagenmatCOMPLEX.cc static int *info_; // print matrix info only, not values // originally 0, set to 1, and then // reset to 0 after use. // use as in // // std::cout << B.info() << std::endl; // // this *info_ member is unique in that it really isn't // part of the matrix info, just a flag as to how // to print it. We've included in this beta release // as part of our testing, but we do not expect it // to be user accessable. // It has to be declared as global static // so that we may monitor expresssions like // X::(const &X) and still utilize without violating // the "const" condition. // Because this *info_ is used at most one at a time, // there is no harm in keeping only one copy of it, // also, we do not need to malloc free space every time // we call a matrix constructor. int shallow_; // set flag to '0' in order to return matrices // by value from functions without unecessary // copying. // users shouldn't be able to modify assignment semantics.. // //LaGenMatComplex& shallow_assign(); public: /** @name Declaration */ //@{ /*::::::::::::::::::::::::::*/ /* Constructors/Destructors */ /*::::::::::::::::::::::::::*/ /** Constructs a null 0x0 matrix. */ LaGenMatComplex(); /** Constructs a column-major matrix of size \f$m\times * n\f$. Matrix elements are NOT initialized! */ LaGenMatComplex(int m, int n); /** Constructs an \f$m\times n\f$ matrix by using the values * from the one-dimensional C array \c v of length \c m*n. * * \note If \c row_ordering is \c false, then the data will \e * not be copied but instead the C array will be shared * (shallow copy). In that case, you must not delete the C * array as long as you use this newly created matrix. Also, * if you need a copy (deep copy), construct one matrix \c A * by this constructor, and then copy this content into a * second matrix by \c B.copy(A). On the other hand, if \c * row_ordering is \c true, then the data will be copied * immediately (deep copy). * * \param v The one-dimensional C array of size \c m*n whose * data should be used. If \c row_ordering is \c false, then * the data will \e not be copied but shared (shallow * copy). If \c row_ordering is \c true, then the data will be * copied (deep copy). * * \param m The number of rows in the new matrix. * * \param n The number of columns in the new matrix. * * \param row_ordering If \c false, then the C array is used * in column-order, i.e. the first \c m elements of \c v are * used as the first column of the matrix, the next \c m * elements are the second column and so on. (This is the * default and this is also the internal storage format in * order to be compatible with the underlying Fortran * subroutines.) If this is \c true, then the C array is used * in row-order, i.e. the first \c n elements of \c v are used * as the first row of the matrix, the next \c n elements are * the second row and so on. (Internally, this is achieved by * allocating a new copy of the array and copying the array * into the internal ordering.) */ LaGenMatComplex(COMPLEX*v, int m, int n, bool row_ordering=false); /** Create a new matrix from an existing one by copying. * * Watch out! Due to the C++ "named return value optimization" * you cannot use this as an alias for copy() when declaring a * variable if the right-side is a return value of * operator(). More precisely, you cannot write the following: * \verbatim LaGenMatComplex x( y(LaIndex(),LaIndex()) ); // erroneous reference copy! \endverbatim * * Instead, if the initialization should create a new copy of * the right-side matrix, you have to write it this way: * \verbatim LaGenMatComplex x( y(LaIndex(),LaIndex()).copy() ); // correct deep-copy \endverbatim * * Or this way: * \verbatim LaGenMatComplex x; x = y(LaIndex(),LaIndex()); // correct deep-copy \endverbatim */ LaGenMatComplex(const LaGenMatComplex&); /** Create a new matrix from a separate real and imaginary * part. Uses \c s_real as real part and \c s_imag as imaginary * part. If \c s_imag is not given, an imaginary part of zero is * used. */ explicit LaGenMatComplex(const LaGenMatDouble& s_real, const LaGenMatDouble& s_imag = LaGenMatDouble()); /** Resize to a \e new matrix of size m x n. The element * values of the new matrix are \e uninitialized, even if * resizing to a smaller matrix. */ LaGenMatComplex& resize(int m, int n); /** Resize to a \e new matrix of the same size as the given * matrix s. The element values of the new matrix are \e * uninitialized, even if resizing to a smaller matrix. */ LaGenMatComplex& resize(const LaGenMatComplex& s); /** Destroy matrix and reclaim vector memory space if this is * the only structure using it. */ virtual ~LaGenMatComplex(); //@} /** @name Information Predicates */ //@{ /** Returns true if this is an all-zero matrix. (New in * lapackpp-2.4.5) */ bool is_zero() const; /** Returns true if this matrix is only a submatrix view of * another (larger) matrix. (New in lapackpp-2.4.4) */ bool is_submatrixview() const { return size(0) != gdim(0) || size(1) != gdim(1); }; /** Returns true if this matrix has unit stride. * * This is a necessary condition for not being a submatrix * view, but it's not sufficient. (New in lapackpp-2.4.4) */ bool has_unitstride() const { return inc(0) == 1 && inc(1) == 1; }; /** Returns true if the given matrix \c mat is exactly equal * to this object. (New in lapackpp-2.4.5) */ bool equal_to(const LaGenMatComplex& mat) const; //@} /** @name Information */ //@{ /*::::::::::::::::::::::::::::::::*/ /* Indices and access operations */ /*::::::::::::::::::::::::::::::::*/ /** Returns the length n of the dth dimension, i.e. for a M x
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -