2 #ifndef vnl_sparse_matrix_hxx_ 3 #define vnl_sparse_matrix_hxx_ 13 # include <vcl_msvc_warnings.h> 37 : elements(
m), rs_(
m), cs_(n)
45 : elements(rhs.elements), rs_(rhs.rs_), cs_(rhs.cs_)
69 assert(rhs.
rows() == columns());
70 assert(
this != &result);
71 assert(&rhs != &result);
72 unsigned int result_rows = rows();
73 unsigned int result_cols = rhs.
columns();
76 if (result_rows <= 0 || result_cols <= 0)
return;
78 result.
cs_ = result_cols;
79 if (result.
rows() != result_rows)
85 result.
rs_ = result_rows;
86 for (
unsigned row_id=0; row_id<result_rows; ++row_id)
91 for (
unsigned row_id=0; row_id<elements.size(); ++row_id) {
93 row const& this_row = elements[row_id];
103 for (
typename row::const_iterator col_iter = this_row.begin();
104 col_iter != this_row.end();
109 unsigned const col_id = entry.
first;
121 typename row::iterator result_col_iter = result_row.begin();
122 for (
typename row::const_iterator rhs_col_iter = rhs_row.begin();
123 rhs_col_iter != rhs_row.end();
127 unsigned int const dest_col = rhs_entry.
first;
133 while ((result_col_iter != result_row.end()) &&
134 ((*result_col_iter).first < dest_col))
137 if ((result_col_iter == result_row.end()) ||
138 ((*result_col_iter).first != dest_col))
146 (*result_col_iter).second += prod;
158 T
const* p, T* q)
const 160 assert(prows == columns());
163 int size = rows()*pcols;
164 for (
int temp=0; temp<size; temp++)
169 for (
int rr = 0; rr<rows(); rr++)
170 for (
int cc = 0; cc<columns(); cc++)
171 md(rr,cc) = (*this)(rr,cc);
174 for (
int rr = 0; rr<prows; rr++)
175 for (
int cc = 0; cc<pcols; cc++)
176 pd(rr,cc) = p[rr + cc*prows];
178 std::cout <<
"Initial p:\n";
179 for (
int rr = 0; rr<prows; rr++) {
180 for (
int cc = 0; cc<pcols; cc++) {
181 T pval = p[rr + cc*prows];
182 std::cout << pval <<
' ';
189 for (
unsigned row_id=0; row_id<elements.size(); ++row_id) {
191 row const & this_row = elements[row_id];
194 if (this_row.empty())
198 for (
typename row::const_iterator col_iter = this_row.begin();
199 col_iter != this_row.end();
204 unsigned const col_id = entry.
first;
213 for (
unsigned int p_col_id = 0; p_col_id < pcols; p_col_id++) {
215 T pval = p[col_id + p_col_id*prows];
218 T prod = entry.
second * pval;
221 q[row_id + p_col_id*rows()] += prod;
227 std::cout <<
"Final q:\n";
228 for (
int rr = 0; rr<prows; rr++) {
229 for (
int cc = 0; cc<pcols; cc++) {
230 T pval = q[rr + cc*prows];
231 std::cout << pval <<
' ';
235 std::cout <<
"nonsparse: " << md*pd <<
'\n';
245 assert(rhs.
size() == columns());
251 typename std::vector<row>::const_iterator lhs_row_iter = elements.
begin();
252 for ( ; lhs_row_iter != elements.end(); ++lhs_row_iter, rhs_row_id++ ) {
253 row const & lhs_row = *lhs_row_iter;
254 if (lhs_row.empty())
continue;
256 typename row::const_iterator lhs_col_iter = lhs_row.begin();
257 for ( ; lhs_col_iter != lhs_row.end(); ++lhs_col_iter) {
259 unsigned const lhs_col_id = entry.
first;
261 result[ rhs_row_id ] += rhs[ lhs_col_id ] * entry.
second;
271 assert(lhs.
size() == rows());
278 unsigned lhs_col_id = 0;
279 for (
typename std::vector<row>::const_iterator rhs_row_iter = elements.begin();
280 rhs_row_iter != elements.end();
281 ++rhs_row_iter, lhs_col_id++ )
284 row const & rhs_row = *rhs_row_iter;
287 if (rhs_row.empty())
continue;
290 for (
typename row::const_iterator rhs_col_iter = rhs_row.begin();
291 rhs_col_iter != rhs_row.end();
296 unsigned const rhs_col_id = entry.
first;
298 result[ rhs_col_id ] += lhs[ lhs_col_id ] * entry.
second;
309 assert((rhs.
rows() == rows()) && (rhs.
columns() == columns()));
317 result.
cs_ = columns();
320 unsigned int row_id = 0;
321 for (
typename std::vector<row>::const_iterator row_iter = elements.begin();
322 row_iter != elements.end();
323 ++row_iter, ++row_id)
326 row const & this_row = *row_iter;
332 result_row = this_row;
342 for (
typename row::const_iterator col_iter = rhs_row.begin();
343 col_iter != rhs_row.end();
348 unsigned const col_id = entry.
first;
351 result(row_id,col_id) += entry.
second;
362 assert((rhs.
rows() == rows()) && (rhs.
columns() == columns()));
370 result.
cs_ = columns();
373 unsigned int row_id = 0;
374 for (
typename std::vector<row>::const_iterator row_iter = elements.begin();
375 row_iter != elements.end();
376 ++row_iter, ++row_id)
379 row const& this_row = *row_iter;
385 result_row = this_row;
395 for (
typename row::const_iterator col_iter = rhs_row.begin();
396 col_iter != rhs_row.end();
401 unsigned const col_id = entry.
first;
404 result(row_id,col_id) -= entry.
second;
414 assert((r < rows()) && (c < columns()));
415 row& rw = elements[r];
416 typename row::iterator ri;
417 for (ri = rw.begin(); (ri != rw.end()) && ((*ri).first < c); ++ri)
420 if ((ri == rw.end()) || ((*ri).first != c)) {
433 assert((r < rows()) && (c < columns()));
434 row const& rw = elements[r];
435 typename row::const_iterator ri = rw.begin();
436 while (ri != rw.end() && (*ri).first < c)
438 if (ri == rw.end() || (*ri).first != c)
450 assert((r < rows()) && (c < columns()));
451 row const& rw = elements[r];
452 typename row::const_iterator ri = rw.begin();
453 while (ri != rw.end() && (*ri).first < c)
455 if (ri == rw.end() || (*ri).first != c)
466 assert((r < rows()) && (c < columns()));
467 row& rw = elements[r];
468 typename row::iterator ri = rw.begin();
469 while (ri != rw.end() && (*ri).first < c)
472 if (ri == rw.end() || (*ri).first != c) {
486 typename std::vector<row>::const_iterator row_iter = elements.
begin();
487 for ( ; row_iter != elements.end(); ++row_iter) {
488 row const& this_row = *row_iter;
489 typename row::const_iterator col_iter = this_row.begin();
490 for ( ; col_iter != this_row.end(); ++col_iter) {
492 unsigned const col_id = entry.
first;
504 std::vector<int>
const& colz,
505 std::vector<T>
const& vals)
508 assert (colz.size() == vals.size());
510 row& rw = elements[r];
511 if (rw.size() != colz.size()) rw =
row(colz.size());
512 for (
unsigned int i=0; i < colz.size(); ++i)
515 std::sort(rw.begin(), rw.end(), less());
529 assert(cs_ == A.
cs_);
543 row & rw = elements[r];
545 for (
typename row::iterator ri = rw.begin(); ri != rw.end(); ++ri)
556 row& rw = elements[r];
557 for (
typename row::iterator ri = rw.begin(); ri != rw.end(); ++ri)
558 (*ri).second *= scale;
571 typename vnl_sparse_matrix_elements::iterator ie;
572 for (ie = elements.begin(); ie != elements.end(); ++ie)
587 unsigned int oldCs = cs_;
595 for (
unsigned int i = 0; i < elements.size(); ++i) {
596 row& rw = elements[i];
597 typename row::iterator iter;
598 for (iter = rw.begin(); iter != rw.end() && (*iter).first<cs_ ; ++iter)
600 if (iter != rw.end()) rw.erase(iter,rw.end());
624 if ( itr_row >= rows() )
636 if ( itr_cur != elements[itr_row].end() )
643 while ( itr_row < rows() ) {
644 itr_cur = elements[itr_row].begin();
645 if ( itr_cur != elements[itr_row].end() )
651 return itr_row < rows();
669 return (*itr_cur).first;
678 return (*itr_cur).second;
688 if (rhs.
rows() != rows() || rhs.
columns() != columns()) {
690 std::cerr <<
"Sizes are different: " << rows() <<
'x' << columns() <<
' ' << rhs.
rows() <<
'x' << rhs.
columns() <<
'\n';
696 unsigned int row_id = 0;
697 for (
typename std::vector<row>::const_iterator row_iter = elements.begin();
698 row_iter != elements.end();
699 ++row_iter, ++row_id)
702 row const& this_row = *row_iter;
708 if (rhs_row.size() != this_row.size())
712 for (
typename row::const_iterator col_iter = rhs_row.begin();
713 col_iter != rhs_row.end();
718 unsigned const col_id = entry.
first;
721 if (get(row_id,col_id) != entry.
second)
737 unsigned int row_id = 0;
738 for (
typename std::vector<row>::const_iterator row_iter = elements.begin();
739 row_iter != elements.end();
740 ++row_iter, ++row_id)
743 row const& this_row = *row_iter;
746 for (
typename row::const_iterator col_iter = this_row.begin();
747 col_iter != this_row.end();
790 for (
typename std::vector<row>::iterator row_iter = elements.begin();
791 row_iter != elements.end();
795 row& this_row = *row_iter;
798 for (
typename row::iterator col_iter = this_row.begin();
799 col_iter != this_row.end();
803 col_iter->second *= rhs;
814 for (
typename std::vector<row>::iterator row_iter = elements.begin();
815 row_iter != elements.end();
819 row& this_row = *row_iter;
822 for (
typename row::iterator col_iter = this_row.begin();
823 col_iter != this_row.end();
827 col_iter->second /= rhs;
838 return result *= rhs;
846 return result /= rhs;
880 for (
typename std::vector<row>::iterator row_iter = elements.begin();
881 row_iter != elements.end();
885 row& this_row = *row_iter;
890 for (
typename row::iterator col_iter = this_row.begin();
891 col_iter != this_row.end();
898 abs_real_t scale = abs_real_t(1)/(std::sqrt((abs_real_t)norm));
900 for (
typename row::iterator col_iter = this_row.begin();
901 col_iter != this_row.end();
917 unsigned int rownum = 0;
918 for (
typename std::vector<row>::iterator row_iter = elements.begin();
919 row_iter != elements.end() && rownum < cols();
920 ++row_iter, ++rownum)
934 unsigned int rownum = 0;
937 for (
typename std::vector<row>::const_iterator row_iter = elements.begin();
938 row_iter != elements.end();
939 ++row_iter, ++rownum)
941 row const& this_row = *row_iter;
942 for (
typename row::const_iterator col_iter = this_row.begin();
943 col_iter != this_row.end();
948 entry.
first = rownum;
949 rw.insert(rw.end(), entry);
960 for (
typename std::vector<row>::iterator row_iter = result.
elements.begin();
964 row& this_row = *row_iter;
965 for (
typename row::iterator col_iter = this_row.begin();
966 col_iter != this_row.end();
976 #define VNL_SPARSE_MATRIX_INSTANTIATE(T) \ 977 template class VNL_EXPORT vnl_sparse_matrix<T > 979 #endif // vnl_sparse_matrix_hxx_ vnl_sparse_matrix< T > operator+(vnl_sparse_matrix< T > const &rhs) const
addition.
vnl_sparse_matrix & scale_row(unsigned int r, T scale)
Useful for normalizing row sums in convolution operators.
vnl_bignum operator+(vnl_bignum const &r1, long r2)
Returns the sum of two bignum numbers.
std::vector< pair_t > row
unsigned int columns() const
Get the number of columns in the matrix.
vnl_sparse_matrix< T > operator-() const
Unary minus.
vnl_sparse_matrix< T > transpose() const
returns a new sparse matrix, viz. the transpose of this.
An ordinary mathematical matrix.
void mult(vnl_vector< T > const &rhs, vnl_vector< T > &result) const
Multiply this*rhs, where rhs is a vector.
bool set_size(size_t n)
Resize to n elements.
vnl_sparse_matrix< T > & operator-=(vnl_sparse_matrix< T > const &rhs)
in-place subtraction.
To allow templated algorithms to determine appropriate actions of conjugation, complexification etc.
T value() const
Returns the value pointed to by the internal iterator.
T sum_row(unsigned int r)
This is occasionally useful.
void resize(int r, int c)
Resizes the array to have r rows and c cols.
size_t size() const
Return the length, number of elements, dimension of this vector.
vnl_sparse_matrix & set_row(unsigned int r, std::vector< int > const &cols, std::vector< T > const &vals)
Set a whole row at once. Much faster. Returns *this.
void set_size(int r, int c)
Resizes the array to have r rows and c cols – sets elements to null.
Namespace with standard math functions.
void add(const vnl_bignum &b1, const vnl_bignum &b2, vnl_bignum &sum)
add two non-infinite vnl_bignum values and save their sum.
vnl_sparse_matrix< T > & operator+=(vnl_sparse_matrix< T > const &rhs)
in-place addition.
void reset() const
Resets the internal iterator.
bool operator==(vnl_sparse_matrix< T > const &rhs) const
Comparison.
void subtract(const vnl_sparse_matrix< T > &rhs, vnl_sparse_matrix< T > &result) const
Subtract rhs from this.
void put(unsigned int row, unsigned int column, T value)
Put (i.e., add or overwrite) an entry into the matrix.
vnl_bignum squared_magnitude(vnl_bignum const &x)
void clear()
Set all elements to null.
vnl_sparse_matrix_elements elements
bool empty_row(unsigned int r) const
Return whether a given row is empty.
void diag_AtA(vnl_vector< T > &result) const
Get diag(A_transpose * A).
void subtract(const vnl_bignum &bmax, const vnl_bignum &bmin, vnl_bignum &diff)
subtract bmin from bmax (unsigned, non-infinite), result in diff.
void pre_mult(const vnl_vector< T > &lhs, vnl_vector< T > &result) const
Multiplies lhs*this, where lhs is a vector.
iterator begin()
Iterator pointing to start of data.
vnl_sparse_matrix< T > operator/(T const &rhs) const
scalar division.
vnl_sparse_matrix< T > & operator/=(T const &rhs)
in-place scalar division.
unsigned int rows() const
Get the number of rows in the matrix.
vnl_sparse_matrix< T > operator *(vnl_sparse_matrix< T > const &rhs) const
multiplication.
vnl_vector & fill(T const &v)
Set all values to v.
Mathematical vector class, templated by type of element.
vnl_sparse_matrix< T > conjugate_transpose() const
returns a new sparse matrix, viz. the conjugate (or Hermitian) transpose of this.
vnl_sparse_matrix< T > & operator=(vnl_sparse_matrix< T > const &rhs)
Copy another vnl_sparse_matrix<T> into this.
vnl_sparse_matrix & set_identity()
Sets this matrix to an identity matrix, then returns "*this".
int getrow() const
Returns the row of the entry pointed to by internal iterator.
vnl_sparse_matrix()
Construct an empty matrix.
Stores elements of sparse matrix.
vnl_bignum operator-(vnl_bignum const &r1, vnl_bignum const &r2)
Returns the difference of two bignum numbers.
vnl_sparse_matrix< T > & vcat(vnl_sparse_matrix< T > const &A)
Laminate matrix A onto the bottom of this one.
vnl_sparse_matrix< T > & operator *=(vnl_sparse_matrix< T > const &rhs)
in-place multiplication.
T get(unsigned int row, unsigned int column) const
Get an entry in the matrix.
vnl_bignum operator *(vnl_bignum const &r1, vnl_bignum const &r2)
Returns the product of two bignum numbers.
bool next() const
Moves the internal iterator to next non-zero entry in matrix.
int getcolumn() const
Returns the column of the entry pointed to by internal iterator.
T & operator()(unsigned int row, unsigned int column)
Get a reference to an entry in the matrix.
vnl_sparse_matrix & normalize_rows()
Normalizes each row so it is a unit vector, and returns "*this".
void add(const vnl_sparse_matrix< T > &rhs, vnl_sparse_matrix< T > &result) const
Add rhs to this.