Trait sprs::vec::SparseIterTools

source ·
pub trait SparseIterTools: Iterator {
    // Provided methods
    fn nnz_or_zip<'a, I, N1, N2>(
        self,
        other: I
    ) -> NnzOrZip<'a, Self, I::IntoIter, N1, N2> 
       where Self: Iterator<Item = (usize, &'a N1)> + Sized,
             I: IntoIterator<Item = (usize, &'a N2)> { ... }
    fn nnz_zip<'a, I, N1, N2>(
        self,
        other: I
    ) -> FilterMap<NnzOrZip<'a, Self, I::IntoIter, N1, N2>, fn(_: NnzEither<'a, N1, N2>) -> Option<(usize, &'a N1, &'a N2)>>
       where Self: Iterator<Item = (usize, &'a N1)> + Sized,
             I: IntoIterator<Item = (usize, &'a N2)> { ... }
}

Provided Methods§

source

fn nnz_or_zip<'a, I, N1, N2>( self, other: I ) -> NnzOrZip<'a, Self, I::IntoIter, N1, N2> where Self: Iterator<Item = (usize, &'a N1)> + Sized, I: IntoIterator<Item = (usize, &'a N2)>,

Iterate over non-zero elements of either of two vectors. This is useful for implementing eg addition of vectors.

Example
use sprs::CsVec;
use sprs::vec::NnzEither;
use sprs::vec::SparseIterTools;
let v0 = CsVec::new(5, vec![0, 2, 4], vec![1., 2., 3.]);
let v1 = CsVec::new(5, vec![1, 2, 3], vec![-1., -2., -3.]);
let mut nnz_or_iter = v0.iter().nnz_or_zip(v1.iter());
assert_eq!(nnz_or_iter.next(), Some(NnzEither::Left((0, &1.))));
assert_eq!(nnz_or_iter.next(), Some(NnzEither::Right((1, &-1.))));
assert_eq!(nnz_or_iter.next(), Some(NnzEither::Both((2, &2., &-2.))));
assert_eq!(nnz_or_iter.next(), Some(NnzEither::Right((3, &-3.))));
assert_eq!(nnz_or_iter.next(), Some(NnzEither::Left((4, &3.))));
assert_eq!(nnz_or_iter.next(), None);
source

fn nnz_zip<'a, I, N1, N2>( self, other: I ) -> FilterMap<NnzOrZip<'a, Self, I::IntoIter, N1, N2>, fn(_: NnzEither<'a, N1, N2>) -> Option<(usize, &'a N1, &'a N2)>>where Self: Iterator<Item = (usize, &'a N1)> + Sized, I: IntoIterator<Item = (usize, &'a N2)>,

Iterate over the matching non-zero elements of both vectors Useful for vector dot product.

Example
use sprs::CsVec;
use sprs::vec::SparseIterTools;
let v0 = CsVec::new(5, vec![0, 2, 4], vec![1., 2., 3.]);
let v1 = CsVec::new(5, vec![1, 2, 3], vec![-1., -2., -3.]);
let mut nnz_zip = v0.iter().nnz_zip(v1.iter());
assert_eq!(nnz_zip.next(), Some((2, &2., &-2.)));
assert_eq!(nnz_zip.next(), None);

Implementations on Foreign Types§

source§

impl<T: Iterator> SparseIterTools for Enumerate<T>

Implementors§

source§

impl<'a, N: 'a, I: 'a + SpIndex> SparseIterTools for VectorIterator<'a, N, I>