 |
NumCpp
2.1.0
A C++ implementation of the Python Numpy library
|
Go to the documentation of this file.
59 m_(inMatrix.
shape().rows),
60 n_(inMatrix.
shape().cols),
64 eps_(std::numeric_limits<double>::epsilon())
121 if (inInput.
size() != m_)
130 tsh_ = (inThresh >= 0. ? inThresh : 0.5 *
sqrt(m_ + n_ + 1.) * s_.
front() * eps_);
137 for (
uint32 i = 0; i < m_; i++)
139 ss += u_(i,
j) * inInput[i];
149 for (
uint32 jj = 0; jj < n_; jj++)
151 ss += v_(
j, jj) * tmp[jj];
171 static double SIGN(
double inA,
double inB) noexcept
173 return inB >= 0 ? (inA >= 0 ? inA : -inA) : (inA >= 0 ? -inA : inA);
204 for (i = 0; i < n_; ++i)
208 g = ss = scale = 0.0;
212 for (k = i; k < m_; ++k)
219 for (k = i; k < m_; ++k)
222 ss += u_(k, i) * u_(k, i);
230 for (
j = l - 1;
j < n_; ++
j)
232 for (ss = 0.0, k = i; k < m_; ++k)
234 ss += u_(k, i) * u_(k,
j);
239 for (k = i; k < m_; ++k)
241 u_(k,
j) +=
f * u_(k, i);
245 for (k = i; k < m_; ++k)
253 g = ss = scale = 0.0;
255 if (i + 1 <= m_ && i + 1 != n_)
257 for (k = l - 1; k < n_; ++k)
264 for (k = l - 1; k < n_; ++k)
267 ss += u_(i, k) * u_(i, k);
273 u_(i, l - 1) =
f - g;
275 for (k = l - 1; k < n_; ++k)
277 rv1[k] = u_(i, k) / h;
280 for (
j = l - 1;
j < m_; ++
j)
282 for (ss = 0.0, k = l - 1; k < n_; ++k)
284 ss += u_(
j, k) * u_(i, k);
287 for (k = l - 1; k < n_; ++k)
289 u_(
j, k) += ss * rv1[k];
293 for (k = l - 1; k < n_; ++k)
303 for (i = n_ - 1; i !=
static_cast<uint32>(-1); --i)
309 for (
j = l;
j < n_; ++
j)
311 v_(
j, i) = (u_(i,
j) / u_(i, l)) / g;
314 for (
j = l;
j < n_; ++
j)
316 for (ss = 0.0, k = l; k < n_; ++k)
318 ss += u_(i, k) * v_(k,
j);
321 for (k = l; k < n_; ++k)
323 v_(k,
j) += ss * v_(k, i);
328 for (
j = l;
j < n_; ++
j)
330 v_(i,
j) = v_(
j, i) = 0.0;
344 for (
j = l;
j < n_; ++
j)
353 for (
j = l;
j < n_; ++
j)
355 for (ss = 0.0, k = l; k < m_; ++k)
357 ss += u_(k, i) * u_(k,
j);
360 f = (ss / u_(i, i)) * g;
362 for (k = i; k < m_; ++k)
364 u_(k,
j) +=
f * u_(k, i);
368 for (
j = i;
j < m_; ++
j)
376 for (
j = i;
j < m_; ++
j)
385 for (k = n_ - 1; k !=
static_cast<uint32>(-1); --k)
387 for (its = 0; its < 30; ++its)
390 for (l = k; l !=
static_cast<uint32>(-1); --l)
393 if (l == 0 ||
std::abs(rv1[l]) <= eps_ * anorm)
399 if (
std::abs(s_[nm]) <= eps_ * anorm)
409 for (i = l; i < k + 1; ++i)
426 for (
j = 0;
j < m_; ++
j)
430 u_(
j, nm) = y *
c + z * ss;
431 u_(
j, i) = z *
c - y * ss;
442 for (
j = 0;
j < n_; ++
j)
444 v_(
j, k) = -v_(
j, k);
460 f = ((y - z) * (y + z) + (g - h) * (g + h)) / (2.0 * h * y);
462 f = ((x - z) * (x + z) + h * ((y / (
f + SIGN(g,
f))) - h)) / x;
465 for (
j = l;
j <= nm;
j++)
481 for (jj = 0; jj < n_; ++jj)
485 v_(jj,
j) = x *
c + z * ss;
486 v_(jj, i) = z *
c - x * ss;
502 for (jj = 0; jj < m_; ++jj)
506 u_(jj,
j) = y *
c + z * ss;
507 u_(jj, i) = z *
c - y * ss;
530 NdArray<double> su(m_, 1);
531 NdArray<double> sv(n_, 1);
542 for (i = inc; i < n_; ++i)
545 for (k = 0; k < m_; ++k)
550 for (k = 0; k < n_; ++k)
556 while (s_[
j - inc] < sw)
560 for (k = 0; k < m_; ++k)
562 u_(k,
j) = u_(k,
j - inc);
565 for (k = 0; k < n_; ++k)
567 v_(k,
j) = v_(k,
j - inc);
580 for (k = 0; k < m_; ++k)
585 for (k = 0; k < n_; ++k)
593 for (k = 0; k < n_; ++k)
597 for (i = 0; i < m_; i++)
605 for (
j = 0;
j < n_; ++
j)
613 if (ss > (m_ + n_) / 2)
615 for (i = 0; i < m_; ++i)
617 u_(i, k) = -u_(i, k);
620 for (
j = 0;
j < n_; ++
j)
622 v_(
j, k) = -v_(
j, k);
638 static double pythag(
double inA,
double inB) noexcept
auto sqrt(dtype inValue) noexcept
Definition: sqrt.hpp:51
Shape shape(const NdArray< dtype > &inArray) noexcept
Definition: Functions/Shape.hpp:45
const NdArray< double > & s() noexcept
Definition: SVDClass.hpp:102
Definition: SVDClass.hpp:48
value_type front() const noexcept
Definition: NdArrayCore.hpp:2789
constexpr auto j
Definition: Constants.hpp:46
std::uint32_t uint32
Definition: Types.hpp:41
constexpr double c
speed of light
Definition: Constants.hpp:41
size_type size() const noexcept
Definition: NdArrayCore.hpp:4326
const NdArray< double > & v() noexcept
Definition: SVDClass.hpp:90
Definition: Coordinate.hpp:45
SVD(const NdArray< double > &inMatrix)
Definition: SVDClass.hpp:58
#define THROW_INVALID_ARGUMENT_ERROR(msg)
Definition: Error.hpp:37
NdArray< dtype > max(const NdArray< dtype > &inArray, Axis inAxis=Axis::NONE)
Definition: max.hpp:46
constexpr dtype sqr(dtype inValue) noexcept
Definition: sqr.hpp:45
const NdArray< double > & u() noexcept
Definition: SVDClass.hpp:78
NdArray< double > solve(const NdArray< double > &inInput, double inThresh=-1.0)
Definition: SVDClass.hpp:117
dtype f(dtype inDofN, dtype inDofD)
Definition: f.hpp:58
NdArray< dtype > min(const NdArray< dtype > &inArray, Axis inAxis=Axis::NONE)
Definition: min.hpp:46
auto abs(dtype inValue) noexcept
Definition: abs.hpp:52