00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef SELDON_FILE_MATRIX_HERMPACKED_CXX
00022
00023 #include "Matrix_HermPacked.hxx"
00024
00025 namespace Seldon
00026 {
00027
00028
00029
00030
00031
00032
00033
00035
00038 template <class T, class Prop, class Storage, class Allocator>
00039 inline Matrix_HermPacked<T, Prop, Storage, Allocator>::Matrix_HermPacked():
00040 Matrix_Base<T, Allocator>()
00041 {
00042 }
00043
00044
00046
00051 template <class T, class Prop, class Storage, class Allocator>
00052 inline Matrix_HermPacked<T, Prop, Storage, Allocator>
00053 ::Matrix_HermPacked(int i, int j):
00054 Matrix_Base<T, Allocator>(i, i)
00055 {
00056
00057 #ifdef SELDON_CHECK_MEMORY
00058 try
00059 {
00060 #endif
00061
00062 this->data_ = this->allocator_.allocate((i * (i + 1)) / 2, this);
00063
00064 #ifdef SELDON_CHECK_MEMORY
00065 }
00066 catch (...)
00067 {
00068 this->m_ = 0;
00069 this->n_ = 0;
00070 this->data_ = NULL;
00071 return;
00072 }
00073 if (this->data_ == NULL)
00074 {
00075 this->m_ = 0;
00076 this->n_ = 0;
00077 return;
00078 }
00079 #endif
00080
00081 }
00082
00083
00085 template <class T, class Prop, class Storage, class Allocator>
00086 inline Matrix_HermPacked<T, Prop, Storage, Allocator>
00087 ::Matrix_HermPacked(const Matrix_HermPacked<T, Prop,
00088 Storage, Allocator>& A):
00089 Matrix_Base<T, Allocator>()
00090 {
00091 this->m_ = 0;
00092 this->n_ = 0;
00093 this->data_ = NULL;
00094
00095 this->Copy(A);
00096 }
00097
00098
00099
00100
00101
00102
00103
00105 template <class T, class Prop, class Storage, class Allocator>
00106 inline Matrix_HermPacked<T, Prop, Storage, Allocator>::~Matrix_HermPacked()
00107 {
00108
00109 #ifdef SELDON_CHECK_MEMORY
00110 try
00111 {
00112 #endif
00113
00114 if (this->data_ != NULL)
00115 {
00116 this->allocator_.deallocate(this->data_,
00117 (this->m_ * (this->m_ + 1)) / 2);
00118 this->data_ = NULL;
00119 }
00120
00121 #ifdef SELDON_CHECK_MEMORY
00122 }
00123 catch (...)
00124 {
00125 this->m_ = 0;
00126 this->n_ = 0;
00127 this->data_ = NULL;
00128 }
00129 #endif
00130
00131 }
00132
00133
00135
00139 template <class T, class Prop, class Storage, class Allocator>
00140 inline void Matrix_HermPacked<T, Prop, Storage, Allocator>::Clear()
00141 {
00142 this->~Matrix_HermPacked();
00143 this->m_ = 0;
00144 this->n_ = 0;
00145 }
00146
00147
00148
00149
00150
00151
00152
00154
00157 template <class T, class Prop, class Storage, class Allocator>
00158 int Matrix_HermPacked<T, Prop, Storage, Allocator>::GetDataSize() const
00159 {
00160 return (this->m_ * (this->m_ + 1)) / 2;
00161 }
00162
00163
00164
00165
00166
00167
00168
00170
00176 template <class T, class Prop, class Storage, class Allocator>
00177 inline void Matrix_HermPacked<T, Prop, Storage, Allocator>
00178 ::Reallocate(int i, int j)
00179 {
00180
00181 if (i != this->m_)
00182 {
00183 this->m_ = i;
00184 this->n_ = i;
00185
00186 #ifdef SELDON_CHECK_MEMORY
00187 try
00188 {
00189 #endif
00190
00191 this->data_ =
00192 reinterpret_cast<pointer>(this->allocator_.reallocate(this->data_,
00193 (i*(i + 1)) / 2,
00194 this));
00195
00196 #ifdef SELDON_CHECK_MEMORY
00197 }
00198 catch (...)
00199 {
00200 this->m_ = 0;
00201 this->n_ = 0;
00202 this->data_ = NULL;
00203 throw NoMemory("Matrix_HermPacked::Reallocate(int, int)",
00204 "Unable to reallocate memory for data_.");
00205 }
00206 if (this->data_ == NULL)
00207 {
00208 this->m_ = 0;
00209 this->n_ = 0;
00210 throw NoMemory("Matrix_HermPacked::Reallocate(int, int)",
00211 "Unable to reallocate memory for data_.");
00212 }
00213 #endif
00214
00215 }
00216 }
00217
00218
00221
00235 template <class T, class Prop, class Storage, class Allocator>
00236 inline void Matrix_HermPacked<T, Prop, Storage, Allocator>
00237 ::SetData(int i, int j,
00238 typename Matrix_HermPacked<T, Prop, Storage, Allocator>
00239 ::pointer data)
00240 {
00241 this->Clear();
00242
00243 this->m_ = i;
00244 this->n_ = i;
00245
00246 this->data_ = data;
00247 }
00248
00249
00251
00255 template <class T, class Prop, class Storage, class Allocator>
00256 inline void Matrix_HermPacked<T, Prop, Storage, Allocator>::Nullify()
00257 {
00258 this->data_ = NULL;
00259 this->m_ = 0;
00260 this->n_ = 0;
00261 }
00262
00263
00264
00265
00266
00267
00268
00270
00276 template <class T, class Prop, class Storage, class Allocator>
00277 inline typename Matrix_HermPacked<T, Prop, Storage, Allocator>::value_type
00278 Matrix_HermPacked<T, Prop, Storage, Allocator>
00279 ::operator() (int i, int j) const
00280 {
00281
00282 #ifdef SELDON_CHECK_BOUNDS
00283 if (i < 0 || i >= this->m_)
00284 throw WrongRow("Matrix_HermPacked::operator()",
00285 string("Index should be in [0, ") + to_str(this->m_-1)
00286 + "], but is equal to " + to_str(i) + ".");
00287 if (j < 0 || j >= this->n_)
00288 throw WrongCol("Matrix_HermPacked::operator()",
00289 string("Index should be in [0, ") + to_str(this->n_-1)
00290 + "], but is equal to " + to_str(j) + ".");
00291 #endif
00292
00293 if (i > j)
00294 return conj(this->data_[Storage::GetFirst(j * this->m_
00295 - (j*(j+1)) / 2 + i,
00296 (i*(i+1)) / 2 + j)]);
00297 else
00298 return this->data_[Storage::GetFirst(i * this->n_ - (i*(i+1)) / 2 + j,
00299 (j*(j+1)) / 2 + i)];
00300 }
00301
00302
00304
00311 template <class T, class Prop, class Storage, class Allocator>
00312 inline typename Matrix_HermPacked<T, Prop, Storage, Allocator>::reference
00313 Matrix_HermPacked<T, Prop, Storage, Allocator>::Val(int i, int j)
00314 {
00315
00316 #ifdef SELDON_CHECK_BOUNDS
00317 if (i < 0 || i >= this->m_)
00318 throw WrongRow("Matrix_HermPacked::Val(int, int)",
00319 string("Index should be in [0, ") + to_str(this->m_-1)
00320 + "], but is equal to " + to_str(i) + ".");
00321 if (j < 0 || j >= this->n_)
00322 throw WrongCol("Matrix_HermPacked::Val(int, int)",
00323 string("Index should be in [0, ") + to_str(this->n_-1)
00324 + "], but is equal to " + to_str(j) + ".");
00325 if (i > j)
00326 throw WrongRow("Matrix_HermPacked::Val(int, int)",
00327 string("Attempted to access to element (")
00328 + to_str(i) + ", " + to_str(j)
00329 + ") but row index should not be strictly"
00330 + " greater than column index.");
00331 #endif
00332
00333 return this->data_[Storage::GetFirst(i * this->n_ - (i*(i+1)) / 2 + j,
00334 (j*(j+1)) / 2 + i)];
00335 }
00336
00337
00339
00346 template <class T, class Prop, class Storage, class Allocator>
00347 inline typename Matrix_HermPacked<T, Prop, Storage, Allocator>
00348 ::const_reference
00349 Matrix_HermPacked<T, Prop, Storage, Allocator>::Val(int i, int j) const
00350 {
00351
00352 #ifdef SELDON_CHECK_BOUNDS
00353 if (i < 0 || i >= this->m_)
00354 throw WrongRow("Matrix_HermPacked::Val(int, int) const",
00355 string("Index should be in [0, ") + to_str(this->m_-1)
00356 + "], but is equal to " + to_str(i) + ".");
00357 if (j < 0 || j >= this->n_)
00358 throw WrongCol("Matrix_HermPacked::Val(int, int) cont",
00359 string("Index should be in [0, ") + to_str(this->n_-1)
00360 + "], but is equal to " + to_str(j) + ".");
00361 if (i > j)
00362 throw WrongRow("Matrix_HermPacked::Val(int, int) const",
00363 string("Attempted to access to element (")
00364 + to_str(i) + ", " + to_str(j)
00365 + string(") but row index should not be strictly")
00366 + " greater than column index.");
00367 #endif
00368
00369 return this->data_[Storage::GetFirst(i * this->n_ - (i*(i+1)) / 2 + j,
00370 (j*(j+1)) / 2 + i)];
00371 }
00372
00373
00375
00380 template <class T, class Prop, class Storage, class Allocator>
00381 inline typename Matrix_HermPacked<T, Prop, Storage, Allocator>::reference
00382 Matrix_HermPacked<T, Prop, Storage, Allocator>::Get(int i, int j)
00383 {
00384 return this->Val(i, j);
00385 }
00386
00387
00389
00394 template <class T, class Prop, class Storage, class Allocator>
00395 inline typename Matrix_HermPacked<T, Prop, Storage, Allocator>
00396 ::const_reference
00397 Matrix_HermPacked<T, Prop, Storage, Allocator>::Get(int i, int j) const
00398 {
00399 return this->Val(i, j);
00400 }
00401
00402
00404
00409 template <class T, class Prop, class Storage, class Allocator>
00410 inline typename Matrix_HermPacked<T, Prop, Storage, Allocator>::reference
00411 Matrix_HermPacked<T, Prop, Storage, Allocator>::operator[] (int i)
00412 {
00413
00414 #ifdef SELDON_CHECK_BOUNDS
00415 if (i < 0 || i >= this->GetDataSize())
00416 throw WrongIndex("Matrix_HermPacked::operator[] (int)",
00417 string("Index should be in [0, ")
00418 + to_str(this->GetDataSize()-1) + "], but is equal to "
00419 + to_str(i) + ".");
00420 #endif
00421
00422 return this->data_[i];
00423 }
00424
00425
00427
00432 template <class T, class Prop, class Storage, class Allocator>
00433 inline typename Matrix_HermPacked<T, Prop, Storage, Allocator>
00434 ::const_reference
00435 Matrix_HermPacked<T, Prop, Storage, Allocator>::operator[] (int i) const
00436 {
00437
00438 #ifdef SELDON_CHECK_BOUNDS
00439 if (i < 0 || i >= this->GetDataSize())
00440 throw WrongIndex("Matrix_HermPacked::operator[] (int) const",
00441 string("Index should be in [0, ")
00442 + to_str(this->GetDataSize()-1) + "], but is equal to "
00443 + to_str(i) + ".");
00444 #endif
00445
00446 return this->data_[i];
00447 }
00448
00449
00451
00456 template <class T, class Prop, class Storage, class Allocator>
00457 inline Matrix_HermPacked<T, Prop, Storage, Allocator>&
00458 Matrix_HermPacked<T, Prop, Storage, Allocator>
00459 ::operator= (const Matrix_HermPacked<T, Prop, Storage, Allocator>& A)
00460 {
00461 this->Copy(A);
00462
00463 return *this;
00464 }
00465
00466
00468
00473 template <class T, class Prop, class Storage, class Allocator>
00474 inline void Matrix_HermPacked<T, Prop, Storage, Allocator>
00475 ::Set(int i, int j, const T& x)
00476 {
00477 if (i > j)
00478 this->Val(j, i) = conj(x);
00479 else
00480 this->Val(i, j) = x;
00481 }
00482
00483
00485
00490 template <class T, class Prop, class Storage, class Allocator>
00491 inline void Matrix_HermPacked<T, Prop, Storage, Allocator>
00492 ::Copy(const Matrix_HermPacked<T, Prop, Storage, Allocator>& A)
00493 {
00494 this->Reallocate(A.GetM(), A.GetN());
00495
00496 this->allocator_.memorycpy(this->data_, A.GetData(), this->GetDataSize());
00497 }
00498
00499
00500
00501
00502
00503
00504
00506
00510 template <class T, class Prop, class Storage, class Allocator>
00511 void Matrix_HermPacked<T, Prop, Storage, Allocator>::Zero()
00512 {
00513 this->allocator_.memoryset(this->data_, char(0),
00514 this->GetDataSize() * sizeof(value_type));
00515 }
00516
00517
00519 template <class T, class Prop, class Storage, class Allocator>
00520 void Matrix_HermPacked<T, Prop, Storage, Allocator>::SetIdentity()
00521 {
00522 this->Fill(T(0));
00523
00524 T one;
00525 SetComplexOne(one);
00526 for (int i = 0; i < min(this->m_, this->n_); i++)
00527 this->Val(i,i) = one;
00528 }
00529
00530
00532
00536 template <class T, class Prop, class Storage, class Allocator>
00537 void Matrix_HermPacked<T, Prop, Storage, Allocator>::Fill()
00538 {
00539 for (int i = 0; i < this->GetDataSize(); i++)
00540 this->data_[i] = i;
00541 }
00542
00543
00545
00550 template <class T, class Prop, class Storage, class Allocator>
00551 template <class T0>
00552 void Matrix_HermPacked<T, Prop, Storage, Allocator>::Fill(const T0& x)
00553 {
00554 for (int i = 0; i < this->GetDataSize(); i++)
00555 this->data_[i] = x;
00556 }
00557
00558
00560
00565 template <class T, class Prop, class Storage, class Allocator>
00566 template <class T0>
00567 Matrix_HermPacked<T, Prop, Storage, Allocator>&
00568 Matrix_HermPacked<T, Prop, Storage, Allocator>::operator= (const T0& x)
00569 {
00570 this->Fill(x);
00571
00572 return *this;
00573 }
00574
00575
00577
00580 template <class T, class Prop, class Storage, class Allocator>
00581 void Matrix_HermPacked<T, Prop, Storage, Allocator>::FillRand()
00582 {
00583 srand(time(NULL));
00584 for (int i = 0; i < this->GetDataSize(); i++)
00585 this->data_[i] = rand();
00586 }
00587
00588
00590
00595 template <class T, class Prop, class Storage, class Allocator>
00596 void Matrix_HermPacked<T, Prop, Storage, Allocator>::Print() const
00597 {
00598 for (int i = 0; i < this->m_; i++)
00599 {
00600 for (int j = 0; j < this->n_; j++)
00601 cout << (*this)(i, j) << "\t";
00602 cout << endl;
00603 }
00604 }
00605
00606
00608
00619 template <class T, class Prop, class Storage, class Allocator>
00620 void Matrix_HermPacked<T, Prop, Storage, Allocator>
00621 ::Print(int a, int b, int m, int n) const
00622 {
00623 for (int i = a; i < min(this->m_, a+m); i++)
00624 {
00625 for (int j = b; j < min(this->n_, b+n); j++)
00626 cout << (*this)(i, j) << "\t";
00627 cout << endl;
00628 }
00629 }
00630
00631
00633
00641 template <class T, class Prop, class Storage, class Allocator>
00642 void Matrix_HermPacked<T, Prop, Storage, Allocator>::Print(int l) const
00643 {
00644 Print(0, 0, l, l);
00645 }
00646
00647
00648
00649
00650
00651
00652
00654
00661 template <class T, class Prop, class Storage, class Allocator>
00662 void Matrix_HermPacked<T, Prop, Storage, Allocator>
00663 ::Write(string FileName) const
00664 {
00665
00666 ofstream FileStream;
00667 FileStream.open(FileName.c_str(), ofstream::binary);
00668
00669 #ifdef SELDON_CHECK_IO
00670
00671 if (!FileStream.is_open())
00672 throw IOError("Matrix_HermPacked::Write(string FileName)",
00673 string("Unable to open file \"") + FileName + "\".");
00674 #endif
00675
00676 this->Write(FileStream);
00677
00678 FileStream.close();
00679
00680 }
00681
00682
00684
00691 template <class T, class Prop, class Storage, class Allocator>
00692 void Matrix_HermPacked<T, Prop, Storage, Allocator>
00693 ::Write(ostream& FileStream) const
00694 {
00695
00696 #ifdef SELDON_CHECK_IO
00697
00698 if (!FileStream.good())
00699 throw IOError("Matrix_HermPacked::Write(ofstream& FileStream)",
00700 "Stream is not ready.");
00701 #endif
00702
00703 FileStream.write(reinterpret_cast<char*>(const_cast<int*>(&this->m_)),
00704 sizeof(int));
00705 FileStream.write(reinterpret_cast<char*>(const_cast<int*>(&this->n_)),
00706 sizeof(int));
00707
00708 FileStream.write(reinterpret_cast<char*>(this->data_),
00709 this->GetDataSize() * sizeof(value_type));
00710
00711 #ifdef SELDON_CHECK_IO
00712
00713 if (!FileStream.good())
00714 throw IOError("Matrix_HermPacked::Write(ofstream& FileStream)",
00715 string("Output operation failed.")
00716 + string(" The output file may have been removed")
00717 + " or there is no space left on device.");
00718 #endif
00719
00720 }
00721
00722
00724
00731 template <class T, class Prop, class Storage, class Allocator>
00732 void Matrix_HermPacked<T, Prop, Storage, Allocator>
00733 ::WriteText(string FileName) const
00734 {
00735 ofstream FileStream;
00736 FileStream.precision(cout.precision());
00737 FileStream.flags(cout.flags());
00738 FileStream.open(FileName.c_str());
00739
00740 #ifdef SELDON_CHECK_IO
00741
00742 if (!FileStream.is_open())
00743 throw IOError("Matrix_HermPacked::WriteText(string FileName)",
00744 string("Unable to open file \"") + FileName + "\".");
00745 #endif
00746
00747 this->WriteText(FileStream);
00748
00749 FileStream.close();
00750 }
00751
00752
00754
00761 template <class T, class Prop, class Storage, class Allocator>
00762 void Matrix_HermPacked<T, Prop, Storage, Allocator>
00763 ::WriteText(ostream& FileStream) const
00764 {
00765
00766 #ifdef SELDON_CHECK_IO
00767
00768 if (!FileStream.good())
00769 throw IOError("Matrix_HermPacked::WriteText(ofstream& FileStream)",
00770 "Stream is not ready.");
00771 #endif
00772
00773 int i, j;
00774 for (i = 0; i < this->GetM(); i++)
00775 {
00776 for (j = 0; j < this->GetN(); j++)
00777 FileStream << (*this)(i, j) << '\t';
00778 FileStream << endl;
00779 }
00780
00781 #ifdef SELDON_CHECK_IO
00782
00783 if (!FileStream.good())
00784 throw IOError("Matrix_HermPacked::WriteText(ofstream& FileStream)",
00785 string("Output operation failed.")
00786 + string(" The output file may have been removed")
00787 + " or there is no space left on device.");
00788 #endif
00789
00790 }
00791
00792
00794
00801 template <class T, class Prop, class Storage, class Allocator>
00802 void Matrix_HermPacked<T, Prop, Storage, Allocator>::Read(string FileName)
00803 {
00804 ifstream FileStream;
00805 FileStream.open(FileName.c_str(), ifstream::binary);
00806
00807 #ifdef SELDON_CHECK_IO
00808
00809 if (!FileStream.good())
00810 throw IOError("Matrix_HermPacked::Read(string FileName)",
00811 string("Unable to open file \"") + FileName + "\".");
00812 #endif
00813
00814 this->Read(FileStream);
00815
00816 FileStream.close();
00817 }
00818
00819
00821
00828 template <class T, class Prop, class Storage, class Allocator>
00829 void Matrix_HermPacked<T, Prop, Storage, Allocator>
00830 ::Read(istream& FileStream)
00831 {
00832
00833 #ifdef SELDON_CHECK_IO
00834
00835 if (!FileStream.good())
00836 throw IOError("Matrix_HermPacked::Read(ifstream& FileStream)",
00837 "Stream is not ready.");
00838 #endif
00839
00840 int new_m, new_n;
00841 FileStream.read(reinterpret_cast<char*>(&new_m), sizeof(int));
00842 FileStream.read(reinterpret_cast<char*>(&new_n), sizeof(int));
00843 this->Reallocate(new_m, new_n);
00844
00845 FileStream.read(reinterpret_cast<char*>(this->data_),
00846 this->GetDataSize() * sizeof(value_type));
00847
00848 #ifdef SELDON_CHECK_IO
00849
00850 if (!FileStream.good())
00851 throw IOError("Matrix_HermPacked::Read(ifstream& FileStream)",
00852 string("Input operation failed.")
00853 + string(" The input file may have been removed")
00854 + " or may not contain enough data.");
00855 #endif
00856
00857 }
00858
00859
00861
00865 template <class T, class Prop, class Storage, class Allocator>
00866 void Matrix_HermPacked<T, Prop, Storage, Allocator>::ReadText(string FileName)
00867 {
00868 ifstream FileStream;
00869 FileStream.open(FileName.c_str());
00870
00871 #ifdef SELDON_CHECK_IO
00872
00873 if (!FileStream.is_open())
00874 throw IOError("Matrix_Pointers::ReadText(string FileName)",
00875 string("Unable to open file \"") + FileName + "\".");
00876 #endif
00877
00878 this->ReadText(FileStream);
00879
00880 FileStream.close();
00881 }
00882
00883
00885
00889 template <class T, class Prop, class Storage, class Allocator>
00890 void Matrix_HermPacked<T, Prop, Storage, Allocator>
00891 ::ReadText(istream& FileStream)
00892 {
00893
00894 Clear();
00895
00896 #ifdef SELDON_CHECK_IO
00897
00898 if (!FileStream.good())
00899 throw IOError("Matrix_Pointers::ReadText(ifstream& FileStream)",
00900 "Stream is not ready.");
00901 #endif
00902
00903
00904 string line;
00905 getline(FileStream, line);
00906
00907 if (FileStream.fail())
00908 {
00909
00910 return;
00911 }
00912
00913
00914 istringstream line_stream(line);
00915 Vector<T> first_row;
00916 first_row.ReadText(line_stream);
00917
00918
00919 Vector<T> other_rows;
00920 other_rows.ReadText(FileStream);
00921
00922
00923 int n = first_row.GetM();
00924 int m = 1 + other_rows.GetM()/n;
00925
00926 #ifdef SELDON_CHECK_IO
00927
00928 if (other_rows.GetM() != (m-1)*n)
00929 throw IOError("Matrix_Pointers::ReadText(ifstream& FileStream)",
00930 "The file should contain same number of columns.");
00931 #endif
00932
00933 this->Reallocate(m,n);
00934
00935 for (int j = 0; j < n; j++)
00936 this->Val(0, j) = first_row(j);
00937
00938 int nb = 0;
00939 for (int i = 1; i < m; i++)
00940 {
00941 for (int j = 0; j < i; j++)
00942 nb++;
00943
00944 for (int j = i; j < n; j++)
00945 this->Val(i, j) = other_rows(nb++);
00946 }
00947 }
00948
00949
00950
00952
00954
00955
00956
00957
00958
00959
00960
00962
00965 template <class T, class Prop, class Allocator>
00966 Matrix<T, Prop, ColHermPacked, Allocator>::Matrix():
00967 Matrix_HermPacked<T, Prop, ColHermPacked, Allocator>()
00968 {
00969 }
00970
00971
00973
00978 template <class T, class Prop, class Allocator>
00979 Matrix<T, Prop, ColHermPacked, Allocator>::Matrix(int i, int j):
00980 Matrix_HermPacked<T, Prop, ColHermPacked, Allocator>(i, j)
00981 {
00982 }
00983
00984
00985
00986
00987
00988
00989
00991
00994 template <class T, class Prop, class Allocator>
00995 template <class T0>
00996 inline Matrix<T, Prop, ColHermPacked, Allocator>&
00997 Matrix<T, Prop, ColHermPacked, Allocator>
00998 ::operator= (const T0& x)
00999 {
01000 this->Fill(x);
01001
01002 return *this;
01003 }
01004
01005
01007
01012 template <class T, class Prop, class Allocator>
01013 inline Matrix<T, Prop, ColHermPacked, Allocator>&
01014 Matrix<T, Prop, ColHermPacked, Allocator>::operator= (const Matrix<T, Prop,
01015 ColHermPacked,
01016 Allocator>& A)
01017 {
01018 this->Copy(A);
01019 return *this;
01020 }
01021
01022
01024
01027 template <class T, class Prop, class Allocator>
01028 template <class T0>
01029 Matrix<T, Prop, ColHermPacked, Allocator>&
01030 Matrix<T, Prop, ColHermPacked, Allocator>::operator*= (const T0& x)
01031 {
01032 for (int i = 0; i < this->GetDataSize();i++)
01033 this->data_[i] *= x;
01034
01035 return *this;
01036 }
01037
01038
01040
01047 template <class T, class Prop, class Allocator>
01048 inline void Matrix<T, Prop, ColHermPacked, Allocator>
01049 ::Resize(int i, int j)
01050 {
01051
01052
01053 int nold = this->GetDataSize();
01054 Vector<T, VectFull, Allocator> xold(nold);
01055 for (int k = 0; k < nold; k++)
01056 xold(k) = this->data_[k];
01057
01058
01059 this->Reallocate(i, j);
01060
01061
01062 int nmin = min(nold, this->GetDataSize());
01063 for (int k = 0; k < nmin; k++)
01064 this->data_[k] = xold(k);
01065 }
01066
01067
01069
01071
01072
01073
01074
01075
01076
01077
01079
01082 template <class T, class Prop, class Allocator>
01083 Matrix<T, Prop, RowHermPacked, Allocator>::Matrix():
01084 Matrix_HermPacked<T, Prop, RowHermPacked, Allocator>()
01085 {
01086 }
01087
01088
01090
01095 template <class T, class Prop, class Allocator>
01096 Matrix<T, Prop, RowHermPacked, Allocator>::Matrix(int i, int j):
01097 Matrix_HermPacked<T, Prop, RowHermPacked, Allocator>(i, j)
01098 {
01099 }
01100
01101
01102
01103
01104
01105
01106
01108
01111 template <class T, class Prop, class Allocator>
01112 template <class T0>
01113 inline Matrix<T, Prop, RowHermPacked, Allocator>&
01114 Matrix<T, Prop, RowHermPacked, Allocator>
01115 ::operator= (const T0& x)
01116 {
01117 this->Fill(x);
01118
01119 return *this;
01120 }
01121
01122
01124
01129 template <class T, class Prop, class Allocator>
01130 inline Matrix<T, Prop, RowHermPacked, Allocator>&
01131 Matrix<T, Prop, RowHermPacked, Allocator>::operator= (const Matrix<T, Prop,
01132 RowHermPacked,
01133 Allocator>& A)
01134 {
01135 this->Copy(A);
01136 return *this;
01137 }
01138
01139
01141
01144 template <class T, class Prop, class Allocator>
01145 template <class T0>
01146 Matrix<T, Prop, RowHermPacked, Allocator>&
01147 Matrix<T, Prop, RowHermPacked, Allocator>::operator*= (const T0& x)
01148 {
01149 for (int i = 0; i < this->GetDataSize();i++)
01150 this->data_[i] *= x;
01151
01152 return *this;
01153 }
01154
01155
01157
01164 template <class T, class Prop, class Allocator>
01165 inline void Matrix<T, Prop, RowHermPacked, Allocator>
01166 ::Resize(int i, int j)
01167 {
01168
01169 int nold = this->GetDataSize(), iold = this->m_;
01170 Vector<T, VectFull, Allocator> xold(nold);
01171 for (int k = 0; k < nold; k++)
01172 xold(k) = this->data_[k];
01173
01174
01175 this->Reallocate(i, j);
01176
01177
01178 int imin = min(iold, i);
01179 nold = 0;
01180 int n = 0;
01181 for (int k = 0; k < imin; k++)
01182 {
01183 for (int l = k; l < imin; l++)
01184 this->data_[n+l-k] = xold(nold+l-k);
01185
01186 n += i - k;
01187 nold += iold - k;
01188 }
01189 }
01190
01191
01192 }
01193
01194 #define SELDON_FILE_MATRIX_HERMPACKED_CXX
01195 #endif