SparseMat

Struct SparseMat 

Source
pub struct SparseMat { /* private fields */ }
Expand 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:
    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;
    }

Implementations§

Source§

impl SparseMat

Source

pub fn default() -> Result<SparseMat>

Various SparseMat constructors.

Source

pub fn new(_sizes: &[i32], _type: i32) -> Result<SparseMat>

Various SparseMat constructors.

§Overloaded parameters
§Parameters
  • dims: Array dimensionality.
  • _sizes: Sparce matrix size on all dementions.
  • _type: Sparse matrix data type.
Source

pub fn copy(m: &impl SparseMatTraitConst) -> Result<SparseMat>

Various SparseMat constructors.

§Overloaded parameters
§Parameters
  • m: Source matrix for copy constructor. If m is dense matrix (ocvMat) then it will be converted to sparse representation.
Source

pub fn from_mat(m: &impl MatTraitConst) -> Result<SparseMat>

Various SparseMat constructors.

§Overloaded parameters
§Parameters
  • m: Source matrix for copy constructor. If m is dense matrix (ocvMat) then it will be converted to sparse representation.

Trait Implementations§

Source§

impl Boxed for SparseMat

Source§

unsafe fn from_raw(ptr: <SparseMat as OpenCVFromExtern>::ExternReceive) -> Self

Wrap the specified raw pointer Read more
Source§

fn into_raw(self) -> <SparseMat as OpenCVTypeExternContainer>::ExternSendMut

Return the underlying raw pointer while consuming this wrapper. Read more
Source§

fn as_raw(&self) -> <SparseMat as OpenCVTypeExternContainer>::ExternSend

Return the underlying raw pointer. Read more
Source§

fn as_raw_mut( &mut self, ) -> <SparseMat as OpenCVTypeExternContainer>::ExternSendMut

Return the underlying mutable raw pointer Read more
Source§

impl Clone for SparseMat

Source§

fn clone(&self) -> Self

Calls try_clone() and panics if that fails

1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SparseMat

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Drop for SparseMat

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl SparseMatTrait for SparseMat

Source§

fn as_raw_mut_SparseMat(&mut self) -> *mut c_void

Source§

fn set_flags(&mut self, val: i32)

Source§

fn hdr(&mut self) -> SparseMat_Hdr

Source§

fn set_hdr(&mut self, val: &impl SparseMat_HdrTraitConst)

Source§

fn set(&mut self, m: &impl SparseMatTraitConst) -> Result<()>

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

fn set_mat(&mut self, m: &impl MatTraitConst) -> Result<()>

equivalent to the corresponding constructor
Source§

fn create(&mut self, _sizes: &[i32], _type: i32) -> Result<()>

reallocates sparse matrix. Read more
Source§

fn clear(&mut self) -> Result<()>

sets all the sparse matrix elements to 0, which means clearing the hash table.
Source§

unsafe fn addref(&mut self) -> Result<()>

manually increments the reference counter to the header.
Source§

unsafe fn release(&mut self) -> Result<()>

Source§

fn ptr( &mut self, i0: i32, create_missing: bool, hashval: &mut size_t, ) -> Result<*mut u8>

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. Read more
Source§

fn ptr_def(&mut self, i0: i32, create_missing: bool) -> Result<*mut u8>

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. Read more
Source§

fn ptr_1( &mut self, i0: i32, i1: i32, create_missing: bool, hashval: &mut size_t, ) -> Result<*mut u8>

returns pointer to the specified element (2D case) Read more
Source§

fn ptr_def_1( &mut self, i0: i32, i1: i32, create_missing: bool, ) -> Result<*mut u8>

returns pointer to the specified element (2D case) Read more
Source§

fn ptr_2( &mut self, i0: i32, i1: i32, i2: i32, create_missing: bool, hashval: &mut size_t, ) -> Result<*mut u8>

returns pointer to the specified element (3D case) Read more
Source§

fn ptr_def_2( &mut self, i0: i32, i1: i32, i2: i32, create_missing: bool, ) -> Result<*mut u8>

returns pointer to the specified element (3D case) Read more
Source§

fn ptr_3( &mut self, idx: &i32, create_missing: bool, hashval: &mut size_t, ) -> Result<*mut u8>

returns pointer to the specified element (nD case) Read more
Source§

fn ptr_def_3(&mut self, idx: &i32, create_missing: bool) -> Result<*mut u8>

returns pointer to the specified element (nD case) Read more
Source§

fn erase(&mut self, i0: i32, i1: i32, hashval: &mut size_t) -> Result<()>

erases the specified element (2D case) Read more
Source§

fn erase_def(&mut self, i0: i32, i1: i32) -> Result<()>

erases the specified element (2D case) Read more
Source§

fn erase_1( &mut self, i0: i32, i1: i32, i2: i32, hashval: &mut size_t, ) -> Result<()>

erases the specified element (3D case) Read more
Source§

fn erase_def_1(&mut self, i0: i32, i1: i32, i2: i32) -> Result<()>

