Sparse matrix class. More...
#include <core.hpp>
Inherited by cv::SparseMat_< _Tp >.
Classes | |
struct | Hdr |
the sparse matrix header More... | |
struct | Node |
sparse matrix node - element of a hash table More... | |
Public Types | |
enum | { MAGIC_VAL = 0x42FD0000, MAX_DIM = CV_MAX_DIM, HASH_SCALE = 0x5bd1e995, HASH_BIT = 0x80000000 } |
typedef SparseMatIterator | iterator |
typedef SparseMatConstIterator | const_iterator |
Public Member Functions | |
SparseMat () | |
default constructor | |
SparseMat (int dims, const int *_sizes, int _type) | |
creates matrix of the specified size and type | |
SparseMat (const SparseMat &m) | |
copy constructor | |
SparseMat (const Mat &m) | |
converts dense 2d matrix to the sparse form | |
SparseMat (const CvSparseMat *m) | |
converts old-style sparse matrix to the new-style. All the data is copied | |
~SparseMat () | |
the destructor | |
SparseMat & | operator= (const SparseMat &m) |
assignment operator. This is O(1) operation, i.e. no data is copied | |
SparseMat & | operator= (const Mat &m) |
equivalent to the corresponding constructor | |
SparseMat | clone () const |
creates full copy of the matrix | |
void | copyTo (SparseMat &m) const |
copies all the data to the destination matrix. All the previous content of m is erased | |
void | copyTo (Mat &m) const |
converts sparse matrix to dense matrix. | |
void | convertTo (SparseMat &m, int rtype, double alpha=1) const |
multiplies all the matrix elements by the specified scale factor alpha and converts the results to the specified data type | |
void | convertTo (Mat &m, int rtype, double alpha=1, double beta=0) const |
converts sparse matrix to dense n-dim matrix with optional type conversion and scaling. | |
void | assignTo (SparseMat &m, int type=-1) const |
void | create (int dims, const int *_sizes, int _type) |
reallocates sparse matrix. | |
void | clear () |
sets all the sparse matrix elements to 0, which means clearing the hash table. | |
void | addref () |
manually increments the reference counter to the header. | |
void | release () |
operator CvSparseMat * () const | |
converts sparse matrix to the old-style representation; all the elements are copied. | |
size_t | elemSize () const |
returns the size of each element in bytes (not including the overhead - the space occupied by SparseMat::Node elements) | |
size_t | elemSize1 () const |
returns elemSize()/channels() | |
int | type () const |
returns type of sparse matrix elements | |
int | depth () const |
returns the depth of sparse matrix elements | |
int | channels () const |
returns the number of channels | |
const int * | size () const |
returns the array of sizes, or NULL if the matrix is not allocated | |
int | size (int i) const |
returns the size of i-th matrix dimension (or 0) | |
int | dims () const |
returns the matrix dimensionality | |
size_t | nzcount () const |
returns the number of non-zero elements (=the number of hash table nodes) | |
size_t | hash (int i0) const |
computes the element hash value (1D case) | |
size_t | hash (int i0, int i1) const |
computes the element hash value (2D case) | |
size_t | hash (int i0, int i1, int i2) const |
computes the element hash value (3D case) | |
size_t | hash (const int *idx) const |
computes the element hash value (nD case) | |
SparseMatIterator | end () |
return the sparse matrix iterator pointing to the element following the last sparse matrix element | |
SparseMatConstIterator | end () const |
returns the read-only sparse matrix iterator at the matrix end | |
template<typename _Tp > | |
SparseMatIterator_< _Tp > | end () |
returns the typed sparse matrix iterator at the matrix end | |
template<typename _Tp > | |
SparseMatConstIterator_< _Tp > | end () const |
returns the typed read-only sparse matrix iterator at the matrix end | |
template<typename _Tp > | |
_Tp & | value (Node *n) |
returns the value stored in the sparse martix node | |
template<typename _Tp > | |
const _Tp & | value (const Node *n) const |
returns the value stored in the sparse martix node | |
Node * | node (size_t nidx) |
const Node * | node (size_t nidx) const |
uchar * | newNode (const int *idx, size_t hashval) |
void | removeNode (size_t hidx, size_t nidx, size_t previdx) |
void | resizeHashTab (size_t newsize) |
uchar * | ptr (int i0, bool createMissing, size_t *hashval=0) |
specialized variants for 1D, 2D, 3D cases and the generic_type one for n-D case. | |
uchar * | ptr (int i0, int i1, bool createMissing, size_t *hashval=0) |
returns pointer to the specified element (2D case) | |
uchar * | ptr (int i0, int i1, int i2, bool createMissing, size_t *hashval=0) |
returns pointer to the specified element (3D case) | |
uchar * | ptr (const int *idx, bool createMissing, size_t *hashval=0) |
returns pointer to the specified element (nD case) | |
template<typename _Tp > | |
_Tp & | ref (int i0, size_t *hashval=0) |
return read-write reference to the specified sparse matrix element. | |
template<typename _Tp > | |
_Tp & | ref (int i0, int i1, size_t *hashval=0) |
returns reference to the specified element (2D case) | |
template<typename _Tp > | |
_Tp & | ref (int i0, int i1, int i2, size_t *hashval=0) |
returns reference to the specified element (3D case) | |
template<typename _Tp > | |
_Tp & | ref (const int *idx, size_t *hashval=0) |
returns reference to the specified element (nD case) | |
template<typename _Tp > | |
_Tp | value (int i0, size_t *hashval=0) const |
return value of the specified sparse matrix element. | |
template<typename _Tp > | |
_Tp | value (int i0, int i1, size_t *hashval=0) const |
returns value of the specified element (2D case) | |
template<typename _Tp > | |
_Tp | value (int i0, int i1, int i2, size_t *hashval=0) const |
returns value of the specified element (3D case) | |
template<typename _Tp > | |
_Tp | value (const int *idx, size_t *hashval=0) const |
returns value of the specified element (nD case) | |
template<typename _Tp > | |
const _Tp * | find (int i0, size_t *hashval=0) const |
Return pointer to the specified sparse matrix element if it exists. | |
template<typename _Tp > | |
const _Tp * | find (int i0, int i1, size_t *hashval=0) const |
returns pointer to the specified element (2D case) | |
template<typename _Tp > | |
const _Tp * | find (int i0, int i1, int i2, size_t *hashval=0) const |
returns pointer to the specified element (3D case) | |
template<typename _Tp > | |
const _Tp * | find (const int *idx, size_t *hashval=0) const |
returns pointer to the specified element (nD case) | |
void | erase (int i0, int i1, size_t *hashval=0) |
erases the specified element (2D case) | |
void | erase (int i0, int i1, int i2, size_t *hashval=0) |
erases the specified element (3D case) | |
void | erase (const int *idx, size_t *hashval=0) |
erases the specified element (nD case) | |
SparseMatIterator | begin () |
return the sparse matrix iterator pointing to the first sparse matrix element | |
template<typename _Tp > | |
SparseMatIterator_< _Tp > | begin () |
returns the sparse matrix iterator at the matrix beginning | |
SparseMatConstIterator | begin () const |
returns the read-only sparse matrix iterator at the matrix beginning | |
template<typename _Tp > | |
SparseMatConstIterator_< _Tp > | begin () const |
returns the read-only sparse matrix iterator at the matrix beginning | |
Public Attributes | |
int | flags |
Hdr * | hdr |
Sparse matrix class.
The class represents multi-dimensional sparse numerical arrays. Such a sparse array can store elements of any type that cv::Mat is able to store. "Sparse" means that only non-zero elements are stored (though, as a result of some operations on a sparse matrix, some of its stored elements can actually become 0. It's user responsibility to detect such elements and delete them using cv::SparseMat::erase(). The non-zero elements are stored in a hash table that grows when it's filled enough, so that the search time remains O(1) in average. Elements can be accessed using the following methods:
Query operations: cv::SparseMat::ptr() and the higher-level cv::SparseMat::ref(), cv::SparseMat::value() and cv::SparseMat::find, for example:
Sparse matrix iterators. Like cv::Mat iterators and unlike cv::Mat iterators, the sparse matrix iterators are STL-style, that is, the iteration is done as following:
// prints elements of a sparse floating-point matrix and the sum of elements. SparseMatConstIterator_<float> it = sparse_mat.begin<float>(), it_end = sparse_mat.end<float>(); double s = 0; int dims = sparse_mat.dims(); for(; it != it_end; ++it) { // print element indices and the element value const Node* n = it.node(); printf("(") for(int i = 0; i < dims; i++) printf("%3d%c", n->idx[i], i < dims-1 ? ',' : ')'); printf(": %f\n", *it); s += *it; } printf("Element sum is %g\n", s);
If you run this loop, you will notice that elements are enumerated in no any logical order (lexicographical etc.), they come in the same order as they stored in the hash table, i.e. semi-randomly.
You may collect pointers to the nodes and sort them to get the proper ordering. Note, however, that pointers to the nodes may become invalid when you add more elements to the matrix; this is because of possible buffer reallocation.
double crossCorr(const SparseMat& a, const SparseMat& b) { const SparseMat *_a = &a, *_b = &b; // if b contains less elements than a, // it's faster to iterate through b if(_a->nzcount() > _b->nzcount()) std::swap(_a, _b); SparseMatConstIterator_<float> it = _a->begin<float>(), it_end = _a->end<float>(); double ccorr = 0; for(; it != it_end; ++it) { // take the next element from the first matrix float avalue = *it; const Node* anode = it.node(); // and try to find element with the same index in the second matrix. // since the hash value depends only on the element index, // we reuse hashvalue stored in the node float bvalue = _b->value<float>(anode->idx,&anode->hashval); ccorr += avalue*bvalue; } return ccorr; }
Reimplemented in cv::SparseMat_< _Tp >.
Reimplemented in cv::SparseMat_< _Tp >.
default constructor
cv::SparseMat::SparseMat | ( | int | dims, |
const int * | _sizes, | ||
int | _type | ||
) |
creates matrix of the specified size and type
cv::SparseMat::SparseMat | ( | const SparseMat & | m | ) |
copy constructor
cv::SparseMat::SparseMat | ( | const Mat & | m | ) | [explicit] |
converts dense 2d matrix to the sparse form
m | the input matrix |
try1d | if true and m is a single-column matrix (Nx1), then the sparse matrix will be 1-dimensional. |
cv::SparseMat::SparseMat | ( | const CvSparseMat * | m | ) |
converts old-style sparse matrix to the new-style. All the data is copied
the destructor
assignment operator. This is O(1) operation, i.e. no data is copied
Reimplemented in cv::SparseMat_< _Tp >.
equivalent to the corresponding constructor
Reimplemented in cv::SparseMat_< _Tp >.
SparseMat cv::SparseMat::clone | ( | ) | const |
creates full copy of the matrix
Reimplemented in cv::SparseMat_< _Tp >.
void cv::SparseMat::copyTo | ( | SparseMat & | m | ) | const |
copies all the data to the destination matrix. All the previous content of m is erased
void cv::SparseMat::copyTo | ( | Mat & | m | ) | const |
converts sparse matrix to dense matrix.
void cv::SparseMat::convertTo | ( | SparseMat & | m, |
int | rtype, | ||
double | alpha = 1 |
||
) | const |
multiplies all the matrix elements by the specified scale factor alpha and converts the results to the specified data type
void cv::SparseMat::convertTo | ( | Mat & | m, |
int | rtype, | ||
double | alpha = 1 , |
||
double | beta = 0 |
||
) | const |
converts sparse matrix to dense n-dim matrix with optional type conversion and scaling.
rtype | The output matrix data type. When it is =-1, the output array will have the same data type as (*this) |
alpha | The scale factor |
beta | The optional delta added to the scaled values before the conversion |
void cv::SparseMat::assignTo | ( | SparseMat & | m, |
int | type = -1 |
||
) | const |
void cv::SparseMat::create | ( | int | dims, |
const int * | _sizes, | ||
int | _type | ||
) |
sets all the sparse matrix elements to 0, which means clearing the hash table.
manually increments the reference counter to the header.
cv::SparseMat::operator CvSparseMat * | ( | ) | const |
converts sparse matrix to the old-style representation; all the elements are copied.
Reimplemented in cv::SparseMat_< _Tp >.
size_t cv::SparseMat::elemSize | ( | ) | const |
returns the size of each element in bytes (not including the overhead - the space occupied by SparseMat::Node elements)
size_t cv::SparseMat::elemSize1 | ( | ) | const |
returns elemSize()/channels()
int cv::SparseMat::type | ( | ) | const |
returns type of sparse matrix elements
Reimplemented in cv::SparseMat_< _Tp >.
int cv::SparseMat::depth | ( | ) | const |
returns the depth of sparse matrix elements
Reimplemented in cv::SparseMat_< _Tp >.
int cv::SparseMat::channels | ( | ) | const |
returns the number of channels
Reimplemented in cv::SparseMat_< _Tp >.
const int * cv::SparseMat::size | ( | ) | const |
returns the array of sizes, or NULL if the matrix is not allocated
int cv::SparseMat::size | ( | int | i | ) | const |
returns the size of i-th matrix dimension (or 0)
int cv::SparseMat::dims | ( | ) | const |
returns the matrix dimensionality
size_t cv::SparseMat::nzcount | ( | ) | const |
returns the number of non-zero elements (=the number of hash table nodes)
size_t cv::SparseMat::hash | ( | int | i0 | ) | const |
computes the element hash value (1D case)
size_t cv::SparseMat::hash | ( | int | i0, |
int | i1 | ||
) | const |
computes the element hash value (2D case)
size_t cv::SparseMat::hash | ( | int | i0, |
int | i1, | ||
int | i2 | ||
) | const |
computes the element hash value (3D case)
size_t cv::SparseMat::hash | ( | const int * | idx | ) | const |
computes the element hash value (nD case)
uchar* cv::SparseMat::ptr | ( | int | i0, |
bool | createMissing, | ||
size_t * | hashval = 0 |
||
) |
specialized variants for 1D, 2D, 3D cases and the generic_type one for n-D case.
return pointer to the matrix element.
returns pointer to the specified element (1D case)
uchar* cv::SparseMat::ptr | ( | int | i0, |
int | i1, | ||
bool | createMissing, | ||
size_t * | hashval = 0 |
||
) |
returns pointer to the specified element (2D case)
uchar* cv::SparseMat::ptr | ( | int | i0, |
int | i1, | ||
int | i2, | ||
bool | createMissing, | ||
size_t * | hashval = 0 |
||
) |
returns pointer to the specified element (3D case)
uchar* cv::SparseMat::ptr | ( | const int * | idx, |
bool | createMissing, | ||
size_t * | hashval = 0 |
||
) |
returns pointer to the specified element (nD case)
_Tp & cv::SparseMat::ref | ( | int | i0, |
size_t * | hashval = 0 |
||
) |
return read-write reference to the specified sparse matrix element.
ref<_Tp>(i0,...[,hashval]) is equivalent to *(_Tp*)ptr(i0,...,true[,hashval]). The methods always return a valid reference. If the element did not exist, it is created and initialiazed with 0. returns reference to the specified element (1D case)
Reimplemented in cv::SparseMat_< _Tp >.
_Tp & cv::SparseMat::ref | ( | int | i0, |
int | i1, | ||
size_t * | hashval = 0 |
||
) |
returns reference to the specified element (2D case)
Reimplemented in cv::SparseMat_< _Tp >.
_Tp & cv::SparseMat::ref | ( | int | i0, |
int | i1, | ||
int | i2, | ||
size_t * | hashval = 0 |
||
) |
returns reference to the specified element (3D case)
Reimplemented in cv::SparseMat_< _Tp >.
_Tp & cv::SparseMat::ref | ( | const int * | idx, |
size_t * | hashval = 0 |
||
) |
returns reference to the specified element (nD case)
Reimplemented in cv::SparseMat_< _Tp >.
_Tp cv::SparseMat::value | ( | int | i0, |
size_t * | hashval = 0 |
||
) | const |
return value of the specified sparse matrix element.
value<_Tp>(i0,...[,hashval]) is equivalent
{ const _Tp* p = find<_Tp>(i0,...[,hashval]); return p ? *p : _Tp(); }
That is, if the element did not exist, the methods return 0. returns value of the specified element (1D case)
_Tp cv::SparseMat::value | ( | int | i0, |
int | i1, | ||
size_t * | hashval = 0 |
||
) | const |
returns value of the specified element (2D case)
_Tp cv::SparseMat::value | ( | int | i0, |
int | i1, | ||
int | i2, | ||
size_t * | hashval = 0 |
||
) | const |
returns value of the specified element (3D case)
_Tp cv::SparseMat::value | ( | const int * | idx, |
size_t * | hashval = 0 |
||
) | const |
returns value of the specified element (nD case)
const _Tp * cv::SparseMat::find | ( | int | i0, |
size_t * | hashval = 0 |
||
) | const |
Return pointer to the specified sparse matrix element if it exists.
find<_Tp>(i0,...[,hashval]) is equivalent to (_const Tp*)ptr(i0,...false[,hashval]).
If the specified element does not exist, the methods return NULL. returns pointer to the specified element (1D case)
const _Tp * cv::SparseMat::find | ( | int | i0, |
int | i1, | ||
size_t * | hashval = 0 |
||
) | const |
returns pointer to the specified element (2D case)
const _Tp * cv::SparseMat::find | ( | int | i0, |
int | i1, | ||
int | i2, | ||
size_t * | hashval = 0 |
||
) | const |
returns pointer to the specified element (3D case)
const _Tp * cv::SparseMat::find | ( | const int * | idx, |
size_t * | hashval = 0 |
||
) | const |
returns pointer to the specified element (nD case)
void cv::SparseMat::erase | ( | int | i0, |
int | i1, | ||
size_t * | hashval = 0 |
||
) |
erases the specified element (2D case)
void cv::SparseMat::erase | ( | int | i0, |
int | i1, | ||
int | i2, | ||
size_t * | hashval = 0 |
||
) |
erases the specified element (3D case)
void cv::SparseMat::erase | ( | const int * | idx, |
size_t * | hashval = 0 |
||
) |
erases the specified element (nD case)
SparseMatIterator_< _Tp > cv::SparseMat::begin | ( | ) |
return the sparse matrix iterator pointing to the first sparse matrix element
returns the sparse matrix iterator at the matrix beginning
Reimplemented in cv::SparseMat_< _Tp >.
SparseMatIterator_<_Tp> cv::SparseMat::begin | ( | ) |
returns the sparse matrix iterator at the matrix beginning
Reimplemented in cv::SparseMat_< _Tp >.
SparseMatConstIterator_< _Tp > cv::SparseMat::begin | ( | ) | const |
returns the read-only sparse matrix iterator at the matrix beginning
Reimplemented in cv::SparseMat_< _Tp >.
SparseMatConstIterator_<_Tp> cv::SparseMat::begin | ( | ) | const |
returns the read-only sparse matrix iterator at the matrix beginning
Reimplemented in cv::SparseMat_< _Tp >.
SparseMatIterator_< _Tp > cv::SparseMat::end | ( | ) |
return the sparse matrix iterator pointing to the element following the last sparse matrix element
returns the sparse matrix iterator at the matrix end
Reimplemented in cv::SparseMat_< _Tp >.
SparseMatConstIterator_< _Tp > cv::SparseMat::end | ( | ) | const |
returns the read-only sparse matrix iterator at the matrix end
Reimplemented in cv::SparseMat_< _Tp >.
SparseMatIterator_<_Tp> cv::SparseMat::end | ( | ) |
returns the typed sparse matrix iterator at the matrix end
Reimplemented in cv::SparseMat_< _Tp >.
SparseMatConstIterator_<_Tp> cv::SparseMat::end | ( | ) | const |
returns the typed read-only sparse matrix iterator at the matrix end
Reimplemented in cv::SparseMat_< _Tp >.
_Tp & cv::SparseMat::value | ( | Node * | n | ) |
returns the value stored in the sparse martix node
const _Tp & cv::SparseMat::value | ( | const Node * | n | ) | const |
returns the value stored in the sparse martix node
SparseMat::Node * cv::SparseMat::node | ( | size_t | nidx | ) |
const SparseMat::Node * cv::SparseMat::node | ( | size_t | nidx | ) | const |
uchar* cv::SparseMat::newNode | ( | const int * | idx, |
size_t | hashval | ||
) |
void cv::SparseMat::removeNode | ( | size_t | hidx, |
size_t | nidx, | ||
size_t | previdx | ||
) |
void cv::SparseMat::resizeHashTab | ( | size_t | newsize | ) |