IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Biliothèque pour interpolation bicubique (GSL, AlgLib, Eigen)


Sujet :

C++

  1. #1
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    avril 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : avril 2008
    Messages : 179
    Points : 600
    Points
    600
    Par défaut Biliothèque pour interpolation bicubique (GSL, AlgLib, Eigen)
    Salut à tous !

    Je récupère des données sur une grille non-structurée, donc pas une grille régulière, à partir d’un fichier NetCDF. Je n’ai pas de problème pour lire un fichier NetCDF. J’ai donc désormais, pour un ensemble de nœuds donnés (leur nombre est stocké dans la variable « nNodes »), un tableau 1D contenant les longitudes des nœuds (nommons le « lon »), un autre tableau 1D contenant les latitudes (« lat ») des nœuds et enfin un troisième tableau 1D contenant les valeurs aux nœuds (« val »). Les spécificités de la bibliothèque NetCDF fait que ces trois tableaux sont des tableaux de type C en double précision (donc des « double* »).

    Je dois déterminer la valeur en un point inclut dans le domaine, mais qui ne correspond pas à l’un des nœuds. Je dois donc réaliser une interpolation bicubique (en anglais « bicubic fit » plutôt que « bicubic interpolation »). Ceci pour avant-hier (tout va bien). Je cherche donc une bibliothèque me permettant de réaliser cela efficacement. C’est là que je me retrouve dans l’expectative, je viens donc voir ici si quelqu’un peut m’aider à me tirer de là.

    J’ai trouvé trois bibliothèques qui pourraient me permettre de réaliser cette interpolation, mais je ne parviens pas m’en tirer.

    1. J’ai d’abord envisagé d’utiliser la GSL, mais visiblement elle ne permet pas de réaliser des interpolations que sur grilles régulières. Du coup, je ne parviens pas à l’utiliser pour sur mon cas. En particulier, la grille étant non-structurée, on ne peut pas attendre que les nœuds apparaissent dans un ordre de tri par aux coordonnées. Du coup, j’obtiens l’erreur suivante en cours d’exécution :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      gsl: interp2d.c:101: ERROR: x values must be strictly increasing
      L’ordre n’étant pas significatif, j’ai tenté un réarrangement des valeurs, mais j’obtiens alors la même erreur.
    2. La bibliothèque AlgLib apparaît proposer exactement ce qu’il me faut, plus particulièrement l’algorithme « FastDDM ». Cependant, en tentant de l’utiliser j’obtiens l’erreur de compilation suivante :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      error: « spline2dbuilder » n'est pas un membre de « alglib »
      Cette erreur est provoquée par la ligne de code suivante :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      alglib::spline2dbuilder builder;
      Sachant que j’ai inclus les en-têtes d’AlgLib suivant :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      #include <ap.h>
      #include <stdafx.h>
      #include <interpolation.h>
      En revanche, je parviens à utiliser d’autres éléments d’AlgLib, par exemple la ligne suivante compile sans problème :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      alglib::real_2d_array fitMatrix;
      Je me demande si je n’ai pas oublié un en-tête, mais toujours est-il que je ne parviens pas non plus à utiliser AlgLib dans mon cas.
    3. Enfin, j’ai déjà utilisé Eigen et elle propose des éléments permettant de réaliser des interpolations. Cependant, c’est une partie non-supportée de la bibliothèque, du coup la documentation est plutôt chiche à ce niveau. J’ai trouvé un exemple, mais je ne parviens pas à l’appliquer à mon cas.


    Je me sens plutôt coincé, je me demande si quelqu’un sur ce forum a déjà réalisé ce genre d’interpolation et pourrait me conseiller une marche à suivre.

    Je résume mon besoin. Pour un domaine maillé par une grille non-structurée contenant « nNodes » nœuds, je dispose des tableaux qui ont été créé ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double* lon = new double [nNodes];
    double* lat = new double [nNodes];
    double* values = new double [nNodes];
    Les spécificités de la façon dont j’accède à mes données ne me permettent malheureusement pas de créer ces tableaux autrement. Les tableaux « lon » et « lat » contiennent respectivement les longitudes et les latitudes des nœuds d’un maillage non-structuré définissant un domaine. Le tableau « val » donne les valeurs aux nœuds. Je dispose des deux valeurs suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double lon0;
    double lat0;
    Je dois désormais déterminer la valeur à la position définie par « lon0 » et « lat0 », sachant que cette position est à l’intérieur du domaine défini par la grille, mais n’est pas un nœud de la grille.

    Est-ce que quelqu’un sait comment réaliser cela ?

    À bientôt.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance en conception mécanique et prototypage
    Inscrit en
    novembre 2006
    Messages
    20 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance en conception mécanique et prototypage

    Informations forums :
    Inscription : novembre 2006
    Messages : 20 159
    Points : 54 290
    Points
    54 290
    Par défaut
    Citation Envoyé par Le Farfadet Spatial Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: « spline2dbuilder » n'est pas un membre de « alglib »
    Cet exemple fonctionne-t-il ? spline2d_fit_blocklls - Fitting bicubic spline to irregular data
    Ingénieur indépendant en conception mécanique et prototypage :
    • conception mécanique 3D (Autodesk Fusion 360)
    • impression 3D (Ultimaker)
    • développement informatique (Python, MATLAB, C)
    • programmation de microcontrôleur (Microchip PIC, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    avril 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : avril 2008
    Messages : 179
    Points : 600
    Points
    600
    Par défaut
    Salut à tous !

    Merci pour la réponse.

    Citation Envoyé par Jerome Briot Voir le message
    Oui, c’est l’exemple du site d’Alglib. Je ne parviens pas à le faire fonctionner. Déjà, il faut modifier les directives « #include », qui d’ailleurs ne sont pas les mêmes sous CentOS/Fedora et Debian/Ubuntu… Je donne ici le résultat sous Ubuntu 18.04.

    J’ai réalisé l’arborescence suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    racine/
    |-src/
    | |-CMakeLists.txt
    | |-main.cpp
    |-CMakeLists.txt
    Voici le contenu du fichier « CMakeLists.txt » de la racine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    cmake_minimum_required(VERSION 3.1.0)
     
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_CXX_EXTENSIONS OFF)
     
    project(EssaiAlglib CXX)
     
    add_subdirectory(src)
    Celui du « CMakeLists.txt » du répertoire « src » :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
     
    set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})
    set(EXECUTABLE_NAME essaiAlglib)
     
    find_package(ALGLIB REQUIRED)
     
    set(
        SOURCE_FILES
        main.cpp
    )
     
    link_directories(
        ${ALGLIB_LIBRARIES}
    )
    include_directories(
        ${CMAKE_CURRENT_BINARY_DIR}
        ${ALGLIB_INCLUDES}
    )
     
    add_executable(
        ${EXECUTABLE_NAME}
        ${SOURCE_FILES}
    )
    target_link_libraries(
        ${EXECUTABLE_NAME}
        ${ALGLIB_LIBRARIES}
    )
    Le fichier « main.cpp » :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #include <libalglib/stdafx.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <libalglib/interpolation.h>
     
    using namespace alglib;
     
     
    int main(int argc, char **argv)
    {
        //
        // We use bicubic spline to reproduce f(x,y)=1/(1+x^2+2*y^2) sampled
        // at irregular points (x,y) from [-1,+1]*[-1,+1]
        //
        // We have 5 such points, located approximately at corners of the area
        // and its center -  but not exactly at the grid. Thus, we have to FIT
        // the spline, i.e. to solve least squares problem
        //
        real_2d_array xy = "[[-0.987,-0.902,0.359],[0.948,-0.992,0.347],[-1.000,1.000,0.333],[1.000,0.973,0.339],[0.017,0.180,0.968]]";
     
        //
        // First step is to create spline2dbuilder object and set its properties:
        // * d=1 means that we create vector-valued spline with 1 component
        // * we specify dataset xy
        // * we rely on automatic selection of interpolation area
        // * we tell builder that we want to use 5x5 grid for an underlying spline
        // * we choose least squares solver named BlockLLS and configure it by
        //   telling that we want to apply zero nonlinearity penalty.
        //
        // NOTE: ALGLIB has two solvers which fit bicubic splines to irregular data,
        //       one of them is BlockLLS and another one is FastDDM. Former is
        //       intended for moderately sized grids (up to 512x512 nodes, although
        //       it may take up to few minutes); it is the most easy to use and
        //       control spline fitting function in the library. Latter, FastDDM,
        //       is intended for efficient solution of large-scale problems
        //       (up to 100.000.000 nodes). Both solvers can be parallelized, but
        //       FastDDM is much more efficient. See comments for more information.
        //
        spline2dbuilder builder;
        ae_int_t d = 1;
        spline2dbuildercreate(d, builder);
        spline2dbuildersetpoints(builder, xy, 5);
        spline2dbuildersetgrid(builder, 5, 5);
        spline2dbuildersetalgoblocklls(builder, 0.000);
     
        //
        // Now we are ready to fit and evaluate our results
        //
        spline2dinterpolant s;
        spline2dfitreport rep;
        spline2dfit(builder, s, rep);
     
        // evaluate results - function value at the grid is reproduced exactly
        double v;
        v = spline2dcalc(s, -1, 1);
        printf("%.2f\n", double(v)); // EXPECTED: 0.333000
     
        // check maximum error - it must be nearly zero
        printf("%.2f\n", double(rep.maxerror)); // EXPECTED: 0.000
        return 0;
    }
    Voici le résultat de la compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    $ make
    Scanning dependencies of target essaiAlglib
    [ 50%] Building CXX object src/CMakeFiles/essaiAlglib.dir/main.cpp.o
    /home/lebarsy/Codes/Cloud/essai/alglib/src/main.cpp: In function ‘int main(int, char**)’:
    /home/lebarsy/Codes/Cloud/essai/alglib/src/main.cpp:40:5: error: ‘spline2dbuilder’ was not declared in this scope
         spline2dbuilder builder;
         ^~~~~~~~~~~~~~~
    /home/lebarsy/Codes/Cloud/essai/alglib/src/main.cpp:42:30: error: ‘builder’ was not declared in this scope
         spline2dbuildercreate(d, builder);
                                  ^~~~~~~
    /home/lebarsy/Codes/Cloud/essai/alglib/src/main.cpp:42:5: error: ‘spline2dbuildercreate’ was not declared in this scope
         spline2dbuildercreate(d, builder);
         ^~~~~~~~~~~~~~~~~~~~~
    /home/lebarsy/Codes/Cloud/essai/alglib/src/main.cpp:43:5: error: ‘spline2dbuildersetpoints’ was not declared in this scope
         spline2dbuildersetpoints(builder, xy, 5);
         ^~~~~~~~~~~~~~~~~~~~~~~~
    /home/lebarsy/Codes/Cloud/essai/alglib/src/main.cpp:44:5: error: ‘spline2dbuildersetgrid’ was not declared in this scope
         spline2dbuildersetgrid(builder, 5, 5);
         ^~~~~~~~~~~~~~~~~~~~~~
    /home/lebarsy/Codes/Cloud/essai/alglib/src/main.cpp:45:5: error: ‘spline2dbuildersetalgoblocklls’ was not declared in this scope
         spline2dbuildersetalgoblocklls(builder, 0.000);
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /home/lebarsy/Codes/Cloud/essai/alglib/src/main.cpp:51:5: error: ‘spline2dfitreport’ was not declared in this scope
         spline2dfitreport rep;
         ^~~~~~~~~~~~~~~~~
    /home/lebarsy/Codes/Cloud/essai/alglib/src/main.cpp:52:29: error: ‘rep’ was not declared in this scope
         spline2dfit(builder, s, rep);
                                 ^~~
    /home/lebarsy/Codes/Cloud/essai/alglib/src/main.cpp:52:29: note: suggested alternative: ‘drem’
         spline2dfit(builder, s, rep);
                                 ^~~
                                 drem
    /home/lebarsy/Codes/Cloud/essai/alglib/src/main.cpp:52:5: error: ‘spline2dfit’ was not declared in this scope
         spline2dfit(builder, s, rep);
         ^~~~~~~~~~~
    src/CMakeFiles/essaiAlglib.dir/build.make:62: recipe for target 'src/CMakeFiles/essaiAlglib.dir/main.cpp.o' failed
    make[2]: *** [src/CMakeFiles/essaiAlglib.dir/main.cpp.o] Error 1
    CMakeFiles/Makefile2:85: recipe for target 'src/CMakeFiles/essaiAlglib.dir/all' failed
    make[1]: *** [src/CMakeFiles/essaiAlglib.dir/all] Error 2
    Makefile:83: recipe for target 'all' failed
    make: *** [all] Error 2
    Le type « real_2d_array » d’Alglib est bien trouvé, donc la bibliothèque est bien incluse au projet, mais cependant impossible de créer « builder » et ce qui s’ensuit.

    Voici ce qu’il y a d’installé concernant Alglib sur la machine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ aptitude search alglib
    i   libalglib-dev                                                                        - fichiers de développement pour la bibliothèque alglib                                         
    p   libalglib-dev:i386                                                                   - fichiers de développement pour la bibliothèque alglib                                         
    i A libalglib3.11                                                                        - Numerical analysis and data processing library                                                
    p   libalglib3.11:i386                                                                   - Numerical analysis and data processing library
    À bientôt.

  4. #4
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    avril 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : avril 2008
    Messages : 179
    Points : 600
    Points
    600
    Par défaut
    Re-salut à tous !

    Voici une série de commandes dont je trouve le résultat intéressant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cd /usr/include/libalglib/
    $ ls
    alglibinternal.h  diffequations.h   linalg.h            statistics.h
    alglibmisc.h      fasttransforms.h  optimization.h      stdafx.h
    ap.h              integration.h     solvers.h
    dataanalysis.h    interpolation.h   specialfunctions.h
    $ grep spline2dbuilder *
    Il n’y a effectivement pas de fonction « spli2dbuilder » dans les fichiers d’Alglib disponible dans la distribution. Il est donc normal que la compilation échoue. Comme l’indique les commandes données dans mon message précédent, la version d’Alglib installée est la version 3.11. Je me demande s’il n’y a pas eu un changement de structure récemment, que la documentation n’aurait pas pris en compte.

    À bientôt.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    6 825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 6 825
    Points : 31 276
    Points
    31 276
    Billets dans le blog
    4
    Par défaut
    C'est pas ça ton fichier ? https://nfbyfm.github.io/TME/interpo...8h_source.html
    spline2dbuilder y est déclaré si AE_COMPILE_SPLINE2D est défini.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    avril 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : avril 2008
    Messages : 179
    Points : 600
    Points
    600
    Par défaut
    Salut à tous !

    Citation Envoyé par Bousk Voir le message
    C'est pas ça ton fichier ? https://nfbyfm.github.io/TME/interpo...8h_source.html
    spline2dbuilder y est déclaré si AE_COMPILE_SPLINE2D est défini.
    J’ai installé la version d’Alglib provenant des dépôts de la distribution. On n’y trouve pas « spline2dbuilder ». Ceci, aussi bien sous Debian/Ubuntu que CentOS/Fedora.

    Cela tend à me faire penser que je devrais plutôt préférer Eigen.

    À bientôt.

  7. #7
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    avril 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : avril 2008
    Messages : 179
    Points : 600
    Points
    600
    Par défaut
    Salut à tous !

    Bon, en explorant plus avant la documentation d’Alglib, il ressort que ses auteurs encouragent plutôt d’inclure ses sources dans son propre projet. Donc, à partir de l’exemple du site, voici le projet que j’ai construit.

    Tout d’abord, son arborescence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    racine/
    |-- include/
    |   |-- alglibinternal.h
    |   |-- alglibmisc.h
    |   |-- ap.h
    |   |-- dataanalysis.h
    |   |-- diffequations.h
    |   |-- fasttransforms.h
    |   |-- integration.h
    |   |-- interpolation.h
    |   |-- linalg.h
    |   |-- optimization.h
    |   |-- solvers.h
    |   |-- specialfunctions.h
    |   |-- statistics.h
    |   |-- stdafx.h
    |-- alglib/
    |   |-- alglibinternal.cpp
    |   |-- alglibmisc.cpp
    |   |-- ap.cpp
    |   |-- CMakeLists.txt
    |   |-- dataanalysis.cpp
    |   |-- diffequations.cpp
    |   |-- fasttransforms.cpp
    |   |-- integration.cpp
    |   |-- interpolation.cpp
    |   |-- linalg.cpp
    |   |-- optimization.cpp
    |   |-- solvers.cpp
    |   |-- specialfunctions.cpp
    |   |-- statistics.cpp
    |-- src/
    |   |-- CMakeLists.txt
    |   |-- main.cpp
    |-- CMakeLists.txt
    Les fichiers sources d’Alglib sont ceux téléchargeables sur le site de la bibliothèque, je n’ai rien changé et donc je ne les détaille pas.

    Contenu du fichier « CMakeLists.txt » à la racine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cmake_minimum_required(VERSION 3.1.0)
     
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_CXX_EXTENSIONS OFF)
     
    project(EssaiAlglib CXX)
     
    add_subdirectory(alglib)
    add_subdirectory(src)
    Celui de « CMakeLists.txt » dans le répertoire « alglib » :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    ## Alglib compilation
     
    # Find includes in corresponding build directories
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
     
    # Path for the executable.
    set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})
    # Name of the executable.
    set(LIBRARY_NAME alglib)
     
    set(
        SOURCE_FILES
        alglibinternal.cpp
        dataanalysis.cpp
        interpolation.cpp
        specialfunctions.cpp
        alglibmisc.cpp
        diffequations.cpp
        linalg.cpp
        statistics.cpp
        ap.cpp
        fasttransforms.cpp
        optimization.cpp
        integration.cpp
        solvers.cpp
    )
     
    set_source_files_properties(${SOURCE_FILES} PROPERTIES COMPILE_DEFINITIONS AE_COMPILE_SPLINE2D)
     
    include_directories(
        ${CMAKE_CURRENT_BINARY_DIR}
        ../include/
    )
     
    add_library(${LIBRARY_NAME} STATIC ${SOURCE_FILES})
    Contenu de « CMakeLists.txt » du répertoire « src » :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    ## Project compilation.
     
    # Find includes in corresponding build directories
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
     
    # Path for the executable.
    set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})
    # Name of the executable.
    set(EXECUTABLE_NAME essaiAlglib)
     
    set(
        SOURCE_FILES
        main.cpp
    )
     
    set_source_files_properties(${SOURCE_FILES} PROPERTIES COMPILE_DEFINITIONS AE_COMPILE_SPLINE2D)
     
    include_directories(
        ${CMAKE_CURRENT_BINARY_DIR}
        ../include/
    )
     
    link_directories(
        ../alglib/
    )
     
    add_executable(
        ${EXECUTABLE_NAME}
        ${SOURCE_FILES}
    )
     
    target_link_libraries(${EXECUTABLE_NAME} alglib)
    Enfin, contenu de « main.cpp » (il ne diffère de l’exemple du site que sur les directives « #include ») :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #include <stdafx.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <interpolation.h>
     
    using namespace alglib;
     
     
    int main(int argc, char **argv)
    {
        //
        // We use bicubic spline to reproduce f(x,y)=1/(1+x^2+2*y^2) sampled
        // at irregular points (x,y) from [-1,+1]*[-1,+1]
        //
        // We have 5 such points, located approximately at corners of the area
        // and its center -  but not exactly at the grid. Thus, we have to FIT
        // the spline, i.e. to solve least squares problem
        //
        real_2d_array xy = "[[-0.987,-0.902,0.359],[0.948,-0.992,0.347],[-1.000,1.000,0.333],[1.000,0.973,0.339],[0.017,0.180,0.968]]";
     
        //
        // First step is to create spline2dbuilder object and set its properties:
        // * d=1 means that we create vector-valued spline with 1 component
        // * we specify dataset xy
        // * we rely on automatic selection of interpolation area
        // * we tell builder that we want to use 5x5 grid for an underlying spline
        // * we choose least squares solver named BlockLLS and configure it by
        //   telling that we want to apply zero nonlinearity penalty.
        //
        // NOTE: ALGLIB has two solvers which fit bicubic splines to irregular data,
        //       one of them is BlockLLS and another one is FastDDM. Former is
        //       intended for moderately sized grids (up to 512x512 nodes, although
        //       it may take up to few minutes); it is the most easy to use and
        //       control spline fitting function in the library. Latter, FastDDM,
        //       is intended for efficient solution of large-scale problems
        //       (up to 100.000.000 nodes). Both solvers can be parallelized, but
        //       FastDDM is much more efficient. See comments for more information.
        //
        spline2dbuilder builder;
        ae_int_t d = 1;
        spline2dbuildercreate(d, builder);
        spline2dbuildersetpoints(builder, xy, 5);
        spline2dbuildersetgrid(builder, 5, 5);
        spline2dbuildersetalgoblocklls(builder, 0.000);
     
        //
        // Now we are ready to fit and evaluate our results
        //
        spline2dinterpolant s;
        spline2dfitreport rep;
        spline2dfit(builder, s, rep);
     
        // evaluate results - function value at the grid is reproduced exactly
        double v;
        v = spline2dcalc(s, -1, 1);
        printf("%.2f\n", double(v)); // EXPECTED: 0.333000
     
        // check maximum error - it must be nearly zero
        printf("%.2f\n", double(rep.maxerror)); // EXPECTED: 0.000
        return 0;
    }
    J’obtiens alors le résultat escompté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    $ make -j3
    [  6%] Building CXX object alglib/CMakeFiles/alglib.dir/alglibinternal.cpp.o
    [ 18%] Building CXX object alglib/CMakeFiles/alglib.dir/interpolation.cpp.o
    [ 18%] Building CXX object alglib/CMakeFiles/alglib.dir/dataanalysis.cpp.o
    [ 25%] Building CXX object alglib/CMakeFiles/alglib.dir/specialfunctions.cpp.o
    [ 31%] Building CXX object alglib/CMakeFiles/alglib.dir/alglibmisc.cpp.o
    [ 37%] Building CXX object alglib/CMakeFiles/alglib.dir/diffequations.cpp.o
    [ 43%] Building CXX object alglib/CMakeFiles/alglib.dir/linalg.cpp.o
    [ 50%] Building CXX object alglib/CMakeFiles/alglib.dir/statistics.cpp.o
    [ 56%] Building CXX object alglib/CMakeFiles/alglib.dir/ap.cpp.o
    [ 62%] Building CXX object alglib/CMakeFiles/alglib.dir/fasttransforms.cpp.o
    [ 68%] Building CXX object alglib/CMakeFiles/alglib.dir/optimization.cpp.o
    [ 75%] Building CXX object alglib/CMakeFiles/alglib.dir/integration.cpp.o
    [ 81%] Building CXX object alglib/CMakeFiles/alglib.dir/solvers.cpp.o
    [ 87%] Linking CXX static library libalglib.a
    [ 87%] Built target alglib
    [ 93%] Building CXX object src/CMakeFiles/essaiAlglib.dir/main.cpp.o
    [100%] Linking CXX executable bin/Debug/essaiAlglib
    [100%] Built target essaiAlglib
     
     
    $ ./essaiAlglib 
    0.33
    0.00
    Le problème est donc résolu : d’une part, je vais utiliser Alglib, d’autre part les auteurs d’Alglib conseillent d’insérer les sources de la bibliothèque dans son projet, enfin j’ai pu déterminer la configuration de CMake nécessaire pour réaliser toute la compilation.

    À bientôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. code optimisé pour interpolation
    Par membreComplexe12 dans le forum MATLAB
    Réponses: 7
    Dernier message: 28/06/2012, 10h48
  2. [Débutant] Problème pour interpoler
    Par MTN84 dans le forum MATLAB
    Réponses: 4
    Dernier message: 13/08/2009, 17h47
  3. Compréhension Interpolation Bicubique
    Par RKOCOCO dans le forum Traitement d'images
    Réponses: 11
    Dernier message: 03/03/2008, 15h09
  4. interpolation bicubique : help
    Par ale2000 dans le forum Traitement d'images
    Réponses: 30
    Dernier message: 14/07/2007, 20h53
  5. Griddata seulement pour interpolation ?
    Par hollowdeadoss dans le forum MATLAB
    Réponses: 3
    Dernier message: 04/06/2007, 15h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo