47 const std::vector<unsigned int>* anIndex,
48 const std::vector<double>* aVector) {
50 for (
unsigned int i = 0; i < anIndex->size(); ++i) {
51 int iIndex = (*anIndex)[i] - 1;
52 for (
unsigned int j = 0; j <= i; ++j) {
53 int jIndex = (*anIndex)[j] - 1;
54 if (iIndex < nBorder) {
55 theBorder(iIndex, jIndex) += (*aVector)[i] * aWeight
57 }
else if (jIndex < nBorder) {
58 theMixed(jIndex, iIndex - nBorder) += (*aVector)[i] * aWeight
61 unsigned int nBand = iIndex - jIndex;
62 theBand(nBand, jIndex - nBorder) += (*aVector)[i] * aWeight
76 const std::vector<unsigned int> anIndex)
const {
78 TMatrixDSym aMatrix(anIndex.size());
80 for (
unsigned int i = 0; i < anIndex.size(); ++i) {
81 int iIndex = anIndex[i] - 1;
82 for (
unsigned int j = 0; j <= i; ++j) {
83 int jIndex = anIndex[j] - 1;
84 if (iIndex < nBorder) {
85 aMatrix(i, j) =
theBorder(iIndex, jIndex);
86 }
else if (jIndex < nBorder) {
87 aMatrix(i, j) = -
theMixed(jIndex, iIndex - nBorder);
89 unsigned int nBand = iIndex - jIndex;
90 aMatrix(i, j) =
theBand(nBand, jIndex - nBorder);
92 aMatrix(j, i) = aMatrix(i, j);
141 const VVector borderSolution = inverseBorder * auxVec;
145 aSolution.
putVec(borderSolution);
159 std::cout <<
"Border part " << std::endl;
161 std::cout <<
"Mixed part " << std::endl;
163 std::cout <<
"Band part " << std::endl;
182 for (
int i = 0; i < nCol; ++i) {
183 auxVec(i) =
theBand(0, i) * 16.0;
185 for (
int i = 0; i < nCol; ++i) {
195 for (
int j = 1; j < std::min(nRow, nCol - i); ++j) {
197 for (
int k = 0; k < std::min(nRow, nCol - i) - j; ++k) {
216 VVector aSolution(aRightHandSide);
217 for (
int i = 0; i < nCol; ++i)
219 for (
int j = 1; j < std::min(nRow, nCol - i); ++j) {
220 aSolution(j + i) -=
theBand(j, i) * aSolution(i);
223 for (
int i = nCol - 1; i >= 0; i--)
225 double rxw =
theBand(0, i) * aSolution(i);
226 for (
int j = 1; j < std::min(nRow, nCol - i); ++j) {
227 rxw -=
theBand(j, i) * aSolution(j + i);
245 VMatrix aSolution(aRightHandSide);
246 for (
unsigned int iBorder = 0; iBorder <
numBorder; iBorder++) {
247 for (
int i = 0; i < nCol; ++i)
249 for (
int j = 1; j < std::min(nRow, nCol - i); ++j) {
250 aSolution(iBorder, j + i) -=
theBand(j, i)
251 * aSolution(iBorder, i);
254 for (
int i = nCol - 1; i >= 0; i--)
256 double rxw =
theBand(0, i) * aSolution(iBorder, i);
257 for (
int j = 1; j < std::min(nRow, nCol - i); ++j) {
258 rxw -=
theBand(j, i) * aSolution(iBorder, j + i);
260 aSolution(iBorder, i) = rxw;
274 VMatrix inverseBand(nRow, nCol);
276 for (
int i = nCol - 1; i >= 0; i--) {
278 for (
int j = i; j >= std::max(0, i - nRow + 1); j--) {
279 for (
int k = j + 1; k < std::min(nCol, j + nRow); ++k) {
280 rxw -= inverseBand(abs(i - k), std::min(i, k))
283 inverseBand(i - j, j) = rxw;
300 VMatrix aBand((nBand + 1), nCol);
301 for (
int i = 0; i < nCol; ++i) {
302 for (
int j = std::max(0, i - nBand); j <= i; ++j) {
304 for (
int l = 0; l < nBorder; ++l) {
305 sum += anArray(i, l) * aSymArray(l, l) * anArray(j, l);
306 for (
int k = 0; k < l; ++k) {
307 sum += anArray(i, l) * aSymArray(l, k) * anArray(j, k)
308 + anArray(i, k) * aSymArray(l, k) * anArray(j, l);
311 aBand(i - j, j) = sum;
VMatrix theMixed
Mixed part.
void printMatrix() const
Print bordered band matrix.
void decomposeBand()
(root free) Cholesky decomposition of band part: C=LDL^T
virtual ~BorderedBandMatrix()
VSymMatrix theBorder
Border part.
unsigned int numBand
Band width.
VVector solveBand(const VVector &aRightHandSide) const
Solve for band part.
unsigned int numCol
Band matrix size.
BorderedBandMatrix()
Create bordered band matrix.
VMatrix bandOfAVAT(const VMatrix &anArray, const VSymMatrix &aSymArray) const
Calculate band part of: 'anArray * aSymArray * anArray.T'.
VMatrix invertBand()
Invert band part.
unsigned int numBorder
Border size.
void resize(unsigned int nSize, unsigned int nBorder=1, unsigned int nBand=5)
Resize bordered band matrix.
VMatrix theBand
Band part.
void solveAndInvertBorderedBand(const VVector &aRightHandSide, VVector &aSolution)
Solve linear equation system, partially calculate inverse.
unsigned int numSize
Matrix size.
void addBlockMatrix(double aWeight, const std::vector< unsigned int > *anIndex, const std::vector< double > *aVector)
Add symmetric block matrix.
TMatrixDSym getBlockMatrix(const std::vector< unsigned int > anIndex) const
Retrieve symmetric block matrix.
Simple Matrix based on std::vector<double>
unsigned int getNumCols() const
Get number of columns.
VMatrix transpose() const
Get transposed matrix.
unsigned int getNumRows() const
Get number of rows.
void resize(const unsigned int nRows, const unsigned int nCols)
Resize Matrix.
void print() const
Print matrix.
Simple symmetric Matrix based on std::vector<double>
void print() const
Print matrix.
unsigned int invert()
Matrix inversion.
void resize(const unsigned int nRows)
Resize symmetric matrix.
Simple Vector based on std::vector<double>
void putVec(const VVector &aVector, unsigned int start=0)
Put part of vector.
VVector getVec(unsigned int len, unsigned int start=0) const
Get part of vector.
Namespace for the general broken lines package.