mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-03-01 18:26:24 +08:00
ei_lmpar : use a reference for the parameter
This commit is contained in:
parent
b3f8d02df4
commit
c5218c7d38
@ -215,13 +215,8 @@ L200:
|
||||
/* determine the levenberg-marquardt parameter. */
|
||||
|
||||
ipvt.cwise()+=1; // lmpar() expects the fortran convention (as qrfac provides)
|
||||
#if 1
|
||||
ei_lmpar<Scalar>(n, fjac.data(), ldfjac, ipvt.data(), diag.data(), qtf.data(), delta,
|
||||
&par, wa1.data(), wa2.data(), wa3.data(), wa4.data());
|
||||
#else
|
||||
lmpar(n, fjac.data(), ldfjac, ipvt.data(), diag.data(), qtf.data(), delta,
|
||||
&par, wa1.data(), wa2.data(), wa3.data(), wa4.data());
|
||||
#endif
|
||||
par, wa1.data(), wa2.data(), wa3.data(), wa4.data());
|
||||
ipvt.cwise()-=1;
|
||||
|
||||
/* store the direction p and x + p. calculate the norm of p. */
|
||||
|
@ -219,7 +219,7 @@ L200:
|
||||
|
||||
ipvt.cwise()+=1; // lmpar() expects the fortran convention (as qrfac provides)
|
||||
ei_lmpar<Scalar>(n, fjac.data(), ldfjac, ipvt.data(), diag.data(), qtf.data(), delta,
|
||||
&par, wa1.data(), wa2.data(), wa3.data(), wa4.data());
|
||||
par, wa1.data(), wa2.data(), wa3.data(), wa4.data());
|
||||
ipvt.cwise()-=1;
|
||||
|
||||
/* store the direction p and x + p. calculate the norm of p. */
|
||||
|
@ -2,7 +2,7 @@
|
||||
template <typename Scalar>
|
||||
void ei_lmpar(int n, Scalar *r__, int ldr,
|
||||
const int *ipvt, const Scalar *diag, const Scalar *qtb, Scalar delta,
|
||||
Scalar *par, Scalar *x, Scalar *sdiag, Scalar *wa1,
|
||||
Scalar &par, Scalar *x, Scalar *sdiag, Scalar *wa1,
|
||||
Scalar *wa2)
|
||||
{
|
||||
/* System generated locals */
|
||||
@ -142,10 +142,10 @@ L120:
|
||||
/* if the input par lies outside of the interval (parl,paru), */
|
||||
/* set par to the closer endpoint. */
|
||||
|
||||
*par = std::max(*par,parl);
|
||||
*par = std::min(*par,paru);
|
||||
if (*par == 0.) {
|
||||
*par = gnorm / dxnorm;
|
||||
par = std::max(par,parl);
|
||||
par = std::min(par,paru);
|
||||
if (par == 0.) {
|
||||
par = gnorm / dxnorm;
|
||||
}
|
||||
|
||||
/* beginning of an iteration. */
|
||||
@ -155,12 +155,12 @@ L150:
|
||||
|
||||
/* evaluate the function at the current value of par. */
|
||||
|
||||
if (*par == 0.) {
|
||||
if (par == 0.) {
|
||||
/* Computing MAX */
|
||||
d__1 = dwarf, d__2 = Scalar(.001) * paru;
|
||||
*par = std::max(d__1,d__2);
|
||||
par = std::max(d__1,d__2);
|
||||
}
|
||||
temp = ei_sqrt(*par);
|
||||
temp = ei_sqrt(par);
|
||||
for (j = 1; j <= n; ++j) {
|
||||
wa1[j] = temp * diag[j];
|
||||
/* L160: */
|
||||
@ -211,17 +211,17 @@ L200:
|
||||
/* depending on the sign of the function, update parl or paru. */
|
||||
|
||||
if (fp > 0.) {
|
||||
parl = std::max(parl,*par);
|
||||
parl = std::max(parl,par);
|
||||
}
|
||||
if (fp < 0.) {
|
||||
paru = std::min(paru,*par);
|
||||
paru = std::min(paru,par);
|
||||
}
|
||||
|
||||
/* compute an improved estimate for par. */
|
||||
|
||||
/* Computing MAX */
|
||||
d__1 = parl, d__2 = *par + parc;
|
||||
*par = std::max(d__1,d__2);
|
||||
d__1 = parl, d__2 = par + parc;
|
||||
par = std::max(d__1,d__2);
|
||||
|
||||
/* end of an iteration. */
|
||||
|
||||
@ -231,7 +231,7 @@ L220:
|
||||
/* termination. */
|
||||
|
||||
if (iter == 0) {
|
||||
*par = 0.;
|
||||
par = 0.;
|
||||
}
|
||||
return;
|
||||
|
||||
|
@ -242,7 +242,7 @@ L240:
|
||||
/* determine the levenberg-marquardt parameter. */
|
||||
|
||||
ipvt.cwise()+=1; // lmpar() expects the fortran convention (as qrfac provides)
|
||||
ei_lmpar<Scalar>(n, fjac.data(), ldfjac, ipvt.data(), diag.data(), qtf.data(), delta, &par,
|
||||
ei_lmpar<Scalar>(n, fjac.data(), ldfjac, ipvt.data(), diag.data(), qtf.data(), delta, par,
|
||||
wa1.data(), wa2.data(), wa3.data(), wa4.data());
|
||||
ipvt.cwise()-=1;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user