Point Cloud Library (PCL)
1.15.1
Toggle main menu visibility
Loading...
Searching...
No Matches
pcl
surface
3rdparty
poisson4
sparse_matrix.h
1
/*
2
Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho
3
All rights reserved.
4
5
Redistribution and use in source and binary forms, with or without modification,
6
are permitted provided that the following conditions are met:
7
8
Redistributions of source code must retain the above copyright notice, this list of
9
conditions and the following disclaimer. Redistributions in binary form must reproduce
10
the above copyright notice, this list of conditions and the following disclaimer
11
in the documentation and/or other materials provided with the distribution.
12
13
Neither the name of the Johns Hopkins University nor the names of its contributors
14
may be used to endorse or promote products derived from this software without specific
15
prior written permission.
16
17
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
18
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES
19
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
20
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
22
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
25
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
26
DAMAGE.
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
39
namespace
pcl
40
{
41
namespace
poisson
42
{
43
44
template
<
class
T>
45
struct
MatrixEntry
46
{
47
MatrixEntry
(
void
) {
N
=-1;
Value
= 0; }
48
MatrixEntry
(
int
i ) {
N
= i;
Value
= 0; }
49
int
N
;
50
T
Value
;
51
};
52
53
template
<
class
T>
class
SparseMatrix
54
{
55
private
:
56
bool
_contiguous;
57
int
_maxEntriesPerRow;
58
static
int
UseAlloc;
59
public
:
60
static
Allocator<MatrixEntry<T>
>
internalAllocator
;
61
static
int
UseAllocator
(
void
);
62
static
void
SetAllocator
(
int
blockSize );
63
64
int
rows
;
65
int
*
rowSizes
;
66
MatrixEntry<T>
**
m_ppElements
;
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 );
79
~SparseMatrix
();
80
81
void
SetZero
();
82
void
SetIdentity
();
83
84
SparseMatrix<T>
&
operator =
(
const
SparseMatrix<T>
& M);
85
86
SparseMatrix<T>
operator *
(
const
T& V)
const
;
87
SparseMatrix<T>
&
operator *=
(
const
T& V);
88
89
90
SparseMatrix<T>
operator *
(
const
SparseMatrix<T>
& M)
const
;
91
SparseMatrix<T>
Multiply
(
const
SparseMatrix<T>
& M )
const
;
92
SparseMatrix<T>
MultiplyTranspose
(
const
SparseMatrix<T>
& Mt )
const
;
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
102
SparseMatrix<T>
Transpose
()
const
;
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 >
116
struct
MapReduceVector
117
{
118
private
:
119
int
_dim;
120
public
:
121
std::vector< T2* >
out
;
122
MapReduceVector
(
void
) { _dim = 0; }
123
~MapReduceVector
(
void
)
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 >
145
class
SparseSymmetricMatrix
:
public
SparseMatrix
< 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
pcl::poisson::Allocator
This templated class assists in memory allocation and is well suited for instances when it is known t...
Definition
allocator.h:50
pcl::poisson::SparseMatrix
Definition
sparse_matrix.h:54
pcl::poisson::SparseMatrix::m_ppElements
MatrixEntry< T > ** m_ppElements
Definition
sparse_matrix.h:66
pcl::poisson::SparseMatrix::read
bool read(FILE *fp)
Definition
sparse_matrix.hpp:142
pcl::poisson::SparseMatrix::rowSizes
int * rowSizes
Definition
sparse_matrix.h:65
pcl::poisson::SparseMatrix::Multiply
SparseMatrix< T > Multiply(const SparseMatrix< T > &M) const
Definition
sparse_matrix.hpp:265
pcl::poisson::SparseMatrix::Transpose
SparseMatrix< T > Transpose() const
Definition
sparse_matrix.hpp:324
pcl::poisson::SparseMatrix::SetAllocator
static void SetAllocator(int blockSize)
Definition
sparse_matrix.hpp:56
pcl::poisson::SparseMatrix::operator*=
SparseMatrix< T > & operator*=(const T &V)
Definition
sparse_matrix.hpp:255
pcl::poisson::SparseMatrix::SparseMatrix
SparseMatrix(void)
Definition
sparse_matrix.hpp:69
pcl::poisson::SparseMatrix::MultiplyTranspose
SparseMatrix< T > MultiplyTranspose(const SparseMatrix< T > &Mt) const
pcl::poisson::SparseMatrix::operator=
SparseMatrix< T > & operator=(const SparseMatrix< T > &M)
Definition
sparse_matrix.hpp:100
pcl::poisson::SparseMatrix::internalAllocator
static Allocator< MatrixEntry< T > > internalAllocator
Definition
sparse_matrix.h:60
pcl::poisson::SparseMatrix::operator[]
MatrixEntry< T > * operator[](int idx)
Definition
sparse_matrix.h:67
pcl::poisson::SparseMatrix::Resize
void Resize(int rows)
Definition
sparse_matrix.hpp:160
pcl::poisson::SparseMatrix::write
bool write(FILE *fp) const
Definition
sparse_matrix.hpp:134
pcl::poisson::SparseMatrix::SolveSymmetric
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)
Definition
sparse_matrix.hpp:339
pcl::poisson::SparseMatrix::SetRowSize
void SetRowSize(int row, int count)
Definition
sparse_matrix.hpp:206
pcl::poisson::SparseMatrix::Solve
static int Solve(const SparseMatrix< T > &M, const Vector< T > &b, int iters, Vector< T > &solution, const T eps=1e-8)
Definition
sparse_matrix.hpp:388
pcl::poisson::SparseMatrix::rows
int rows
Definition
sparse_matrix.h:64
pcl::poisson::SparseMatrix::operator*
SparseMatrix< T > operator*(const T &V) const
Definition
sparse_matrix.hpp:247
pcl::poisson::SparseMatrix::SetIdentity
void SetIdentity()
Definition
sparse_matrix.hpp:239
pcl::poisson::SparseMatrix::UseAllocator
static int UseAllocator(void)
Definition
sparse_matrix.hpp:54
pcl::poisson::SparseMatrix::Entries
int Entries(void) const
Definition
sparse_matrix.hpp:93
pcl::poisson::SparseMatrix::~SparseMatrix
~SparseMatrix()
Definition
sparse_matrix.hpp:113
pcl::poisson::SparseMatrix::SetZero
void SetZero()
Definition
sparse_matrix.hpp:229
pcl::poisson::SparseSymmetricMatrix
Definition
sparse_matrix.h:146
pcl::poisson::SparseSymmetricMatrix::Solve
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)
Definition
sparse_matrix.hpp:852
pcl::poisson::SparseSymmetricMatrix::getDiagonal
void getDiagonal(Vector< T2 > &diagonal) const
Definition
sparse_matrix.hpp:965
pcl::poisson::SparseSymmetricMatrix::operator*
Vector< T2 > operator*(const Vector< T2 > &V) const
Definition
sparse_matrix.hpp:422
pcl::poisson::SparseSymmetricMatrix::Multiply
Vector< T2 > Multiply(const Vector< T2 > &V) const
Definition
sparse_matrix.hpp:425
pcl::poisson::SparseSymmetricMatrix::SolveAtomic
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)
Definition
sparse_matrix.hpp:697
pcl::poisson::Vector
Definition
vector.h:42
pcl::poisson
Definition
allocator.h:36
pcl
Definition
convolution.h:46
pcl::poisson::MapReduceVector
Definition
sparse_matrix.h:117
pcl::poisson::MapReduceVector::out
std::vector< T2 * > out
Definition
sparse_matrix.h:121
pcl::poisson::MapReduceVector::~MapReduceVector
~MapReduceVector(void)
Definition
sparse_matrix.h:123
pcl::poisson::MapReduceVector::operator[]
T2 * operator[](int t)
Definition
sparse_matrix.h:128
pcl::poisson::MapReduceVector::threads
int threads(void) const
Definition
sparse_matrix.h:130
pcl::poisson::MapReduceVector::resize
void resize(int threads, int dim)
Definition
sparse_matrix.h:131
pcl::poisson::MapReduceVector::MapReduceVector
MapReduceVector(void)
Definition
sparse_matrix.h:122
pcl::poisson::MapReduceVector::operator[]
const T2 * operator[](int t) const
Definition
sparse_matrix.h:129
pcl::poisson::MatrixEntry
Definition
sparse_matrix.h:46
pcl::poisson::MatrixEntry::MatrixEntry
MatrixEntry(void)
Definition
sparse_matrix.h:47
pcl::poisson::MatrixEntry::Value
T Value
Definition
sparse_matrix.h:50
pcl::poisson::MatrixEntry::N
int N
Definition
sparse_matrix.h:49
pcl::poisson::MatrixEntry::MatrixEntry
MatrixEntry(int i)
Definition
sparse_matrix.h:48