Main Page | Namespace List | Class List | File List | Namespace Members | Class Members | File Members

geostat.cpp

Go to the documentation of this file.
00001 
00006 #include "variogram.h"
00007 #include "geostat.h"
00008 #include <math.h>
00009 #include <map>
00010 #include <gsl/gsl_blas.h>
00011 #include <gsl/gsl_linalg.h>
00012 #include <algorithm>
00013 #include "matrix_ex.h"
00014 
00022 double isoDist(const gsl_vector *c1, const gsl_vector *c2)
00023 {
00024         double norm;
00025         gsl_vector *tmp;
00026 
00027         tmp = gsl_vector_alloc(c1->size);
00028         gsl_vector_memcpy(tmp, c1);
00029         gsl_vector_sub(tmp, c2);
00030         norm = gsl_blas_dnrm2(tmp);
00031         gsl_vector_free(tmp);
00032 
00033         return norm;
00034 }
00035 
00040 CGeostat::CGeostat(void)
00041 {
00042         m_coords.clear();
00043         m_pData = NULL;
00044         m_pTrend = NULL;
00045         m_domain.clear();
00046         m_pVarioCloud = NULL;
00047         m_pVariogram = NULL;
00048         m_pOKSys = NULL;
00049 }
00050 
00055 CGeostat::~CGeostat(void)
00056 {
00057         destroy();
00058 }
00059 
00068 bool CGeostat::initialize(size_t smpl, size_t dim)
00069 {
00070         destroy();
00071         return allocate(smpl, dim);
00072 }
00073 
00082 bool CGeostat::allocate(size_t smpl, size_t dim)
00083 {
00084         destroy();
00085 
00086         for (size_t s = 0;s < smpl;s++)
00087                 m_coords.push_back(gsl_vector_alloc(dim));
00088 
00089         for (size_t d = 0;d < dim;d++)
00090                 m_domain.push_back( std::pair<double, double>(0, 0) );
00091 
00092         m_pData = gsl_vector_alloc(smpl);
00093         m_pTrend = gsl_vector_calloc(dim + 1);
00094         m_pVarioCloud = new CVariogram;
00095         m_pVariogram = new CVariogram;
00096 
00097         m_pOKSys = gsl_matrix_alloc(samples() + 1, samples() + 1);
00098 
00099         return true;
00100 }
00101 
00106 void CGeostat::destroy(void)
00107 {
00108         while (!m_coords.empty())
00109         {
00110                 delete m_coords.back();
00111                 m_coords.pop_back();
00112         }
00113         if (m_pData != NULL)
00114         {
00115                 delete m_pData;
00116                 m_pData = NULL;
00117         }
00118         if (m_pTrend != NULL)
00119         {
00120                 delete m_pTrend;
00121                 m_pTrend = NULL;
00122         }
00123         if (m_pVariogram != NULL)
00124         {
00125                 delete m_pVariogram;
00126                 m_pVariogram = NULL;
00127         }
00128         if (m_pVarioCloud != NULL)
00129         {
00130                 delete m_pVarioCloud;
00131                 m_pVarioCloud = NULL;
00132         }
00133         if (m_pOKSys != NULL)
00134         {
00135                 delete m_pOKSys;
00136                 m_pOKSys = NULL;
00137         }
00138         m_domain.clear();
00139 }
00140 
00149 bool CGeostat::getCoordinate(gsl_vector *c, size_t s) const
00150 {
00151         if (!isActive() || s >= samples())
00152                 return false;
00153         gsl_vector_memcpy(c, m_coords[s]);
00154         
00155         return true;
00156 }
00157 
00164 double CGeostat::getData(size_t s) const
00165 {
00166         if (!isActive() || s >= samples())
00167                 return 0.0;
00168 
00169         gsl_vector *c = gsl_vector_alloc(dimension());
00170         getCoordinate(c, s);
00171         double d = getResidual(s) + getTrend(c);
00172         gsl_vector_free(c);
00173         return d;
00174 }
00175 
00182 double CGeostat::getTrend(const gsl_vector *c) const
00183 {
00184         if (!isActive())
00185                 return 0.0;
00186 
00187         double trend = gsl_vector_get(m_pTrend, 0);
00188         for (size_t d = 0;d < dimension();d++)
00189                 trend += gsl_vector_get(m_pTrend, d + 1) * gsl_vector_get(c, d);
00190 
00191         return trend;
00192 }
00193 
00200 double CGeostat::getResidual(size_t s) const
00201 {
00202         if (!isActive() || s >= samples())
00203                 return 0.0;
00204 
00205         return gsl_vector_get(m_pData, s);
00206 }
00207 
00216 bool CGeostat::getDomain(gsl_vector *lower, gsl_vector *upper) const
00217 {
00218         if (!isActive())
00219                 return false;
00220 
00221         for (size_t d = 0;d < dimension();d++)
00222         {
00223                 gsl_vector_set(lower, d, m_domain[d].first);
00224                 gsl_vector_set(upper, d, m_domain[d].second);
00225         }
00226 
00227         return true;
00228 }
00229 
00238 bool CGeostat::setDomain(const gsl_vector *lower, const gsl_vector *upper)
00239 {
00240         if (!isActive())
00241                 return false;
00242 
00243         for (size_t d = 0;d < dimension();d++)
00244         {
00245                 m_domain[d].first = gsl_vector_get(lower, d);
00246                 m_domain[d].second = gsl_vector_get(upper, d);
00247         }
00248 
00249         return true;
00250 }
00251 
00260 bool CGeostat::setCoordinate(size_t s, const gsl_vector *c)
00261 {
00262         if (!isActive() || s >= samples())
00263                 return false;
00264 
00265         gsl_vector_memcpy(m_coords[s], c);
00266 
00267         return true;
00268 }
00269 
00278 bool CGeostat::setData(size_t s, double d)
00279 {
00280         if (!isActive() || s >= samples())
00281                 return false;
00282 
00283         gsl_vector_set(m_pData, s, d);
00284         return true;
00285 }
00286 
00292 std::vector<CVariogram::VarioItm> CGeostat::computeVariogramCloud(void) const
00293 {
00294         std::vector<CVariogram::VarioItm> vecVario;
00295         CVariogram::VarioItm itm;
00296         gsl_vector *c1, *c2;
00297         double r1, r2;
00298 
00299         if (!isActive())
00300                 return vecVario;
00301 
00302         c1 = gsl_vector_alloc(dimension());
00303         c2 = gsl_vector_alloc(dimension());
00304 
00305         for (size_t i = 0;i < samples() - 1;i++)
00306         {
00307                 getCoordinate(c1, i);
00308                 r1 = getResidual(i);
00309 
00310                 for (size_t j = i + 1;j < samples();j++)
00311                 {
00312                         getCoordinate(c2, j);
00313                         r2 = getResidual(j);
00314 
00315                         itm.distance = isoDist(c1, c2);
00316                         itm.dissimilarity = (r1 - r2) * (r1 - r2) / 2.0;
00317 
00318                         vecVario.push_back(itm);
00319                 }
00320         }
00321 
00322         gsl_vector_free(c1);
00323         gsl_vector_free(c2);
00324 
00325         return vecVario;
00326 }
00327 
00335 std::vector<CVariogram::VarioItm> CGeostat::computeExperimentalVariogram(const std::vector<CVariogram::VarioItm> &vcloud, double step) const
00336 {
00337         std::vector<CVariogram::VarioItm> vmodel;
00338         std::map<int, CVariogram::VarioItm> variomap;
00339         CVariogram::VarioItm itm;
00340 
00341         for (size_t i = 0;i < vcloud.size();i++)
00342         {
00343                 int key = static_cast<int>(vcloud[i].distance / step);
00344                 if (variomap.find(key) == variomap.end())
00345                 {
00346                         variomap[key].distance = 1.0;
00347                         variomap[key].dissimilarity = vcloud[i].dissimilarity;
00348                 }
00349                 else
00350                 {
00351                         variomap[key].distance += 1.0;
00352                         variomap[key].dissimilarity += vcloud[i].dissimilarity;
00353                 }
00354         }
00355 
00356         for (std::map<int, CVariogram::VarioItm>::const_iterator it = variomap.begin();it != variomap.end();++it)
00357         {
00358                 itm.distance = it->first * step;
00359                 itm.dissimilarity = it->second.dissimilarity / it->second.distance;
00360                 vmodel.push_back(itm);
00361         }
00362         return vmodel;
00363 }
00364 
00374 bool CGeostat::estimate(int model, double power, double step)
00375 {
00376         if (!isActive())
00377                 return false;
00378 
00379         std::vector<CVariogram::VarioItm> vcloud;
00380         double n, s, r;
00381 
00382 
00383         approximateTrendSurface();
00384 
00385         vcloud = computeVariogramCloud();
00386         m_pVarioCloud->setSample(vcloud);
00387 
00388         m_pVariogram->setSample(computeExperimentalVariogram(vcloud, step));
00389         n = 0;
00390         m_pVariogram->getSample(m_pVariogram->samples() / 2, r, s);
00391         m_pVariogram->estimateModel(model, n, s, r, power, m_pVariogram->maxDistance() / 2.0);
00392 
00393         precomputeKrigingSystem();
00394 
00395         return true;
00396 }
00397 
00408 bool CGeostat::getModelParameters(double &sill, double &range, double &nugget, double &power) const
00409 {
00410         if (!isActive())
00411                 return false;
00412 
00413         sill = m_pVariogram->sill();
00414         range = m_pVariogram->range();
00415         nugget = m_pVariogram->nugget();
00416         power = m_pVariogram->power();
00417 
00418         return false;
00419 }
00420 
00427 bool CGeostat::precomputeKrigingSystem(void)
00428 {
00429         gsl_vector *c1, *c2;
00430         gsl_matrix *tmp;
00431 
00432         c1 = gsl_vector_alloc(dimension());
00433         c2 = gsl_vector_alloc(dimension());
00434         tmp = gsl_matrix_alloc(samples() + 1, samples() + 1);
00435 
00436         for (size_t s1 = 0;s1 < samples();s1++)
00437         {
00438                 getCoordinate(c1, s1);
00439                 
00440                 for (size_t s2 = s1;s2 < samples();s2++)
00441                 {
00442                         getCoordinate(c2, s2);
00443 
00444                         double dist;
00445                         dist = isoDist(c1, c2);
00446 
00447                         gsl_matrix_set(tmp, s1, s2, m_pVariogram->getModelData(dist));
00448                         gsl_matrix_set(tmp, s2, s1, gsl_matrix_get(tmp, s1, s2));
00449                 }
00450         }
00451 
00452         for (size_t s = 0;s < samples();s++)
00453         {
00454                 gsl_matrix_set(tmp, s, samples(), 1.0);
00455                 gsl_matrix_set(tmp, samples(), s, 1.0);
00456         }
00457         gsl_matrix_set(tmp, samples(), samples(), 0.0);
00458 
00459         MatrixEx::matrix_inverse(m_pOKSys, tmp);
00460 
00461         gsl_vector_free(c1);
00462         gsl_vector_free(c2);
00463         gsl_matrix_free(tmp);
00464 
00465         return true;
00466 }
00467 
00472 double CGeostat::maxDist() const
00473 {
00474         double dist =0.0;
00475 
00476         for (size_t d = 0;d < dimension();d++)
00477                 dist += pow(m_domain[d].second - m_domain[d].first, 2.0);
00478         return sqrt(dist);
00479 }
00480 
00488 bool CGeostat::isDomain(const gsl_vector *c) const
00489 {
00490         for (size_t d = 0;d < dimension();d++)
00491         {
00492                 double ct = gsl_vector_get(c, d);
00493                 if (ct < m_domain[d].first || ct > m_domain[d].second)
00494                         return false;
00495         }
00496         return true;
00497 }
00498 
00507 bool CGeostat::getWeightVector(gsl_vector *weight, const gsl_vector *c) const
00508 {
00509         if (!isActive())
00510                 return false;
00511 
00512         gsl_vector *spos, *vvario;
00513         
00514         spos = gsl_vector_alloc(dimension());
00515         vvario = gsl_vector_alloc(samples() + 1);
00516 
00517         for (size_t s = 0;s < samples();s++)
00518         {
00519                 getCoordinate(spos, s);
00520                 double dist = isoDist(c, spos);
00521 
00522                 gsl_vector_set(vvario, s, m_pVariogram->getModelData(dist));
00523         }
00524         gsl_vector_set(vvario, samples(), 1.0);
00525 
00526         gsl_blas_dgemv(CblasNoTrans, 1.0, m_pOKSys, vvario, 0.0, weight);
00527 
00528 
00529         gsl_vector_free(spos);
00530         gsl_vector_free(vvario);
00531 
00532         return true;
00533 }
00534 
00544 bool CGeostat::getPredictData(double &pred, double &var, const gsl_vector *c) const
00545 {
00546         if (!isActive())
00547                 return false;
00548 
00549         gsl_vector *spos;
00550         gsl_vector *vvario, *weight;
00551         spos = gsl_vector_alloc(dimension());
00552         vvario = gsl_vector_alloc(samples() + 1);
00553         weight = gsl_vector_alloc(samples() + 1);
00554 
00555         for (size_t s = 0;s < samples();s++)
00556         {
00557                 getCoordinate(spos, s);
00558                 double dist = isoDist(c, spos);
00559 
00560                 gsl_vector_set(vvario, s, m_pVariogram->getModelData(dist));
00561         }
00562         gsl_vector_set(vvario, samples(), 1.0);
00563 
00564         gsl_blas_dgemv(CblasNoTrans, 1.0, m_pOKSys, vvario, 0.0, weight);
00565 
00566         pred = getTrend(c);
00567         for (size_t s = 0;s < samples();s++)
00568                 pred += gsl_vector_get(weight, s) * getResidual(s);
00569 
00570         gsl_vector_set(vvario, samples(), 0.0);
00571         gsl_blas_ddot(weight, vvario, &var);
00572 
00573         gsl_vector_free(spos);
00574         gsl_vector_free(vvario);
00575         gsl_vector_free(weight);
00576 
00577         return true;
00578 }
00579 
00589 bool CGeostat::getPredictData(double &pred, const gsl_vector *c, const gsl_vector *weight) const
00590 {
00591         if (!isActive())
00592                 return false;
00593 
00594         pred = getTrend(c);
00595         for (size_t s = 0;s < samples();s++)
00596                 pred += gsl_vector_get(weight, s) * getResidual(s);
00597 
00598         return true;
00599 }
00600 
00607 bool CGeostat::approximateTrendSurface(void)
00608 {
00609         gsl_matrix *mPh, *mPhI;
00610         gsl_vector *c;
00611 
00612         mPh = gsl_matrix_alloc(dimension() + 1, samples());
00613         mPhI = gsl_matrix_alloc(samples(), dimension() + 1);
00614         c = gsl_vector_alloc(dimension());
00615 
00616         for (size_t s = 0;s < samples();s++)
00617         {
00618                 getCoordinate(c, s);
00619                 gsl_matrix_set(mPh, 0, s, 1.0);
00620                 for (size_t d = 0;d < dimension();d++)
00621                         gsl_matrix_set(mPh, d + 1, s, gsl_vector_get(c, d));
00622         }
00623         MatrixEx::matrix_pseudo_inverse(mPhI, mPh);
00624         gsl_blas_dgemv(CblasTrans, 1.0, mPhI, m_pData, 0.0, m_pTrend);
00625 
00626         for (size_t s = 0;s < samples();s++)
00627         {
00628                 getCoordinate(c, s);
00629                 *gsl_vector_ptr(m_pData, s) -= getTrend(c);
00630         }
00631 
00632         gsl_vector_free(c);
00633         gsl_matrix_free(mPh);
00634         gsl_matrix_free(mPhI);
00635 
00636         return true;
00637 }
00638 
00646 bool CGeostat::removeRedundantSample(size_t smpl)
00647 {
00648         if (!isActive() || smpl >= samples())
00649                 return false;
00650 
00651         std::vector<gsl_vector *> newCoord;
00652         gsl_vector *pcoord, *newData;
00653 
00654         newData = gsl_vector_alloc(samples() - 1);
00655 
00656         size_t sp1 =0;
00657         for (size_t s = 0;s < samples();s++)
00658         {
00659                 if (s == smpl)
00660                         continue;
00661                 gsl_vector_set(newData, sp1, gsl_vector_get(m_pData, s));
00662 
00663                 pcoord = gsl_vector_alloc(dimension());
00664                 getCoordinate(pcoord, s);
00665                 newCoord.push_back(pcoord);
00666 
00667                 sp1++;
00668         }
00669 
00670         while (!m_coords.empty())
00671         {
00672                 delete m_coords.back();
00673                 m_coords.pop_back();
00674         }
00675         delete m_pData;
00676 
00677         m_pData = newData;
00678         m_coords = newCoord;
00679 
00680         precomputeKrigingSystem();
00681 
00682         return true;
00683 }
00684 
00694 bool CGeostat::getPredictionErrorExcluded(double &pred, double &var, size_t s) const
00695 {
00696         if (!isActive() || s >= samples())
00697                 return false;
00698 
00699         gsl_vector *c, *c1, *c2;
00700         gsl_vector *vvario, *weight;
00701         gsl_matrix *mGamma, *mGammaI;
00702         size_t sp1, sp2;
00703 
00704         c = gsl_vector_alloc(dimension());
00705         c1 = gsl_vector_alloc(dimension());
00706         c2 = gsl_vector_alloc(dimension());
00707 
00708         vvario = gsl_vector_alloc(samples());
00709         weight = gsl_vector_alloc(samples());
00710         mGamma = gsl_matrix_alloc(samples(), samples());
00711         mGammaI = gsl_matrix_alloc(samples(), samples());
00712 
00713         getCoordinate(c, s);
00714 
00715         sp1 = 0;
00716         for (size_t s1 = 0;s1 < samples();s1++)
00717         {
00718                 if (s1 == s)
00719                         continue;
00720 
00721                 getCoordinate(c1, s1);
00722                 
00723                 sp2 = 0;
00724                 for (size_t s2 = 0;s2 < samples();s2++)
00725                 {
00726                         if (s2 == s)
00727                                 continue;
00728 
00729                         getCoordinate(c2, s2);
00730                         double dist = isoDist(c1, c2);
00731 
00732                         gsl_matrix_set(mGamma, sp1, sp2, m_pVariogram->getModelData(dist));
00733 
00734                         sp2++;
00735                 }
00736                 sp1++;
00737         }
00738 
00739         for (size_t s = 0;s < samples() - 1;s++)
00740         {
00741                 gsl_matrix_set(mGamma, s, samples() - 1, 1.0);
00742                 gsl_matrix_set(mGamma, samples() - 1, s, 1.0);
00743         }
00744         gsl_matrix_set(mGamma, samples() - 1, samples() - 1, 0.0);
00745         MatrixEx::matrix_inverse(mGammaI, mGamma);
00746 
00747 
00748         sp1 = 0;
00749         for (size_t s = 0;s < samples();s++)
00750         {
00751                 if (s == s)
00752                         continue;
00753                 getCoordinate(c1, s);
00754                 double dist = isoDist(c, c1);
00755                 gsl_vector_set(vvario, sp1++, m_pVariogram->getModelData(dist));
00756         }
00757         gsl_vector_set(vvario, samples() - 1, 1.0);
00758         gsl_blas_dgemv(CblasNoTrans, 1.0, mGamma, vvario, 0.0, weight);
00759 
00760         pred = getTrend(c);
00761         sp1 = 0;
00762         for (size_t s = 0;s < samples();s++)
00763         {
00764                 if (s == s)
00765                         continue;
00766                 pred += gsl_vector_get(weight, sp1) * getResidual(s);
00767                 sp1++;
00768         }
00769         gsl_vector_set(vvario, samples() - 1, 0.0);
00770         gsl_blas_ddot(weight, vvario, &var);
00771 
00772 
00773         gsl_vector_free(c);
00774         gsl_vector_free(c1);
00775         gsl_vector_free(c2);
00776 
00777         gsl_matrix_free(mGamma);
00778         gsl_matrix_free(mGammaI);
00779         gsl_vector_free(vvario);
00780         gsl_vector_free(weight);
00781 
00782         return true;
00783 }
00784 
00791 double CGeostat::selectEliminatee(size_t &candidate) const
00792 {
00793         if (!isActive())
00794                 return 0;
00795 
00796         gsl_vector *c, *c1, *c2;
00797         gsl_vector *vvario, *weight;
00798         gsl_matrix *mGamma, *mGammaR, *mGammaI;
00799         size_t sp1, sp2;
00800         double var, varmin;
00801 
00802         c = gsl_vector_alloc(dimension());
00803         c1 = gsl_vector_alloc(dimension());
00804         c2 = gsl_vector_alloc(dimension());
00805 
00806         mGamma = gsl_matrix_alloc(samples(), samples());
00807         mGammaR = gsl_matrix_alloc(samples(), samples());
00808         mGammaI = gsl_matrix_alloc(samples(), samples());
00809         vvario = gsl_vector_alloc(samples());
00810         weight = gsl_vector_alloc(samples());
00811 
00812         for (size_t s1 = 0;s1 < samples();s1++)
00813         {
00814                 getCoordinate(c1, s1);
00815                 for (size_t s2 = s1;s2 < samples();s2++)
00816                 {
00817                         getCoordinate(c2, s2);
00818                         double dist = isoDist(c1, c2);
00819                         gsl_matrix_set(mGamma, s1, s2, m_pVariogram->getModelData(dist));
00820                         gsl_matrix_set(mGamma, s2, s1, gsl_matrix_get(mGamma, s1, s2));
00821                 }
00822         }
00823         for (size_t s = 0;s < samples() - 1;s++)
00824         {
00825                 gsl_matrix_set(mGammaR, s, samples() - 1, 1.0);
00826                 gsl_matrix_set(mGammaR, samples() - 1, s, 1.0);
00827         }
00828         gsl_matrix_set(mGammaR, samples() - 1, samples() - 1, 0.0);
00829 
00830         varmin = 1.0e6;
00831         for (size_t smpl = 0;smpl < samples();smpl++)
00832         {
00833                 getCoordinate(c, smpl);
00834 
00835                 sp1 = 0;
00836                 for (size_t s1 = 0;s1 < samples();s1++)
00837                 {
00838                         if (s1 != smpl)
00839                         {
00840                                 sp2 = 0;
00841                                 for (size_t s2 = 0;s2 < samples();s2++)
00842                                 {
00843                                         if (s2 != smpl)
00844                                                 gsl_matrix_set(mGammaR, sp1, sp2++, gsl_matrix_get(mGamma, s1, s2));
00845                                 }
00846                                 sp1++;
00847                         }
00848                 }
00849                 MatrixEx::matrix_inverse(mGammaI, mGammaR);
00850 
00851 
00852                 sp1 = 0;
00853                 for (size_t s = 0;s < samples();s++)
00854                 {
00855                         if (s != smpl)
00856                         {
00857                                 getCoordinate(c1, s);
00858                                 double dist = isoDist(c, c1);
00859                                 gsl_vector_set(vvario, sp1++, m_pVariogram->getModelData(dist));
00860                         }
00861                 }
00862                 gsl_vector_set(vvario, samples() - 1, 1.0);
00863                 gsl_blas_dgemv(CblasNoTrans, 1.0, mGammaI, vvario, 0.0, weight);
00864 
00865                 gsl_vector_set(vvario, samples() - 1, 0.0);
00866                 gsl_blas_ddot(weight, vvario, &var);
00867 
00868                 if (var < varmin)
00869                 {
00870                         candidate = smpl;
00871                         varmin = var;
00872                 }
00873         }
00874 
00875         gsl_vector_free(c);
00876         gsl_vector_free(c1);
00877         gsl_vector_free(c2);
00878 
00879         gsl_matrix_free(mGamma);
00880         gsl_matrix_free(mGammaR);
00881         gsl_matrix_free(mGammaI);
00882 
00883         gsl_vector_free(vvario);
00884         gsl_vector_free(weight);
00885 
00886 
00887         return 1.0 - varmin / m_pVariogram->sill();
00888 }
00889 
00898 double CGeostat::evalModelValidity(int model, double power, double step)
00899 {
00900         if (!isActive())
00901                 return 0.0;
00902 
00903         std::vector<CVariogram*> vecCloud, vecModel;
00904         std::vector<CVariogram::VarioItm> vcloud;
00905         double n =0, s =0, r =0;
00906 
00907         approximateTrendSurface();
00908 
00909         vcloud = computeVariogramCloud();
00910         m_pVarioCloud = new CVariogram;
00911         m_pVarioCloud->setSample(vcloud);
00912 
00913         m_pVariogram = new CVariogram;
00914         m_pVariogram->setSample(computeExperimentalVariogram(vcloud, step));
00915         m_pVariogram->getSample(m_pVariogram->samples() / 2, r, s);
00916                         
00917         m_pVariogram->estimateModel(model, n, s, r, power, m_pVariogram->maxDistance() / 2.0);
00918 
00919 
00920         gsl_vector *c, *c1, *c2;
00921         gsl_vector *vvario, *weight;
00922         gsl_matrix *mGamma, *mGammaR, *mGammaI;
00923         size_t sp1, sp2;
00924         double pred, errsum;
00925 
00926         c = gsl_vector_alloc(dimension());
00927         c1 = gsl_vector_alloc(dimension());
00928         c2 = gsl_vector_alloc(dimension());
00929 
00930         mGamma = gsl_matrix_alloc(samples(), samples());
00931         mGammaR = gsl_matrix_alloc(samples(), samples());
00932         mGammaI = gsl_matrix_alloc(samples(), samples());
00933         vvario = gsl_vector_alloc(samples());
00934         weight = gsl_vector_alloc(samples());
00935 
00936         for (size_t s1 = 0;s1 < samples();s1++)
00937         {
00938                 getCoordinate(c1, s1);
00939                 for (size_t s2 = s1;s2 < samples();s2++)
00940                 {
00941                         getCoordinate(c2, s2);
00942                         double dist = isoDist(c1, c2);
00943                         gsl_matrix_set(mGamma, s1, s2, m_pVariogram->getModelData(dist));
00944                         gsl_matrix_set(mGamma, s2, s1, gsl_matrix_get(mGamma, s1, s2));
00945                 }
00946         }
00947         for (size_t s = 0;s < samples() - 1;s++)
00948         {
00949                 gsl_matrix_set(mGammaR, s, samples() - 1, 1.0);
00950                 gsl_matrix_set(mGammaR, samples() - 1, s, 1.0);
00951         }
00952         gsl_matrix_set(mGammaR, samples() - 1, samples() - 1, 0.0);
00953 
00954 
00955         errsum = 0.0;
00956         for (size_t smpl = 0;smpl < samples();smpl++)
00957         {
00958                 sp1 = 0;
00959                 for (size_t s1 = 0;s1 < samples();s1++)
00960                 {
00961                         if (s1 != smpl)
00962                         {
00963                                 sp2 = 0;
00964                                 for (size_t s2 = 0;s2 < samples();s2++)
00965                                 {
00966                                         if (s2 != smpl)
00967                                         {
00968                                                 gsl_matrix_set(mGammaR, sp1, sp2++, gsl_matrix_get(mGamma, s1, s2));
00969                                         }
00970                                 }
00971                                 sp1++;
00972                         }
00973                 }
00974                 MatrixEx::matrix_inverse(mGammaI, mGammaR);
00975 
00976                 getCoordinate(c, smpl);
00977                 sp1 = 0;
00978                 for (size_t s = 0;s < samples();s++)
00979                 {
00980                         if (s != smpl)
00981                         {
00982                                 getCoordinate(c1, s);
00983                                 double dist = isoDist(c, c1);
00984                                 gsl_vector_set(vvario, sp1++, m_pVariogram->getModelData(dist));
00985                         }
00986                 }
00987                 gsl_vector_set(vvario, samples() - 1, 1.0);
00988                 gsl_blas_dgemv(CblasNoTrans, 1.0, mGammaI, vvario, 0.0, weight);
00989 
00990                 sp1 = 0;
00991                 pred = 0.0;
00992                 for (size_t s = 0;s < samples();s++)
00993                 {
00994                         if (s != smpl)
00995                                 pred += gsl_vector_get(weight, sp1++) * getResidual(s);
00996                 }
00997                 errsum += pow(pred - getResidual(smpl), 2.0);
00998         }
00999 
01000         gsl_vector_free(c);
01001         gsl_vector_free(c1);
01002         gsl_vector_free(c2);
01003 
01004         gsl_matrix_free(mGamma);
01005         gsl_matrix_free(mGammaR);
01006         gsl_matrix_free(mGammaI);
01007 
01008         gsl_vector_free(vvario);
01009         gsl_vector_free(weight);
01010 
01011         return errsum;
01012 }

Generated on Thu Aug 11 13:01:33 2005 for Kriging sample by  doxygen 1.4.3