@@ -1932,9 +1932,18 @@ bool multipleDetrendingElevationFitting(int elevationPos, std::vector <Crit3DInt
19321932
19331933 interpolationSettings.getProxy (elevationPos)->setRegressionR2 (float (R2));
19341934
1935- std::vector<std::vector<double >> newParameters;
1936- newParameters.push_back (parameters);
1937- interpolationSettings.addFittingParameters (newParameters);
1935+ if (! isEqual (R2, NODATA) || ! isVectorNodataOrZero (parameters))
1936+ {
1937+ std::vector<std::vector<double >> newParameters;
1938+ newParameters.push_back (parameters);
1939+ interpolationSettings.addFittingParameters (newParameters);
1940+ }
1941+ else
1942+ {
1943+ Crit3DProxyCombination myCombination = interpolationSettings.getCurrentCombination ();
1944+ myCombination.setProxySignificant (elevationPos, false );
1945+ interpolationSettings.setCurrentCombination (myCombination);
1946+ }
19381947
19391948 return true ;
19401949}
@@ -2169,33 +2178,46 @@ void detrendingOtherProxies(int elevationPos, std::vector<Crit3DInterpolationDat
21692178
21702179 std::vector<std::vector<double >> fullParameters = parameters;
21712180 std::vector<std::function<double (double , std::vector<double >&)>> fullFunc = myFunc;
2181+ bool proxyComplete = true ;
21722182
21732183 // detrending
21742184 float detrendValue;
2175- for (unsigned int i = 0 ; i < myPoints.size (); i++)
2185+ vector<Crit3DInterpolationDataPoint>::iterator it = myPoints.begin ();
2186+ while (it != myPoints.end ())
21762187 {
21772188 proxyValues.clear ();
2189+ proxyComplete = true ;
21782190
21792191 for (int pos=0 ; pos < int (interpolationSettings.getProxyNr ()); pos++)
21802192 {
2181- if (pos != elevationPos && interpolationSettings.getCurrentCombination ().isProxyActive (pos) && interpolationSettings.getCurrentCombination ().isProxySignificant (pos))
2193+ if (pos != elevationPos && interpolationSettings.getCurrentCombination ().isProxyActive (pos) &&
2194+ interpolationSettings.getCurrentCombination ().isProxySignificant (pos) &&
2195+ proxyComplete)
21822196 {
2183- proxyValue = myPoints[i]. getProxyValue (pos);
2197+ proxyValue = it-> getProxyValue (pos);
21842198 if (! isEqual (proxyValue, NODATA))
21852199 proxyValues.push_back (double (proxyValue));
21862200 else
21872201 {
2188- parameters.erase (parameters.begin ()+proxyValues.size ());
2189- myFunc.erase (myFunc.begin ()+proxyValues.size ());
2202+
2203+ // parameters.erase(parameters.begin()+proxyValues.size());
2204+ // myFunc.erase(myFunc.begin()+proxyValues.size());
2205+ proxyComplete = false ;
21902206 }
21912207 }
21922208 }
21932209
2194- detrendValue = float (functionSum (myFunc, proxyValues, parameters));
2195- myPoints[i].value -= detrendValue;
2210+ if (proxyComplete)
2211+ {
2212+ detrendValue = float (functionSum (myFunc, proxyValues, parameters));
2213+ it->value -= detrendValue;
2214+ it++;
2215+ }
2216+ else it = myPoints.erase (it);
21962217
21972218 myFunc = fullFunc;
21982219 parameters = fullParameters;
2220+
21992221 }
22002222}
22012223
@@ -2657,3 +2679,14 @@ float getFirstIntervalHeightValue(std::vector <Crit3DInterpolationDataPoint> &my
26572679 return getFirstIntervalHeightValue;
26582680}
26592681
2682+
2683+ bool isVectorNodataOrZero (std::vector <double > myVector)
2684+ {
2685+ bool myFlag = false ;
2686+ for (int i = 0 ; i < myVector.size (); i++)
2687+ {
2688+ if (isEqual (myVector[i], NODATA) || isEqual (myVector[i], 0 )) myFlag = true ;
2689+ }
2690+
2691+ return myFlag;
2692+ }
0 commit comments