Isis 3.0 Programmer Reference
Back | Home
SparseBlockMatrix.cpp
1 #include "SparseBlockMatrix.h"
2 
3 // std lib
4 #include <iostream>
5 #include <iomanip>
6 
7 // qt lib
8 #include <QDataStream>
9 #include <QDebug>
10 #include <QMapIterator>
11 #include <QListIterator>
12 
13 // boost lib
14 #include <boost/numeric/ublas/matrix_sparse.hpp>
15 #include <boost/numeric/ublas/matrix_proxy.hpp>
16 #include <boost/numeric/ublas/io.hpp>
17 
18 // Isis lib
19 #include "IString.h"
20 #include "LinearAlgebra.h"
21 
22 using namespace boost::numeric::ublas;
23 
24 namespace Isis {
25 
29  SparseBlockColumnMatrix::~SparseBlockColumnMatrix() {
30  wipe();
31  }
32 
33 
38  void SparseBlockColumnMatrix::wipe() {
39  qDeleteAll(values());
40  clear();
41  }
42 
43 
49  SparseBlockColumnMatrix::SparseBlockColumnMatrix(const SparseBlockColumnMatrix& src) {
50  copy(src);
51  }
52 
53 
59  void SparseBlockColumnMatrix::copy(const SparseBlockColumnMatrix& src) {
60  // handi-wipe
61  wipe();
62 
63  // copy matrix blocks from src
64  QMapIterator<int, LinearAlgebra::Matrix *> it(src);
65  while ( it.hasNext() ) {
66  it.next();
67 
68  // copy matrix block from src
69  LinearAlgebra::Matrix *m = new LinearAlgebra::Matrix(*(it.value()));
70 
71  // insert matrix into map
72  this->insert(it.key(),m);
73  }
74  }
75 
76 
83  SparseBlockColumnMatrix::operator=(const SparseBlockColumnMatrix& src) {
84  if ( this == &src )
85  return *this;
86 
87  copy(src);
88 
89  return *this;
90  }
91 
92 
105  bool SparseBlockColumnMatrix::insertMatrixBlock(int nColumnBlock, int nRows, int nCols) {
106  // check if matrix already exists at the key "nColumnBlock"
107  if ( this->contains(nColumnBlock) )
108  return true;
109 
110  // allocate matrix block with nRows and nCols
111  LinearAlgebra::Matrix *m = new LinearAlgebra::Matrix(nRows,nCols);
112 
113  if ( !m )
114  return false;
115 
116  // zero matrix elements
117  m->clear();
118 
119  // insert matrix into map
120  this->insert(nColumnBlock,m);
121 
122  return true;
123  }
124 
125 
132  int SparseBlockColumnMatrix::numberOfElements() {
133  int nElements = 0;
134 
135  QMapIterator<int, LinearAlgebra::Matrix *> it(*this);
136  while ( it.hasNext() ) {
137  it.next();
138 
139  if( !it.value() )
140  continue;
141 
142  nElements += it.value()->size1()*it.value()->size2();
143  }
144 
145  return nElements;
146  }
147 
148 
154  int SparseBlockColumnMatrix::numberOfColumns() {
155 
156  int nColumns = 0;
157 
158  QMapIterator<int, LinearAlgebra::Matrix *> it(*this);
159  while ( it.hasNext() ) {
160  it.next();
161 
162  if( !it.value() )
163  continue;
164 
165  nColumns = it.value()->size2();
166  break;
167  }
168 
169  return nColumns;
170  }
171 
172 
179  int SparseBlockColumnMatrix::numberOfRows() {
180 
181  // iterate to last block (the diagonal one)
182  QMapIterator<int, LinearAlgebra::Matrix *> it(*this);
183  while ( it.hasNext() ) {
184  it.next();
185 
186  if( !it.value() )
187  continue;
188  }
189 
190  int nRows = it.value()->size1();
191 
192  return nRows;
193  }
194 
195 
203  void SparseBlockColumnMatrix::print(std::ostream& outstream) {
204  if ( size() == 0 ) {
205  outstream << "Empty SparseBlockColumnMatrix..." << std::endl;
206  return;
207  }
208 
209  outstream << "Printing SparseBlockColumnMatrix..." << std::endl;
210  QMapIterator<int, LinearAlgebra::Matrix *> it(*this);
211  while ( it.hasNext() ) {
212  it.next();
213 
214  if( it.value() )
215  outstream << it.key() << std::endl << *(it.value()) << std::endl
216  << std::endl;
217  else
218  outstream << "NULL block pointer at row[" << IString(it.key())
219  << "]!" << std::endl;
220  }
221  }
222 
223 
230  void SparseBlockColumnMatrix::printClean(std::ostream& outstream) {
231  if ( size() == 0 ) {
232  outstream << "Empty SparseBlockColumnMatrix..." << std::endl;
233  return;
234  }
235 
236  QMapIterator<int, LinearAlgebra::Matrix *> it(*this);
237  while ( it.hasNext() ) {
238  it.next();
239 
240  LinearAlgebra::Matrix * m = it.value();
241 
242  int rows = m->size1();
243  int cols = m->size2();
244 
245  for ( int i = 0; i < rows; i++ ) {
246  for ( int j = 0; j < cols; j++ ) {
247  double d = m->at_element(i,j);
248  if ( j == cols-1 )
249  outstream << std::setprecision(12) << d << std::endl;
250  else
251  outstream << std::setprecision(12) << d << ",";
252  }
253  }
254 
255  }
256  outstream << std::endl;
257  }
258 
259 
263  void SparseBlockColumnMatrix::zeroBlocks() {
264  QMapIterator<int, LinearAlgebra::Matrix *> it(*this);
265  while ( it.hasNext() ) {
266  it.next();
267  it.value()->clear();
268  }
269  }
270 
271 
278  QDataStream &operator<<(QDataStream &stream, const SparseBlockColumnMatrix &sbcm) {
279  // write number of blocks in this column
280  int nBlocks = sbcm.size();
281  stream << (qint32)nBlocks;
282 
283  QMapIterator<int, LinearAlgebra::Matrix *> it(sbcm);
284  while ( it.hasNext() ) {
285  it.next();
286 
287  if( !it.value() )
288  continue;
289 
290  int nRows = it.value()->size1();
291  int nCols = it.value()->size2();
292 
293  // write block number (key); rows (size1); and columns (size2)
294  stream << it.key() << (qint32)nRows << (qint32)nCols;
295 
296  double* data = &it.value()->data()[0];
297 
298  // write raw matrix data
299  stream.writeRawData((const char*)data, nRows*nCols*sizeof(double));
300  }
301 
302  return stream;
303  }
304 
305 
312  QDataStream &operator>>(QDataStream &stream, SparseBlockColumnMatrix &sbcm) {
313  qint32 nBlocks, nBlockNumber, nRows, nCols;
314  int i, r, c;
315 
316  stream >> nBlocks;
317 
318  for ( i = 0; i < nBlocks; i++ ) {
319  // read block number (key); rows (size1); and columns (size2)
320  stream >> nBlockNumber >> nRows >> nCols;
321 
322  double data[nRows*nCols];
323 
324  // read raw matrix data
325  stream.readRawData((char*)data, nRows*nCols*sizeof(double));
326 
327  // insert matrix at correct key
328  sbcm.insertMatrixBlock(nBlockNumber, nRows, nCols);
329 
330  // get matrix
331  LinearAlgebra::Matrix *matrix = sbcm[nBlockNumber];
332 
333  // fill with data
334  for ( r = 0; r < nRows; r++ ) {
335  for ( c = 0; c < nCols; c++ ) {
336  int nLocation = r*nRows + c;
337  (*matrix)(r,c) = data[nLocation];
338  }
339  }
340  }
341 
342  return stream;
343  }
344 
345 
352  QDebug operator<<(QDebug dbg, const SparseBlockColumnMatrix &sbcm) {
353  dbg.space() << "New Block" << endl;
354 
355  QMapIterator<int, LinearAlgebra::Matrix *> it(sbcm);
356  while ( it.hasNext() ) {
357  it.next();
358 
359  if( !it.value() )
360  continue;
361 
362  // get matrix
363  LinearAlgebra::Matrix *matrix = it.value();
364 
365  // matrix rows, columns
366  int nRows = matrix->size1();
367  int nCols = matrix->size2();
368 
369  dbg.nospace() << qSetFieldWidth(4);
370  dbg.nospace() << qSetRealNumberPrecision(8);
371 
372  for ( int r = 0; r < nRows; r++ ) {
373  for ( int c = 0; c < nCols; c++ ) {
374  dbg.space() << (*matrix)(r,c);
375  }
376  dbg.space() << endl;
377  }
378 
379  dbg.space() << endl;
380  }
381 
382  return dbg;
383  }
384 
385 
387  // SparseBlockRowMatrix methods
388 
392  SparseBlockRowMatrix::~SparseBlockRowMatrix() {
393  wipe();
394  }
395 
396 
401  void SparseBlockRowMatrix::wipe() {
402  qDeleteAll(values());
403  clear();
404  }
405 
406 
412  SparseBlockRowMatrix::SparseBlockRowMatrix(const SparseBlockRowMatrix& src) {
413  copy(src);
414  }
415 
416 
422  void SparseBlockRowMatrix::copy(const SparseBlockRowMatrix& src) {
423  // handi-wipe
424  wipe();
425 
426  // copy matrix blocks from src
427  QMapIterator<int, LinearAlgebra::Matrix *> it(src);
428  while ( it.hasNext() ) {
429  it.next();
430 
431  // copy matrix block from src
432  LinearAlgebra::Matrix *m = new LinearAlgebra::Matrix(*(it.value()));
433 
434  // insert matrix into map
435  this->insert(it.key(),m);
436  }
437  }
438 
439 
446  SparseBlockRowMatrix::operator=(const SparseBlockRowMatrix& src) {
447  if ( this == &src )
448  return *this;
449 
450  copy(src);
451 
452  return *this;
453  }
454 
455 
471  bool SparseBlockRowMatrix::insertMatrixBlock(int nRowBlock, int nRows, int nCols) {
472  if ( this->contains(nRowBlock) )
473  return false;
474 
475  LinearAlgebra::Matrix *m = new LinearAlgebra::Matrix(nRows,nCols);
476 
477  if ( !m )
478  return false;
479 
480  m->clear();
481 
482  this->insert(nRowBlock,m);
483 
484  return true;
485  }
486 
487 
494  int SparseBlockRowMatrix::numberOfElements() {
495  int nElements = 0;
496 
497  QMapIterator<int, LinearAlgebra::Matrix *> it(*this);
498  while ( it.hasNext() ) {
499  it.next();
500 
501  if( !it.value() )
502  continue;
503 
504  nElements += it.value()->size1()*it.value()->size2();
505  }
506 
507  return nElements;
508  }
509 
510 
516  void SparseBlockRowMatrix::print(std::ostream& outstream) {
517  if ( size() == 0 ) {
518  outstream << "Empty SparseBlockRowMatrix..." << std::endl;
519  return;
520  }
521 
522  outstream << "Printing SparseBlockRowMatrix..." << std::endl;
523  QMapIterator<int, LinearAlgebra::Matrix *> it(*this);
524  while ( it.hasNext() ) {
525  it.next();
526 
527  if( it.value() )
528  outstream << it.key() << std::endl << *(it.value()) << std::endl
529  << std::endl;
530  else
531  outstream << "NULL block pointer at column[" << IString(it.key())
532  << "]!" << std::endl;
533  }
534  }
535 
536 
542  void SparseBlockRowMatrix::printClean(std::ostream& outstream) {
543  if ( size() == 0 ) {
544  outstream << "Empty SparseBlockRowMatrix..." << std::endl;
545  return;
546  }
547 
548  QMapIterator<int, LinearAlgebra::Matrix *> it(*this);
549  while ( it.hasNext() ) {
550  it.next();
551 
552  LinearAlgebra::Matrix *m = it.value();
553 
554  int rows = m->size1();
555  int cols = m->size2();
556 
557  for ( int i = 0; i < rows; i++ ) {
558  for ( int j = 0; j < cols; j++ ) {
559  double d = m->at_element(i,j);
560  if ( j == cols-1 )
561  outstream << std::setprecision(9) << d << std::endl;
562  else
563  outstream << std::setprecision(9) << d << ",";
564  }
565  }
566 
567  }
568  outstream << std::endl;
569  }
570 
571 
575  void SparseBlockRowMatrix::zeroBlocks() {
576  QMapIterator<int, LinearAlgebra::Matrix *> it(*this);
577  while ( it.hasNext() ) {
578  it.next();
579  it.value()->clear();
580  }
581  }
582 
583 
590  void SparseBlockRowMatrix::copyToBoost(compressed_matrix<double>& B) {
591  B.clear();
592 
593  int ncols, nstart, nend, nrowBlock;
594  range rRow = range(0,3);
595  range rCol;
596 
597  QMapIterator<int, LinearAlgebra::Matrix *> it(*this);
598  while ( it.hasNext() ) {
599  it.next();
600 
601  nrowBlock = it.key();
602  LinearAlgebra::Matrix *m = it.value();
603 
604  ncols = m->size2();
605 
606  nstart = nrowBlock*ncols;
607  nend = nstart + ncols;
608 
609  rCol = range(nstart,nend);
610 
611  matrix_range<compressed_matrix<double> > m1 (B, rRow, rCol);
612 
613  m1 = *m;
614  }
615  }
616 
617 
625  int SparseBlockRowMatrix::getLeadingColumnsForBlock(int nblockColumn) {
626 
627  if ( nblockColumn == 0 )
628  return 0;
629 
630  int nLeadingColumnsElements = 0;
631 
632  int nCol = 0;
633 
634  while ( nCol < nblockColumn ) {
635  if ( !(*this)[nCol] ) {
636  nCol++;
637  continue;
638  }
639 
640  int ncolumns = (*this)[nCol]->size2();
641 
642  if ( ncolumns == -1 )
643  continue;
644 
645  nLeadingColumnsElements += ncolumns;
646 
647  nCol++;
648  }
649 
650  return nLeadingColumnsElements;
651  }
652 
653 
660  QDataStream &operator<<(QDataStream &stream, const SparseBlockRowMatrix &sbrm) {
661  // write number of blocks in this column
662  int nBlocks = sbrm.size();
663  stream << (qint32)nBlocks;
664 
665  QMapIterator<int, LinearAlgebra::Matrix *> it(sbrm);
666  while ( it.hasNext() ) {
667  it.next();
668 
669  if( !it.value() )
670  continue;
671 
672  int nRows = it.value()->size1();
673  int nCols = it.value()->size2();
674 
675  // write block number (key); rows (size1); and columns (size2)
676  stream << it.key() << (qint32)nRows << (qint32)nCols;
677 
678  double* data = &it.value()->data()[0];
679 
680  // write raw matrix data
681  stream.writeRawData((const char*)data, nRows*nCols*sizeof(double));
682  }
683 
684  return stream;
685  }
686 
687 
694  QDataStream &operator>>(QDataStream &stream, SparseBlockRowMatrix &sbrm) {
695  qint32 nBlocks, nBlockNumber, nRows, nCols;
696  int i, r, c;
697 
698  stream >> nBlocks;
699 
700  for ( i = 0; i < nBlocks; i++ ) {
701  // read block number (key); rows (size1); and columns (size2)
702  stream >> nBlockNumber >> nRows >> nCols;
703 
704  double data[nRows*nCols];
705 
706  // read raw matrix data
707  stream.readRawData((char*)data, nRows*nCols*sizeof(double));
708 
709  // insert matrix at correct key
710  sbrm.insertMatrixBlock(nBlockNumber, nRows, nCols);
711 
712  // get matrix
713  LinearAlgebra::Matrix *matrix = sbrm[nBlockNumber];
714 
715  // fill with data
716  for ( r = 0; r < nRows; r++ ) {
717  for ( c = 0; c < nCols; c++ ) {
718  int nLocation = r*nRows + c;
719  (*matrix)(r,c) = data[nLocation];
720  }
721  }
722  }
723 
724  return stream;
725  }
726 
727 
734  QDebug operator<<(QDebug dbg, const SparseBlockRowMatrix &sbrm) {
735  dbg.space() << "New Block" << endl;
736 
737  QMapIterator<int, LinearAlgebra::Matrix *> it(sbrm);
738  while ( it.hasNext() ) {
739  it.next();
740 
741  if( !it.value() )
742  continue;
743 
744  // get matrix
745  LinearAlgebra::Matrix *matrix = it.value();
746 
747  // matrix rows, columns
748  int nRows = matrix->size1();
749  int nCols = matrix->size2();
750 
751  dbg.nospace() << qSetFieldWidth(4);
752  dbg.nospace() << qSetRealNumberPrecision(8);
753 
754  for ( int r = 0; r < nRows; r++ ) {
755  for ( int c = 0; c < nCols; c++ ) {
756  dbg.space() << (*matrix)(r,c);
757  }
758  dbg.space() << endl;
759  }
760  dbg.space() << endl;
761  }
762 
763  return dbg;
764  }
765 
766 
768  // SparseBlockMatrix methods
769 
773  SparseBlockMatrix::~SparseBlockMatrix() {
774  wipe();
775  }
776 
777 
782  void SparseBlockMatrix::wipe() {
783  qDeleteAll(*this);
784  clear();
785  }
786 
787 
793  SparseBlockMatrix::SparseBlockMatrix(const SparseBlockMatrix& src) {
794  copy(src);
795  }
796 
797 
803  void SparseBlockMatrix::copy(const SparseBlockMatrix& src) {
804  // handi-wipe
805  wipe();
806 
807  // copy all SparseBlockColumnMatrix objects from src
808  for( int i = 0; i < src.size(); i++ ) {
809  append( new SparseBlockColumnMatrix(*(src.at(i))));
810  }
811  }
812 
813 
819  SparseBlockMatrix& SparseBlockMatrix::operator=(const SparseBlockMatrix& src) {
820  if ( this == &src )
821  return *this;
822 
823  copy(src);
824 
825  return *this;
826  }
827 
828 
837  bool SparseBlockMatrix::setNumberOfColumns( int n ) {
838 
839  for( int i = 0; i < n; i++ )
840  append( new SparseBlockColumnMatrix() );
841 
842  return true;
843  }
844 
845 
859  bool SparseBlockMatrix::insertMatrixBlock(int nColumnBlock, int nRowBlock, int nRows, int nCols) {
860  return (*this)[nColumnBlock]->insertMatrixBlock(nRowBlock, nRows, nCols);
861  }
862 
863 
869  int SparseBlockMatrix::numberOfBlocks() {
870  int nBlocks = 0;
871 
872  for( int i = 0; i < size(); i++ ) {
873  if ( !(*this)[i] )
874  continue;
875 
876  nBlocks += (*this)[i]->size();
877  }
878 
879  return nBlocks;
880  }
881 
882 
888  int SparseBlockMatrix::numberOfDiagonalBlocks() {
889  int ndiagBlocks = 0;
890 
891  for( int i = 0; i < size(); i++ ) {
892  SparseBlockColumnMatrix* column = at(i);
893 
894  if ( !column )
895  continue;
896 
897  QMapIterator<int, LinearAlgebra::Matrix *> it(*column);
898  while ( it.hasNext() ) {
899  it.next();
900 
901  if( it.key() == i ) {
902  ndiagBlocks++;
903  break;
904  }
905  }
906  }
907 
908  return ndiagBlocks;
909  }
910 
911 
917  int SparseBlockMatrix::numberOfOffDiagonalBlocks() {
918  return (numberOfBlocks() - numberOfDiagonalBlocks());
919  }
920 
921 
927  int SparseBlockMatrix::numberOfElements() {
928  int nElements = 0;
929 
930  for( int i = 0; i < size(); i++ ) {
931  if ( !(*this)[i] )
932  continue;
933 
934  nElements += (*this)[i]->numberOfElements();
935  }
936 
937  return nElements;
938  }
939 
940 
950  LinearAlgebra::Matrix *SparseBlockMatrix::getBlock(int column, int row) {
951  return (*(*this)[column])[row];
952  }
953 
954 
958  void SparseBlockMatrix::zeroBlocks() {
959  for ( int i = 0; i < size(); i++ )
960  (*this)[i]->zeroBlocks();
961  }
962 
963 
969  void SparseBlockMatrix::print(std::ostream& outstream) {
970  if ( size() == 0 ) {
971  outstream << "Empty SparseBlockMatrix..." << std::endl;
972  return;
973  }
974 
975  outstream << "Printing SparseBlockMatrix..." << std::endl;
976  for( int i = 0; i < size(); i++ ) {
977  SparseBlockColumnMatrix* column = at(i);
978 
979  if ( column )
980  column->print(outstream);
981  else
982  outstream << "NULL column pointer at column[" << IString(i)
983  << "]!" << std::endl;
984  }
985  }
986 
987 
993  void SparseBlockMatrix::printClean(std::ostream& outstream) {
994  if ( size() == 0 ) {
995  outstream << "Empty SparseBlockMatrix..." << std::endl;
996  return;
997  }
998 
999  for( int i = 0; i < size(); i++ ) {
1000  SparseBlockColumnMatrix* column = at(i);
1001 
1002  if ( column )
1003  column->printClean(outstream);
1004  else
1005  outstream << "NULL column pointer at column[" << IString(i)
1006  << "]!" << std::endl;
1007  }
1008  }
1009 
1010 
1018  int SparseBlockMatrix::getLeadingColumnsForBlock(int nblockColumn) {
1019 
1020  if ( nblockColumn == 0 )
1021  return 0;
1022 
1023  int nLeadingColumnsElements = 0;
1024 
1025  int nCol = 0;
1026 
1027  while ( nCol < nblockColumn ) {
1028  if ( !(*this)[nCol] )
1029  continue;
1030 
1031  int ncolumns = (*this)[nCol]->numberOfColumns();
1032 
1033  if ( ncolumns == -1 )
1034  continue;
1035 
1036  nLeadingColumnsElements += ncolumns;
1037 
1038  nCol++;
1039  }
1040 
1041  return nLeadingColumnsElements;
1042  }
1043 
1044 
1052  int SparseBlockMatrix::getLeadingRowsForBlock(int nblockRow) {
1053 
1054  if ( nblockRow == 0 )
1055  return 0;
1056 
1057  int i = 0;
1058  int nLeadingRows = 0;
1059 
1060  while ( i < nblockRow ) {
1061  SparseBlockColumnMatrix* column = at(i);
1062 
1063  if ( !column )
1064  continue;
1065 
1066  QMapIterator<int, LinearAlgebra::Matrix *> it(*column);
1067  // iterate to last element in column
1068  while ( it.hasNext() ) {
1069  it.next();
1070 
1071  if( it.key() == i )
1072  nLeadingRows += it.value()->size1();
1073  }
1074  i++;
1075  }
1076 
1077  return nLeadingRows;
1078  }
1079 
1080 
1087  QDataStream &operator<<(QDataStream &stream, const SparseBlockMatrix &sparseBlockMatrix) {
1088  int nBlockColumns = sparseBlockMatrix.size();
1089 
1090  stream << (qint32)nBlockColumns;
1091 
1092  for ( int i =0; i < nBlockColumns; i++ )
1093  stream << *sparseBlockMatrix.at(i);
1094 
1095  return stream;
1096  }
1097 
1098 
1105  QDataStream &operator>>(QDataStream &stream, SparseBlockMatrix &sparseBlockMatrix) {
1106  qint32 nBlockColumns;
1107 
1108  // read and set number of block columns
1109  stream >> nBlockColumns;
1110  sparseBlockMatrix.setNumberOfColumns(nBlockColumns);
1111 
1112  for ( int i =0; i < nBlockColumns; i++ )
1113  stream >> *sparseBlockMatrix.at(i);
1114 
1115  return stream;
1116  }
1117 
1124  QDebug operator<<(QDebug dbg, const SparseBlockMatrix &m) {
1125  int nBlockColumns = m.size();
1126 
1127  for ( int i =0; i < nBlockColumns; i++ )
1128  dbg << *m.at(i);
1129 
1130  return dbg;
1131  }
1132 }
SparseBlockMatrix.
SparseBlockColumnMatrix.
boost::numeric::ublas::matrix< double > Matrix
Definition for an Isis::LinearAlgebra::Matrix of doubles.
void printClean(std::ostream &outstream)
Prints matrix blocks to std output stream out for debugging.
Unless noted otherwise, the portions of Isis written by the USGS are public domain.
QDebug operator<<(QDebug dbg, const Isis::Angle &angleToPrint)
Display an Angle for a debugging statement.
Definition: Angle.cpp:379
bool insertMatrixBlock(int nRowBlock, int nRows, int nCols)
Inserts a &quot;newed&quot; LinearAlgebra::Matrix pointer of size (nRows, nCols) into the map with the block ro...
std::istream & operator>>(std::istream &is, CSVReader &csv)
Input read operator for input stream sources.
Definition: CSVReader.cpp:463
void print(std::ostream &outstream)
Prints matrix blocks to std output stream out for debugging.
Adds specific functionality to C++ strings.
Definition: IString.h:179
bool insertMatrixBlock(int nColumnBlock, int nRows, int nCols)
Inserts a &quot;newed&quot; LinearAlgebra::Matrix pointer of size (nRows, nCols) into the map with the block co...
bool setNumberOfColumns(int n)
Initializes number of columns (SparseBlockColumnMatrix).
SparseBlockRowMatrix.

U.S. Department of the Interior | U.S. Geological Survey
ISIS | Privacy & Disclaimers | Astrogeology Research Program
To contact us, please post comments and questions on the ISIS Support Center
File Modified: 07/12/2023 23:29:23