erases the specified element (3D case) Read more
Source§

fn erase_2(&mut self, idx: &i32, hashval: &mut size_t) -> Result<()>

erases the specified element (nD case) Read more
Source§

fn erase_def_2(&mut self, idx: &i32) -> Result<()>

erases the specified element (nD case) Read more
Source§

fn begin_mut(&mut self) -> Result<SparseMatIterator>

return the sparse matrix iterator pointing to the first sparse matrix element Read more
Source§

fn end_mut(&mut self) -> Result<SparseMatIterator>

return the sparse matrix iterator pointing to the element following the last sparse matrix element Read more
Source§

fn node_1(&mut self, nidx: size_t) -> Result<SparseMat_Node>

/////////// some internal-use methods ///////////////
Source§

fn new_node(&mut self, idx: &i32, hashval: size_t) -> Result<*mut u8>

Source§

fn remove_node( &mut self, hidx: size_t, nidx: size_t, previdx: size_t, ) -> Result<()>

Source§

fn resize_hash_tab(&mut self, newsize: size_t) -> Result<()>

Source§

impl SparseMatTraitConst for SparseMat

Source§

fn as_raw_SparseMat(&self) -> *const c_void

Source§

fn flags(&self) -> i32

Source§

fn try_clone(&self) -> Result<SparseMat>

creates full copy of the matrix
Source§

fn copy_to(&self, m: &mut impl SparseMatTrait) -> Result<()>

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

fn copy_to_mat(&self, m: &mut impl MatTrait) -> Result<()>

converts sparse matrix to dense matrix.
Source§

fn convert_to( &self, m: &mut impl SparseMatTrait, rtype: i32, alpha: f64, ) -> Result<()>

multiplies all the matrix elements by the specified scale factor alpha and converts the results to the specified data type Read more
Source§

fn convert_to_def(&self, m: &mut impl SparseMatTrait, rtype: i32) -> Result<()>

multiplies all the matrix elements by the specified scale factor alpha and converts the results to the specified data type Read more
Source§

fn convert_to_1( &self, m: &mut impl MatTrait, rtype: i32, alpha: f64, beta: f64, ) -> Result<()>

converts sparse matrix to dense n-dim matrix with optional type conversion and scaling. Read more
Source§

fn convert_to_def_1(&self, m: &mut impl MatTrait, rtype: i32) -> Result<()>

converts sparse matrix to dense n-dim matrix with optional type conversion and scaling. Read more
Source§

fn assign_to(&self, m: &mut impl SparseMatTrait, typ: i32) -> Result<()>

C++ default parameters Read more
Source§

fn assign_to_def(&self, m: &mut impl SparseMatTrait) -> Result<()>

Source§

fn elem_size(&self) -> size_t

returns the size of each element in bytes (not including the overhead - the space occupied by SparseMat::Node elements)
Source§

fn elem_size1(&self) -> size_t

returns elemSize()/channels()
Source§

fn typ(&self) -> i32

returns type of sparse matrix elements
Source§

fn depth(&self) -> i32

returns the depth of sparse matrix elements
Source§

fn channels(&self) -> i32

returns the number of channels
Source§

fn size(&self) -> Result<*const i32>

returns the array of sizes, or NULL if the matrix is not allocated
Source§

fn size_1(&self, i: i32) -> Result<i32>

returns the size of i-th matrix dimension (or 0)
Source§

fn dims(&self) -> Result<i32>

returns the matrix dimensionality
Source§

fn nzcount(&self) -> Result<size_t>

returns the number of non-zero elements (=the number of hash table nodes)
Source§

fn hash(&self, i0: i32) -> Result<size_t>

computes the element hash value (1D case)
Source§

fn hash_1(&self, i0: i32, i1: i32) -> Result<size_t>

computes the element hash value (2D case)
Source§

fn hash_2(&self, i0: i32, i1: i32, i2: i32) -> Result<size_t>

computes the element hash value (3D case)
Source§

fn hash_3(&self, idx: &i32) -> Result<size_t>

computes the element hash value (nD case)
Source§

fn begin(&self) -> Result<SparseMatConstIterator>

returns the read-only sparse matrix iterator at the matrix beginning
Source§

fn end(&self) -> Result<SparseMatConstIterator>

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

fn node(&self, nidx: size_t) -> Result<SparseMat_Node>

Source§

impl Send for SparseMat

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<Mat> ModifyInplace for Mat
where Mat: Boxed,

Source§

unsafe fn modify_inplace<Res>( &mut self, f: impl FnOnce(&Mat, &mut Mat) -> Res, ) -> Res

Helper function to call OpenCV functions that allow in-place modification of a Mat or another similar object. By passing a mutable reference to the Mat to this function your closure will get called with the read reference and a write references to the same Mat. This is unsafe in a general case as it leads to having non-exclusive mutable access to the internal data, but it can be useful for some performance sensitive operations. One example of an OpenCV function that allows such in-place modification is imgproc::threshold. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.