The class SparseMat represents multi-dimensional sparse numerical arrays. More...
#include <opencv2/core/mat.hpp>
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 =32 , HASH_SCALE =0x5bd1e995 , HASH_BIT =0x80000000 } |
typedef SparseMatConstIterator | const_iterator |
typedef SparseMatIterator | iterator |
Public Member Functions | |
SparseMat () | |
Various SparseMat constructors. | |
SparseMat (const Mat &m) | |
SparseMat (const SparseMat &m) | |
SparseMat (int dims, const int *_sizes, int _type) | |
~SparseMat () | |
the destructor | |
void | addref () |
manually increments the reference counter to the header. | |
void | assignTo (SparseMat &m, int type=-1) const |
int | channels () const |
returns the number of channels | |
void | clear () |
sets all the sparse matrix elements to 0, which means clearing the hash table. | |
CV_NODISCARD_STD SparseMat | clone () const |
creates full copy of the matrix | |
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 | 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 | copyTo (Mat &m) const |
converts sparse matrix to dense matrix. | |
void | copyTo (SparseMat &m) const |
copies all the data to the destination matrix. All the previous content of m is erased | |
void | create (int dims, const int *_sizes, int _type) |
reallocates sparse matrix. | |
int | depth () const |
returns the depth of sparse matrix elements | |
int | dims () const |
returns the matrix dimensionality | |
size_t | elemSize () const |
converts sparse matrix to the old-style representation; all the elements are copied. | |
size_t | elemSize1 () const |
returns elemSize()/channels() | |
SparseMatIterator | end () |
returns the sparse matrix iterator at the matrix end | |
template<typename _Tp > | |
SparseMatIterator_< _Tp > | end () |
returns the typed sparse matrix iterator at the matrix end | |
SparseMatConstIterator | end () const |
returns the read-only 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 | |
void | erase (const int *idx, size_t *hashval=0) |
erases the specified element (nD case) | |
void | erase (int i0, int i1, int i2, size_t *hashval=0) |
erases the specified element (3D case) | |
void | erase (int i0, int i1, size_t *hashval=0) |
erases the specified element (2D case) | |
size_t | hash (const int *idx) const |
computes the element hash value (nD case) | |
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) | |
uchar * | newNode (const int *idx, size_t hashval) |
Node * | node (size_t nidx) |
const Node * | node (size_t nidx) const |
size_t | nzcount () const |
returns the number of non-zero elements (=the number of hash table nodes) | |
SparseMat & | operator= (const Mat &m) |
equivalent to the corresponding constructor | |
SparseMat & | operator= (const SparseMat &m) |
assignment operator. This is O(1) operation, i.e. no data is copied | |
void | release () |
void | removeNode (size_t hidx, size_t nidx, size_t previdx) |
void | resizeHashTab (size_t newsize) |
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 | type () const |
returns type of sparse matrix elements | |
template<typename _Tp > | |
const _Tp & | value (const Node *n) const |
returns the value stored in the sparse martix node | |
template<typename _Tp > | |
_Tp & | value (Node *n) |
returns the value stored in the sparse martix node | |
uchar * | ptr (int i0, bool createMissing, size_t *hashval=0) |
returns pointer to the specified element (1D 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) |
returns reference to the specified element (1D case) | |
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 |
returns value of the specified element (1D case) | |
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 |
returns pointer to the specified element (1D case) | |
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) | |
SparseMatIterator | begin () |
returns the sparse matrix iterator at the matrix beginning | |
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 |
Detailed Description
The class SparseMat represents multi-dimensional sparse numerical arrays.
Such a sparse array can store elements of any type that Mat can store. Sparse means that only non-zero elements are stored (though, as a result of operations on a sparse matrix, some of its stored elements can actually become 0. It is up to you to detect such elements and delete them using SparseMat::erase ). The non-zero elements are stored in a hash table that grows when it is filled so that the search time is O(1) in average (regardless of whether element is there or not). Elements can be accessed using the following methods:
- Query operations (SparseMat::ptr and the higher-level SparseMat::ref, SparseMat::value and SparseMat::find), for example: int size[5] = {10, 10, 10, 10, 10};for(int i = 0; i < 1000; i++){int idx[dims];idx[k] = rand() % size[k];sparse_mat.ref<float>(idx) += 1.f;}cout << "nnz = " << sparse_mat.nzcount() << endl;The class SparseMat represents multi-dimensional sparse numerical arrays.Definition: mat.hpp:2734const int * size() constreturns the array of sizes, or NULL if the matrix is not allocated
- Sparse matrix iterators. They are similar to MatIterator but different from NAryMatIterator. That is, the iteration loop is familiar to STL users: If you run this loop, you will notice that elements are not enumerated in a logical order (lexicographical, and so on). They come in the same order as they are stored in the hash table (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 may happen due to possible buffer reallocation.// prints elements of a sparse floating-point matrix// and the sum of elements.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 valueprintf("(");s += *it;}printf("Element sum is %g\n", s);const _Tp & value() consttemplate method returning the current matrix elementconst SparseMat::Node * node() constreturns the current node of the sparse matrix. it.node->idx is the current element index
- Combination of the above 2 methods when you need to process 2 or more sparse matrices simultaneously. For example, this is how you can compute unnormalized cross-correlation of the 2 floating-point sparse matrices: {const SparseMat *_a = &a, *_b = &b;// if b contains less elements than a,// it is faster to iterate through bif(_a->nzcount() > _b->nzcount())std::swap(_a, _b);it_end = _a->end<float>();double ccorr = 0;for(; it != it_end; ++it){// take the next element from the first matrixfloat avalue = *it;// and try to find an element with the same index in the second matrix.// since the hash value depends only on the element index,// reuse the hash value stored in the nodeccorr += avalue*bvalue;}return ccorr;}size_t nzcount() constreturns the number of non-zero elements (=the number of hash table nodes)SparseMatIterator begin()returns the sparse matrix iterator at the matrix beginning
Member Typedef Documentation
◆ const_iterator
◆ iterator
Member Enumeration Documentation
◆ anonymous enum
Constructor & Destructor Documentation
◆ SparseMat() [1/4]
cv::SparseMat::SparseMat | ( | ) |
Various SparseMat constructors.
◆ SparseMat() [2/4]
cv::SparseMat::SparseMat | ( | int | dims, |
const int * | _sizes, | ||
int | _type | ||
) |
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
- Parameters
-
dims Array dimensionality. _sizes Sparce matrix size on all dementions. _type Sparse matrix data type.
◆ SparseMat() [3/4]
cv::SparseMat::SparseMat | ( | const SparseMat & | m | ) |
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
- Parameters
-
m Source matrix for copy constructor. If m is dense matrix (ocvMat) then it will be converted to sparse representation.
◆ SparseMat() [4/4]
|
explicit |
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
- Parameters
-
m Source matrix for copy constructor. If m is dense matrix (ocvMat) then it will be converted to sparse representation.
◆ ~SparseMat()
cv::SparseMat::~SparseMat | ( | ) |
the destructor
Member Function Documentation
◆ addref()
void cv::SparseMat::addref | ( | ) |
manually increments the reference counter to the header.
◆ assignTo()
void cv::SparseMat::assignTo | ( | SparseMat & | m, |
int | type = -1 |
||
) | const |
◆ begin() [1/4]
SparseMatIterator cv::SparseMat::begin | ( | ) |
returns the sparse matrix iterator at the matrix beginning
return the sparse matrix iterator pointing to the first sparse matrix element
◆ begin() [2/4]
SparseMatIterator_< _Tp > cv::SparseMat::begin | ( | ) |
returns the sparse matrix iterator at the matrix beginning
◆ begin() [3/4]
SparseMatConstIterator cv::SparseMat::begin | ( | ) | const |
returns the read-only sparse matrix iterator at the matrix beginning
◆ begin() [4/4]
SparseMatConstIterator_< _Tp > cv::SparseMat::begin | ( | ) | const |
returns the read-only sparse matrix iterator at the matrix beginning
◆ channels()
int cv::SparseMat::channels | ( | ) | const |
returns the number of channels
◆ clear()
void cv::SparseMat::clear | ( | ) |
sets all the sparse matrix elements to 0, which means clearing the hash table.
◆ clone()
CV_NODISCARD_STD SparseMat cv::SparseMat::clone | ( | ) | const |
creates full copy of the matrix
◆ convertTo() [1/2]
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.
- Parameters
-
[out] m - output matrix; if it does not have a proper size or type before the operation, it is reallocated [in] rtype - desired output matrix type or, rather, the depth since the number of channels are the same as the input has; if rtype is negative, the output matrix will have the same type as the input. [in] alpha - optional scale factor [in] beta - optional delta added to the scaled values
◆ convertTo() [2/2]
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
◆ copyTo() [1/2]
void cv::SparseMat::copyTo | ( | Mat & | m | ) | const |
converts sparse matrix to dense matrix.
◆ copyTo() [2/2]
void cv::SparseMat::copyTo | ( | SparseMat & | m | ) | const |
copies all the data to the destination matrix. All the previous content of m is erased
◆ create()
void cv::SparseMat::create | ( | int | dims, |
const int * | _sizes, | ||
int | _type | ||
) |
◆ depth()
int cv::SparseMat::depth | ( | ) | const |
returns the depth of sparse matrix elements
◆ dims()
int cv::SparseMat::dims | ( | ) | const |
returns the matrix dimensionality
◆ elemSize()
size_t cv::SparseMat::elemSize | ( | ) | const |
converts sparse matrix to the old-style representation; all the elements are copied.
returns the size of each element in bytes (not including the overhead - the space occupied by SparseMat::Node elements)
◆ elemSize1()
size_t cv::SparseMat::elemSize1 | ( | ) | const |
returns elemSize()/channels()
◆ end() [1/4]
SparseMatIterator cv::SparseMat::end | ( | ) |
returns the sparse matrix iterator at the matrix end
return the sparse matrix iterator pointing to the element following the last sparse matrix element
◆ end() [2/4]
SparseMatIterator_< _Tp > cv::SparseMat::end | ( | ) |
returns the typed sparse matrix iterator at the matrix end
◆ end() [3/4]
SparseMatConstIterator cv::SparseMat::end | ( | ) | const |
returns the read-only sparse matrix iterator at the matrix end
◆ end() [4/4]
SparseMatConstIterator_< _Tp > cv::SparseMat::end | ( | ) | const |
returns the typed read-only sparse matrix iterator at the matrix end
◆ erase() [1/3]
void cv::SparseMat::erase | ( | const int * | idx, |
size_t * | hashval = 0 |
||
) |
erases the specified element (nD case)
◆ erase() [2/3]
void cv::SparseMat::erase | ( | int | i0, |
int | i1, | ||
int | i2, | ||
size_t * | hashval = 0 |
||
) |
erases the specified element (3D case)
◆ erase() [3/3]
void cv::SparseMat::erase | ( | int | i0, |
int | i1, | ||
size_t * | hashval = 0 |
||
) |
erases the specified element (2D case)
◆ find() [1/4]
const _Tp * cv::SparseMat::find | ( | const int * | idx, |
size_t * | hashval = 0 |
||
) | const |
returns pointer to the specified element (nD case)
◆ find() [2/4]
const _Tp * cv::SparseMat::find | ( | int | i0, |
int | i1, | ||
int | i2, | ||
size_t * | hashval = 0 |
||
) | const |
returns pointer to the specified element (3D case)
◆ find() [3/4]
const _Tp * cv::SparseMat::find | ( | int | i0, |
int | i1, | ||
size_t * | hashval = 0 |
||
) | const |
returns pointer to the specified element (2D case)
◆ find() [4/4]
returns pointer to the specified element (1D case)
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.
◆ hash() [1/4]
size_t cv::SparseMat::hash | ( | const int * | idx | ) | const |
computes the element hash value (nD case)
◆ hash() [2/4]
size_t cv::SparseMat::hash | ( | int | i0 | ) | const |
computes the element hash value (1D case)
◆ hash() [3/4]
size_t cv::SparseMat::hash | ( | int | i0, |
int | i1 | ||
) | const |
computes the element hash value (2D case)
◆ hash() [4/4]
size_t cv::SparseMat::hash | ( | int | i0, |
int | i1, | ||
int | i2 | ||
) | const |
computes the element hash value (3D case)
◆ newNode()
uchar * cv::SparseMat::newNode | ( | const int * | idx, |
size_t | hashval | ||
) |
◆ node() [1/2]
Node * cv::SparseMat::node | ( | size_t | nidx | ) |
◆ node() [2/2]
const Node * cv::SparseMat::node | ( | size_t | nidx | ) | const |
◆ nzcount()
size_t cv::SparseMat::nzcount | ( | ) | const |
returns the number of non-zero elements (=the number of hash table nodes)
◆ operator=() [1/2]
◆ operator=() [2/2]
assignment operator. This is O(1) operation, i.e. no data is copied
◆ ptr() [1/4]
uchar * cv::SparseMat::ptr | ( | const int * | idx, |
bool | createMissing, | ||
size_t * | hashval = 0 |
||
) |
returns pointer to the specified element (nD case)
◆ ptr() [2/4]
uchar * cv::SparseMat::ptr | ( | int | i0, |
bool | createMissing, | ||
size_t * | hashval = 0 |
||
) |
returns pointer to the specified element (1D case)
specialized variants for 1D, 2D, 3D cases and the generic_type one for n-D case. return pointer to the matrix element.
- if the element is there (it's non-zero), the pointer to it is returned
- if it's not there and createMissing=false, NULL pointer is returned
- if it's not there and createMissing=true, then the new element is created and initialized with 0. Pointer to it is returned
- if the optional hashval pointer is not NULL, the element hash value is not computed, but *hashval is taken instead.
◆ ptr() [3/4]
uchar * cv::SparseMat::ptr | ( | int | i0, |
int | i1, | ||
bool | createMissing, | ||
size_t * | hashval = 0 |
||
) |
returns pointer to the specified element (2D case)
◆ ptr() [4/4]
uchar * cv::SparseMat::ptr | ( | int | i0, |
int | i1, | ||
int | i2, | ||
bool | createMissing, | ||
size_t * | hashval = 0 |
||
) |
returns pointer to the specified element (3D case)
◆ ref() [1/4]
returns reference to the specified element (nD case)
◆ ref() [2/4]
returns reference to the specified element (3D case)
◆ ref() [3/4]
returns reference to the specified element (2D case)
◆ ref() [4/4]
returns reference to the specified element (1D case)
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 initialized with 0.
◆ release()
void cv::SparseMat::release | ( | ) |
◆ removeNode()
void cv::SparseMat::removeNode | ( | size_t | hidx, |
size_t | nidx, | ||
size_t | previdx | ||
) |
◆ resizeHashTab()
void cv::SparseMat::resizeHashTab | ( | size_t | newsize | ) |
◆ size() [1/2]
const int * cv::SparseMat::size | ( | ) | const |
returns the array of sizes, or NULL if the matrix is not allocated
◆ size() [2/2]
int cv::SparseMat::size | ( | int | i | ) | const |
returns the size of i-th matrix dimension (or 0)
◆ type()
int cv::SparseMat::type | ( | ) | const |
returns type of sparse matrix elements
◆ value() [1/6]
returns value of the specified element (nD case)
◆ value() [2/6]
returns the value stored in the sparse martix node
◆ value() [3/6]
_Tp cv::SparseMat::value | ( | int | i0, |
int | i1, | ||
int | i2, | ||
size_t * | hashval = 0 |
||
) | const |
returns value of the specified element (3D case)
◆ value() [4/6]
returns value of the specified element (2D case)
◆ value() [5/6]
◆ value() [6/6]
returns the value stored in the sparse martix node
Member Data Documentation
◆ flags
int cv::SparseMat::flags |
◆ hdr
Hdr* cv::SparseMat::hdr |
The documentation for this class was generated from the following file:
- opencv2/core/mat.hpp