cv::SparseMat Class Reference 核心功能 » 基本结构


The class SparseMat represents multi-dimensional sparse numerical arrays. 更多...

#include <opencv2/core/mat.hpp>

Inheritance diagram for cv::SparseMat:
cv::SparseMat_< _Tp >

struct   Hdr
  the sparse matrix header 更多...
 
struct   Node
  sparse matrix node - element of a hash table 更多...
 

公共类型

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 构造函数。 更多...
 
  SparseMat (int dims , const int *_sizes, int _type)
 
  SparseMat (const SparseMat &m)
 
  SparseMat (const Mat &m)
 
  ~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. 更多...
 
SparseMat   clone () const CV_NODISCARD
  creates full copy of the 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  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  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
  返回 elemSize() /channels() 更多...
 
SparseMatIterator   end ()
  returns the sparse matrix iterator at the matrix end 更多...
 
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 更多...
 
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) 更多...
 
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) 更多...
 
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 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 更多...
 
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 >
_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 更多...
 
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
 

详细描述

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:
    const int dims = 5;
    int size[5] = {10, 10, 10, 10, 10};
    SparseMat sparse_mat(dims, size, CV_32F );
    for ( int i = 0; i < 1000; i++)
    {
    int idx[ dims ];
    for ( int k = 0; k < dims ; k++)
    idx[k] = rand() % size[k];
    sparse_mat.ref< float >(idx) += 1.f;
    }
    cout << "nnz = " << sparse_mat.nzcount() << endl;
  • Sparse matrix iterators. They are similar to MatIterator but different from NAryMatIterator . That is, the iteration loop is familiar to STL users:
    // 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 SparseMat::Node* n = it.node();
    printf( "(" );
    for ( int i = 0; i < dims ; i++)
    printf( "%d%s" , n->idx[i], i < dims-1 ? ", " : ")" );
    printf( ": %g\n" , it.value< float >());
    s += *it;
    }
    printf( "Element sum is %g\n" , s);
    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.
  • 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:
    double cross_corr( const SparseMat & a, const SparseMat & b)
    {
    const SparseMat *_a = &a, *_b = &b;
    // if b contains less elements than a,
    // it is 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 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 node
    float bvalue = _b->value< float >(anode->idx,&anode->hashval);
    ccorr += avalue*bvalue;
    }
    return ccorr;
    }

Member Typedef Documentation

◆  const_iterator

◆  iterator

Member Enumeration Documentation

◆  anonymous enum

anonymous enum
枚举器
MAGIC_VAL 
MAX_DIM 
HASH_SCALE 
HASH_BIT 

Constructor & Destructor Documentation

◆  SparseMat() [1/4]

cv::SparseMat::SparseMat ( )

Various SparseMat 构造函数。

◆  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.

参数
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.

参数
m Source matrix for copy constructor. If m is dense matrix (ocvMat) then it will be converted to sparse representation.

◆  SparseMat() [4/4]

cv::SparseMat::SparseMat ( const Mat m )
explicit

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

参数
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

成员函数文档编制

◆  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]

template<typename _Tp >
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]

template<typename _Tp >
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()

SparseMat cv::SparseMat::clone ( ) const

creates full copy of the matrix

