00001 //Copyright (c) 2004-2005, Baris Sumengen 00002 //All rights reserved. 00003 // 00004 // CIMPL Matrix Performance Library 00005 // 00006 //Redistribution and use in source and binary 00007 //forms, with or without modification, are 00008 //permitted provided that the following 00009 //conditions are met: 00010 // 00011 // * No commercial use is allowed. 00012 // This software can only be used 00013 // for non-commercial purposes. This 00014 // distribution is mainly intended for 00015 // academic research and teaching. 00016 // * Redistributions of source code must 00017 // retain the above copyright notice, this 00018 // list of conditions and the following 00019 // disclaimer. 00020 // * Redistributions of binary form must 00021 // mention the above copyright notice, this 00022 // list of conditions and the following 00023 // disclaimer in a clearly visible part 00024 // in associated product manual, 00025 // readme, and web site of the redistributed 00026 // software. 00027 // * Redistributions in binary form must 00028 // reproduce the above copyright notice, 00029 // this list of conditions and the 00030 // following disclaimer in the 00031 // documentation and/or other materials 00032 // provided with the distribution. 00033 // * The name of Baris Sumengen may not be 00034 // used to endorse or promote products 00035 // derived from this software without 00036 // specific prior written permission. 00037 // 00038 //THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT 00039 //HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 00040 //EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT 00041 //NOT LIMITED TO, THE IMPLIED WARRANTIES OF 00042 //MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00043 //PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 00044 //CONTRIBUTORS BE LIABLE FOR ANY 00045 //DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00046 //EXEMPLARY, OR CONSEQUENTIAL DAMAGES 00047 //(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 00048 //OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 00049 //DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00050 //HOWEVER CAUSED AND ON ANY THEORY OF 00051 //LIABILITY, WHETHER IN CONTRACT, STRICT 00052 //LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 00053 //OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00054 //OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00055 //POSSIBILITY OF SUCH DAMAGE. 00056 00057 00058 00059 #pragma once 00060 #ifndef SPARSEMATRIX_H 00061 #define SPARSEMATRIX_H 00062 00063 template< class T > 00064 struct matrixCell 00065 { 00066 int x, y; 00067 T value; 00068 matrixCell *xNext; 00069 matrixCell *yNext; 00070 }; 00071 00072 template< class T > 00073 struct matrixCellStart 00074 { 00075 matrixCell<T> *first; 00076 int listCount; 00077 }; 00078 00079 00081 template< class T > 00082 class SparseMatrix 00083 { 00084 protected: 00085 matrixCellStart<T> *xDimStarts; // List of column starting points 00086 matrixCellStart<T> *yDimStarts; // List of row starting points 00087 int ndims; // always 2 00088 int *dims; // of length 2 00089 int count; // count of nonzero elements 00090 00091 00092 bool AddCellXStart(matrixCell<T> *c); 00093 bool AddCellYStart(matrixCell<T> *c); 00094 T GetCellXStart(const int x, const int y); 00095 T GetCellYStart(const int x, const int y); 00096 bool DeleteCell(const int x, const int y); 00097 00098 00099 00100 public: 00101 SparseMatrix(void); 00102 SparseMatrix(const int xdim, const int ydim); 00103 00104 ~SparseMatrix(void); 00105 00106 const int Columns() const; 00107 const int Rows() const; 00108 const int XDim() const; 00109 const int YDim() const; 00110 //const int* Dims() const; 00111 //const int* Size() const; 00112 //int const NDims() const; 00113 int const NNZ(void) const; 00114 00115 void SetValue(const int x, const int y, const T value); 00116 T GetValue(const int x, const int y); 00117 00118 00119 // OPERATORS 00120 00121 T operator() (const int i, const int j); 00122 00123 00124 }; 00125 00126 00127 00128 #include "./SparseMatrix.inl" 00129 00130 00131 #endif 00132