53 return std::fabs(a) * std::sqrt(1 + c*c);
107 for (k = 0; k < std::max(nct,nrt); k++) {
114 for (i = k; i <
m_; i++) {
115 s_[k] = hypot(
s_[k],A[i][k]);
121 for (i = k; i <
m_; i++) {
128 for (j = k+1; j <
n_; j++) {
129 if ((k < nct) && (
s_[k] != 0.0)) {
134 for (i = k; i <
m_; i++) {
135 t += A[i][k]*A[i][j];
138 for (i = k; i <
m_; i++) {
139 A[i][j] +=
t*A[i][k];
153 for (i = k; i <
m_; i++) {
163 for (i = k+1; i <
n_; i++) {
164 e[k] = hypot(e[k],e[i]);
170 for (i = k+1; i <
n_; i++) {
176 if ((k+1 <
m_) && (e[k] != 0.0)) {
180 for (i = k+1; i <
m_; i++) {
183 for (j = k+1; j <
n_; j++) {
184 for (i = k+1; i <
m_; i++) {
185 work[i] += e[j]*A[i][j];
188 for (j = k+1; j <
n_; j++) {
189 Real t = -e[j]/e[k+1];
190 for (i = k+1; i <
m_; i++) {
191 A[i][j] +=
t*work[i];
199 for (i = k+1; i <
n_; i++) {
208 s_[nct] = A[nct][nct];
211 e[nrt] = A[nrt][
n_-1];
217 for (j = nct; j <
n_; j++) {
218 for (i = 0; i <
m_; i++) {
223 for (k = nct-1; k >= 0; --k) {
225 for (j = k+1; j <
n_; ++j) {
227 for (i = k; i <
m_; i++) {
228 t +=
U_[i][k]*
U_[i][j];
231 for (i = k; i <
m_; i++) {
232 U_[i][j] +=
t*
U_[i][k];
235 for (i = k; i <
m_; i++ ) {
236 U_[i][k] = -
U_[i][k];
238 U_[k][k] = 1.0 +
U_[k][k];
239 for (i = 0; i < k-1; i++) {
243 for (i = 0; i <
m_; i++) {
252 for (k =
n_-1; k >= 0; --k) {
253 if ((k < nrt) && (e[k] != 0.0)) {
254 for (j = k+1; j <
n_; ++j) {
256 for (i = k+1; i <
n_; i++) {
257 t +=
V_[i][k]*
V_[i][j];
260 for (i = k+1; i <
n_; i++) {
261 V_[i][j] +=
t*
V_[i][k];
265 for (i = 0; i <
n_; i++) {
275 Real eps = std::pow(2.0,-52.0);
292 for (k = p-2; k >= -1; --k) {
296 if (std::fabs(e[k]) <= eps*(std::fabs(
s_[k]) +
297 std::fabs(
s_[k+1]))) {
306 for (ks = p-1; ks >= k; --ks) {
310 Real t = (ks != p ?
Real(std::fabs(e[ks])) : 0.) +
311 (ks != k+1 ?
Real(std::fabs(e[ks-1])) : 0.);
312 if (std::fabs(
s_[ks]) <= eps*
t) {
319 }
else if (ks == p-1) {
337 for (j = p-2; j >= k; --j) {
346 for (i = 0; i <
n_; i++) {
347 t = cs*
V_[i][j] + sn*
V_[i][p-1];
348 V_[i][p-1] = -sn*
V_[i][j] + cs*
V_[i][p-1];
360 for (j = k; j < p; j++) {
367 for (i = 0; i <
m_; i++) {
368 t = cs*
U_[i][j] + sn*
U_[i][k-1];
369 U_[i][k-1] = -sn*
U_[i][j] + cs*
U_[i][k-1];
381 Real scale = std::max({
389 Real spm1 =
s_[p-2]/scale;
390 Real epm1 = e[p-2]/scale;
392 Real ek = e[k]/scale;
393 Real b = ((spm1 + sp)*(spm1 - sp) + epm1*epm1)/2.0;
394 Real c = (sp*epm1)*(sp*epm1);
396 if ((
b != 0.0) || (c != 0.0)) {
397 shift = std::sqrt(
b*
b + c);
401 shift = c/(
b + shift);
403 Real f = (sk + sp)*(sk - sp) + shift;
408 for (j = k; j < p-1; j++) {
415 f = cs*
s_[j] + sn*e[j];
416 e[j] = cs*e[j] - sn*
s_[j];
418 s_[j+1] = cs*
s_[j+1];
419 for (i = 0; i <
n_; i++) {
420 t = cs*
V_[i][j] + sn*
V_[i][j+1];
421 V_[i][j+1] = -sn*
V_[i][j] + cs*
V_[i][j+1];
428 f = cs*e[j] + sn*
s_[j+1];
429 s_[j+1] = -sn*e[j] + cs*
s_[j+1];
433 for (i = 0; i <
m_; i++) {
434 t = cs*
U_[i][j] + sn*
U_[i][j+1];
435 U_[i][j+1] = -sn*
U_[i][j] + cs*
U_[i][j+1];
453 for (i = 0; i <= pp; i++) {
454 V_[i][k] = -
V_[i][k];
461 if (
s_[k] >=
s_[k+1]) {
466 for (i = 0; i <
n_; i++) {
471 for (i = 0; i <
m_; i++) {
530 const Size numericalRank = this->
rank();
531 for (
Size i=0; i<numericalRank; i++)
1-D array used in linear algebra.
Matrix used in linear algebra.
const Array & singularValues() const
Array solveFor(const Array &) const
std::function< Real(Real)> b
QL_INTEGER Integer
integer number
std::size_t Size
size of a container
void swap(Array &v, Array &w) noexcept
Matrix transpose(const Matrix &m)
Matrix inverse(const Matrix &m)
ext::shared_ptr< YieldTermStructure > r
singular value decomposition