◆  convertTo() [1/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

◆  convertTo() [2/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.

参数
[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

◆  copyTo() [1/2]

void cv::SparseMat::copyTo ( SparseMat m ) const

copies all the data to the destination matrix. All the previous content of m is erased

◆  copyTo() [2/2]

void cv::SparseMat::copyTo ( Mat m ) const

converts sparse matrix to dense matrix.

◆  create()

void cv::SparseMat::create ( int  dims ,
const int *  _sizes ,
int  _type  
)

reallocates sparse matrix.

If the matrix already had the proper size and type, it is simply cleared with clear() , otherwise, the old matrix is released (using release() ) and the new one is allocated.

◆  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

返回 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]

SparseMatConstIterator cv::SparseMat::end ( ) const

returns the read-only sparse matrix iterator at the matrix end

◆  end() [3/4]

template<typename _Tp >
SparseMatIterator_ <_Tp> cv::SparseMat::end ( )

returns the typed sparse matrix iterator at the matrix end

◆  end() [4/4]

template<typename _Tp >
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 ( int  i0 ,
int  i1 ,
size_t *  hashval = 0  
)

erases the specified element (2D 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 ( const int *  idx ,
size_t *  hashval = 0  
)

erases the specified element (nD case)

◆  find() [1/4]

template<typename _Tp >
const _Tp* cv::SparseMat::find ( int  i0 ,
size_t *  hashval = 0  
) const

returns pointer to the specified element (1D case)

Return pointer to the specified sparse matrix element if it exists

find<_Tp>(i0,...[,hashval]) 相当于 (_const Tp*)ptr(i0,...false[,hashval]) .

If the specified element does not exist, the methods return NULL.

◆  find() [2/4]

template<typename _Tp >
const _Tp* cv::SparseMat::find ( int  i0 ,
int  i1 ,
size_t *  hashval = 0  
) const

returns pointer to the specified element (2D case)

◆  find() [3/4]

template<typename _Tp >
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() [4/4]

template<typename _Tp >
const _Tp* cv::SparseMat::find ( const int *  idx ,
size_t *  hashval = 0  
) const

returns pointer to the specified element (nD case)

◆  hash() [1/4]

size_t cv::SparseMat::hash ( int  i0 ) const

computes the element hash value (1D case)

◆  hash() [2/4]

size_t cv::SparseMat::hash ( int  i0 ,
int  i1  
) const

computes the element hash value (2D case)

◆  hash() [3/4]

size_t cv::SparseMat::hash ( int  i0 ,
int  i1 ,
int  i2  
) const

computes the element hash value (3D case)

◆  hash() [4/4]

size_t cv::SparseMat::hash ( const int *  idx ) const

computes the element hash value (nD 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]

SparseMat & cv::SparseMat::operator= ( const SparseMat m )

assignment operator. This is O(1) operation, i.e. no data is copied

◆  operator=() [2/2]

SparseMat & cv::SparseMat::operator= ( const Mat m )

equivalent to the corresponding constructor

◆  ptr() [1/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() [2/4]

uchar * cv::SparseMat::ptr ( int  i0 ,
int  i1 ,
bool  createMissing ,
size_t *  hashval = 0  
)

returns pointer to the specified element (2D case)

◆  ptr() [3/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)

◆  ptr() [4/4]

uchar * cv::SparseMat::ptr ( const int *  idx ,
bool  createMissing ,
size_t *  hashval = 0  
)

returns pointer to the specified element (nD case)

◆  ref() [1/4]

template<typename _Tp >
_Tp& cv::SparseMat::ref ( int  i0 ,
size_t *  hashval = 0  
)

returns reference to the specified element (1D case)

return read-write reference to the specified sparse matrix element.

ref<_Tp>(i0,...[,hashval]) 相当于 *(_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.

◆  ref() [2/4]

template<typename _Tp >
_Tp& cv::SparseMat::ref ( int  i0 ,
int  i1 ,
size_t *  hashval = 0  
)

returns reference to the specified element (2D case)

◆  ref() [3/4]

template<typename _Tp >
_Tp& cv::SparseMat::ref ( int  i0 ,
int  i1 ,
int  i2 ,
size_t *  hashval = 0  
)

returns reference to the specified element (3D case)

◆  ref() [4/4]

template<typename _Tp >
_Tp& cv::SparseMat::ref ( const int *  idx ,
size_t *  hashval = 0  
)

returns reference to the specified element (nD case)

◆  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]

template<typename _Tp >
_Tp cv::SparseMat::value ( int  i0 ,
size_t *  hashval = 0  
) const

returns value of the specified element (1D case)

return value of the specified sparse matrix element.

value<_Tp>(i0,...[,hashval]) 相当于

{ const _Tp* p = find<_Tp>(i0,...[,hashval]); return p ? *p : _Tp(); }

That is, if the element did not exist, the methods return 0.

◆  value() [2/6]

template<typename _Tp >
_Tp cv::SparseMat::value ( int  i0 ,
int  i1 ,
size_t *  hashval = 0  
) const

returns value of the specified element (2D case)

◆  value() [3/6]

template<typename _Tp >
_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]

template<typename _Tp >
_Tp cv::SparseMat::value ( const int *  idx ,
size_t *  hashval = 0  
) const

returns value of the specified element (nD case)

◆  value() [5/6]

template<typename _Tp >
_Tp& cv::SparseMat::value ( Node n )

returns the value stored in the sparse martix node

◆  value() [6/6]

template<typename _Tp >
const _Tp& cv::SparseMat::value ( const Node n ) const

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: