86 RandomIterator2 oIndex,
91 typedef typename TNumTraits::baseType TBase;
92 typedef NumTraits<TBase> TBaseTraits;
94 const TBase epsilon =
static_cast<TBase
>(1e-20);
96 std::vector<T> scaling(
static_cast<size_t>(iSize));
97 typename std::vector<T>::iterator vv = scaling.begin();
100 for (std::ptrdiff_t i = 0; i < iSize; ++i)
102 RandomIterator1 rowI = ioMatrix + (i * iSize);
103 TBase normMax = TBaseTraits::zero;
104 std::ptrdiff_t jMax = iSize;
105 for (std::ptrdiff_t j = 0; j < iSize; ++j)
114 if (normMax == TBaseTraits::zero)
118 LASS_ASSERT(jMax != iSize);
123 for (std::ptrdiff_t j = 0; j < iSize; ++j)
126 for (i = 0; i < j; ++i)
128 RandomIterator1 rowI = ioMatrix + (i * iSize);
130 for (std::ptrdiff_t k = 0; k < i; ++k)
132 sum -= rowI[k] * ioMatrix[k * iSize + j];
137 TBase normMax = TBaseTraits::zero;
138 std::ptrdiff_t iMax = iSize;
139 for (i = j; i < iSize; ++i)
141 RandomIterator1 rowI = ioMatrix + (i * iSize);
143 for (std::ptrdiff_t k = 0; k < j; ++k)
145 sum -= rowI[k] * ioMatrix[k * iSize + j];
149 const T dum = vv[i] * sum;
157 LASS_ASSERT(iMax != iSize);
161 for (std::ptrdiff_t k = 0; k < iSize; ++k)
163 std::swap(ioMatrix[iMax * iSize + k], ioMatrix[j * iSize + k]);
170 TBase temp =
num::norm(ioMatrix[j * iSize + j]);
171 if (temp == TBaseTraits::zero)
173 ioMatrix[j * iSize + j] = TNumTraits::one;
179 const T dum =
num::conj(ioMatrix[j * iSize + j]) / temp;
180 for (i = j + 1; i < iSize; ++i)
182 ioMatrix[i * iSize + j] *= dum;
224 RandomIterator2 iIndex,
225 RandomIterator3 ioColumn,
226 std::ptrdiff_t iSize)
230 std::ptrdiff_t ii = iSize;
231 for (std::ptrdiff_t i = 0; i < iSize; ++i)
233 RandomIterator1 rowI = iMatrix + (i * iSize);
234 const std::ptrdiff_t ip = iIndex[i];
235 T sum = ioColumn[ip];
236 ioColumn[ip] = ioColumn[i];
240 for (std::ptrdiff_t j = ii; j < i; ++j)
242 sum -= rowI[j] * ioColumn[j];
247 if (!(sum == TNumTraits::zero))
255 for (std::ptrdiff_t ic = iSize; ic > 0; --ic)
257 const std::ptrdiff_t i = ic - 1;
258 RandomIterator1 rowI = iMatrix + (i * iSize);
260 for (std::ptrdiff_t j = ic; j < iSize; ++j)
262 sum -= rowI[j] * ioColumn[j];
264 ioColumn[i] = sum / rowI[i];
299 RandomIterator2 iMatrixLU,
300 RandomIterator3 iIndex,
301 RandomIterator4 iColumn,
303 std::ptrdiff_t iSize)
305 std::vector<T> right(
static_cast<size_t>(iSize));
306 typename std::vector<T>::iterator r = right.begin();
308 for (i = 0; i < iSize; ++i)
310 RandomIterator1 rowI = iMatrix + (i * iSize);
312 for (std::ptrdiff_t j = 0; j < iSize; ++j)
314 r[i] += rowI[j] * ioX[j];
320 for (i = 0; i < iSize; ++i)
345 RandomIterator2 ioColumnFirst,
346 RandomIterator2 ioColumnLast)
349 RandomIterator1 m = iMatrixRowMajor;
351 const T determinant = m[0] * m[3] - m[1] * m[2];
353 if (determinant == TNumTraits::zero)
358 const T inverseDeterminant =
num::inv(determinant);
360 for (RandomIterator2 column = ioColumnFirst; column != ioColumnLast; column += 2)
362 LASS_ASSERT(column + 1 != ioColumnLast);
363 const T x = column[0];
364 const T y = column[1];
365 column[0] = inverseDeterminant * (x * m[3] - y * m[1]);
366 column[1] = inverseDeterminant * (m[0] * y - m[2] * x);
391 RandomIterator2 ioColumnFirst,
392 RandomIterator2 ioColumnLast)
395 RandomIterator1 m = iMatrixRowMajor;
397 const T determinant =
398 m[0] * (m[4] * m[8] - m[7] * m[5]) +
399 m[3] * (m[7] * m[2] - m[1] * m[8]) +
400 m[6] * (m[1] * m[5] - m[4] * m[2]);
402 if (determinant == TNumTraits::zero)
407 const T inverseDeterminant =
num::inv(determinant);
409 for (RandomIterator2 column = ioColumnFirst; column != ioColumnLast; column += 3)
411 LASS_ASSERT(column + 1 != ioColumnLast && column + 2 != ioColumnLast);
412 const T x = column[0];
413 const T y = column[1];
414 const T z = column[2];
415 column[0] = inverseDeterminant * (
416 x * (m[4] * m[8] - m[7] * m[5]) +
417 y * (m[7] * m[2] - m[1] * m[8]) +
418 z * (m[1] * m[5] - m[4] * m[2]));
419 column[1] = inverseDeterminant * (
420 m[0] * (y * m[8] - z * m[5]) +
421 m[3] * (z * m[2] - x * m[8]) +
422 m[6] * (x * m[5] - y * m[2]));
423 column[2] = inverseDeterminant * (
424 m[0] * (m[4] * z - m[7] * y) +
425 m[3] * (m[7] * x - m[1] * z) +
426 m[6] * (m[1] * y - m[4] * x));
461 RandomIterator2 ioSolution, RandomIterator3 ioTemp,
462 std::ptrdiff_t iSize)
467 if (beta == TNumTraits::zero)
471 ioSolution[0] /= beta;
472 for (std::ptrdiff_t i = 1; i < iSize; ++i)
474 ioTemp[i] = iC[i - 1] / beta;
475 beta = iB[i] - iA[i] * ioTemp[i];
476 if (beta == TNumTraits::zero)
480 ioSolution[i] = (ioSolution[i] - iA[i] * ioSolution[i - 1]) / beta;
482 for (std::ptrdiff_t i = iSize - 1; i > 0; --i)
484 ioSolution[i - 1] -= ioTemp[i] * ioSolution[i];
void lusolve(RandomIterator1 iMatrix, RandomIterator2 iIndex, RandomIterator3 ioColumn, std::ptrdiff_t iSize)
Solves the set of linear eqautions A X = B.
void lumprove(RandomIterator1 iMatrix, RandomIterator2 iMatrixLU, RandomIterator3 iIndex, RandomIterator4 iColumn, RandomIterator5 ioX, std::ptrdiff_t iSize)
Improves a solution vector X of the linear set of equations A X = B.
bool solveTridiagonal(RandomIterator1 iA_1, RandomIterator1 iB_0, RandomIterator1 iC_0, RandomIterator2 ioSolution, RandomIterator3 ioTemp, std::ptrdiff_t iSize)
Solve system of linear equations with a tridiagonal matrix.
bool ludecomp(RandomIterator1 ioMatrix, RandomIterator2 oIndex, std::ptrdiff_t iSize, int &iD)
Given a complex matrix iA, this routine replaces it by the LU decomposition of a rowwise permutation ...