Point Cloud Library (PCL) 1.14.0
Loading...
Searching...
No Matches
sparse_matrix.h
1/*
2Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho
3All rights reserved.
4
5Redistribution and use in source and binary forms, with or without modification,
6are permitted provided that the following conditions are met:
7
8Redistributions of source code must retain the above copyright notice, this list of
9conditions and the following disclaimer. Redistributions in binary form must reproduce
10the above copyright notice, this list of conditions and the following disclaimer
11in the documentation and/or other materials provided with the distribution.
12
13Neither the name of the Johns Hopkins University nor the names of its contributors
14may be used to endorse or promote products derived from this software without specific
15prior written permission.
16
17THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
18EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES
19OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
20SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
22TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
25ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
26DAMAGE.
27*/
28
29#ifndef __SPARSEMATRIX_HPP
30#define __SPARSEMATRIX_HPP
31
32#if defined __GNUC__
33# pragma GCC system_header
34#endif
35
36#include "vector.h"
37#include "allocator.h"
38
39namespace pcl
40{
41 namespace poisson
42 {
43
44 template <class T>
46 {
47 MatrixEntry( void ) { N =-1; Value = 0; }
48 MatrixEntry( int i ) { N = i; Value = 0; }
49 int N;
51 };
52
53 template<class T> class SparseMatrix
54 {
55 private:
56 bool _contiguous;
57 int _maxEntriesPerRow;
58 static int UseAlloc;
59 public:
61 static int UseAllocator(void);
62 static void SetAllocator( int blockSize );
63
64 int rows;
67 MatrixEntry< T >* operator[] ( int idx ) { return m_ppElements[idx]; }
68 const MatrixEntry< T >* operator[] ( int idx ) const { return m_ppElements[idx]; }
69
70 SparseMatrix( void );
71 SparseMatrix( int rows );
72 SparseMatrix( int rows , int maxEntriesPerRow );
73 void Resize( int rows );
74 void Resize( int rows , int maxEntriesPerRow );
75 void SetRowSize( int row , int count );
76 int Entries( void ) const;
77
78 SparseMatrix( const SparseMatrix& M );
80
81 void SetZero();
82 void SetIdentity();
83
85
86 SparseMatrix<T> operator * (const T& V) const;
87 SparseMatrix<T>& operator *= (const T& V);
88
89
93
94 template<class T2>
95 Vector<T2> operator * (const Vector<T2>& V) const;
96 template<class T2>
97 Vector<T2> Multiply( const Vector<T2>& V ) const;
98 template<class T2>
99 void Multiply( const Vector<T2>& In , Vector<T2>& Out , int threads=1 ) const;
100
101
103
104 static int Solve (const SparseMatrix<T>& M,const Vector<T>& b, int iters,Vector<T>& solution,const T eps=1e-8);
105
106 template<class T2>
107 static int SolveSymmetric( const SparseMatrix<T>& M , const Vector<T2>& b , int iters , Vector<T2>& solution , const T2 eps=1e-8 , int reset=1 , int threads=1 );
108
109 bool write( FILE* fp ) const;
110 bool write( const char* fileName ) const;
111 bool read( FILE* fp );
112 bool read( const char* fileName );
113 };
114
115 template< class T2 >
117 {
118 private:
119 int _dim;
120 public:
121 std::vector< T2* > out;
122 MapReduceVector( void ) { _dim = 0; }
124 {
125 if( _dim ) for( int t=0 ; t<int(out.size()) ; t++ ) delete[] out[t];
126 out.resize( 0 );
127 }
128 T2* operator[]( int t ) { return out[t]; }
129 const T2* operator[]( int t ) const { return out[t]; }
130 int threads( void ) const { return int( out.size() ); }
131 void resize( int threads , int dim )
132 {
133 if( threads!=out.size() || _dim<dim )
134 {
135 for( int t=0 ; t<int(out.size()) ; t++ ) delete[] out[t];
136 out.resize( threads );
137 for( int t=0 ; t<int(out.size()) ; t++ ) out[t] = new T2[dim];
138 _dim = dim;
139 }
140 }
141
142 };
143
144 template< class T >
146 {
147 public:
148
149 template< class T2 >
150 Vector< T2 > operator * ( const Vector<T2>& V ) const;
151
152 template< class T2 >
153 Vector< T2 > Multiply( const Vector<T2>& V ) const;
154
155 template< class T2 >
156 void Multiply( const Vector<T2>& In, Vector<T2>& Out , bool addDCTerm=false ) const;
157
158 template< class T2 >
159 void Multiply( const Vector<T2>& In, Vector<T2>& Out , MapReduceVector< T2 >& OutScratch , bool addDCTerm=false ) const;
160
161 template< class T2 >
162 void Multiply( const Vector<T2>& In, Vector<T2>& Out , std::vector< T2* >& OutScratch , const std::vector< int >& bounds ) const;
163
164 template< class T2 >
165 static int Solve( const SparseSymmetricMatrix<T>& M , const Vector<T2>& b , int iters , Vector<T2>& solution , T2 eps=1e-8 , int reset=1 , int threads=0 , bool addDCTerm=false , bool solveNormal=false );
166
167 template< class T2 >
168 static int Solve( const SparseSymmetricMatrix<T>& M , const Vector<T2>& b , int iters , Vector<T2>& solution , MapReduceVector<T2>& scratch , T2 eps=1e-8 , int reset=1 , bool addDCTerm=false , bool solveNormal=false );
169#if defined _WIN32 && !defined __MINGW32__
170 template< class T2 >
171 static int SolveAtomic( const SparseSymmetricMatrix<T>& M , const Vector<T2>& b , int iters , Vector<T2>& solution , T2 eps=1e-8 , int reset=1 , int threads=0 , bool solveNormal=false );
172#endif // _WIN32 || __MINGW32__
173 template<class T2>
174 static int Solve( const SparseSymmetricMatrix<T>& M , const Vector<T2>& diagonal , const Vector<T2>& b , int iters , Vector<T2>& solution , int reset=1 );
175
176 template< class T2 >
177 void getDiagonal( Vector< T2 >& diagonal ) const;
178 };
179
180
181 }
182}
183
184
185#include "sparse_matrix.hpp"
186
187#endif
188
This templated class assists in memory allocation and is well suited for instances when it is known t...
Definition allocator.h:50
MatrixEntry< T > ** m_ppElements
SparseMatrix< T > Multiply(const SparseMatrix< T > &M) const
SparseMatrix< T > Transpose() const
static void SetAllocator(int blockSize)
SparseMatrix< T > & operator*=(const T &V)
SparseMatrix< T > MultiplyTranspose(const SparseMatrix< T > &Mt) const
SparseMatrix< T > & operator=(const SparseMatrix< T > &M)
MatrixEntry< T > * operator[](int idx)
bool write(FILE *fp) const
static int SolveSymmetric(const SparseMatrix< T > &M, const Vector< T2 > &b, int iters, Vector< T2 > &solution, const T2 eps=1e-8, int reset=1, int threads=1)
void SetRowSize(int row, int count)
static int Solve(const SparseMatrix< T > &M, const Vector< T > &b, int iters, Vector< T > &solution, const T eps=1e-8)
SparseMatrix< T > operator*(const T &V) const
static int UseAllocator(void)
static Allocator< MatrixEntry< T > > internalAllocator
static int Solve(const SparseSymmetricMatrix< T > &M, const Vector< T2 > &b, int iters, Vector< T2 > &solution, T2 eps=1e-8, int reset=1, int threads=0, bool addDCTerm=false, bool solveNormal=false)
void getDiagonal(Vector< T2 > &diagonal) const
Vector< T2 > operator*(const Vector< T2 > &V) const
Vector< T2 > Multiply(const Vector< T2 > &V) const
static int SolveAtomic(const SparseSymmetricMatrix< T > &M, const Vector< T2 > &b, int iters, Vector< T2 > &solution, T2 eps=1e-8, int reset=1, int threads=0, bool solveNormal=false)
void resize(int threads, int dim)
const T2 * operator[](int t) const
MatrixEntry(void)
T Value
int N
MatrixEntry(int i)