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

Boost C++ Discussion :

Boost, lu et InvertMatrix


Sujet :

Boost C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 87
    Par défaut Boost, lu et InvertMatrix
    Bonjour,

    Je suis sur un projet assez conséquent pour réaliser un programme qui fait diverses actions et calculs, dont des manipulations de matrices.

    J'utilise donc dans mon programme des matrices, avec des calculs de base (transposée, produit) et des inversions. J'avais choisis BOOST pour faire tout ce dont j'ai besoin à ce niveau, mais je suis maintenant bloqué sur un problème d'inversion. Toute la documentation que j'ai pu trouver aussi bien sur les forums et sur BOOST concernant les inversions de matrices m'a envoyé ici, j'utilise donc InvertMatrix pour mes inversions.

    je ne comprends pas la ligne:
    // REMEMBER to update "lu.hpp" header includes from boost-CVS
    Pour utiliser cette fonction InvertMatrix, il faudrait que je bidouille le lu de BOOST?

    Cette fonction me renvoie de bonnes choses à certains endroits, et fait complètement planter l'application à d'autres... Mais je ne comprends pas pourquoi.

    Par exemple, pour la matrice:
    0.127213 -0.00600185 -0.000149287 0.587534
    -0.00600185 0.00553831 -0.00593579 -0.0335789
    -0.000149287 -0.00593579 0.0298501 0
    0.587534 -0.0335789 0 3
    La fonction me renvoie:
    82.8377 -11.3315 -1.83901 -16.3502
    -11.3315 252.673 50.1882 5.04737
    -1.83901 50.1882 43.4716 0.921916
    -16.3502 5.04737 0.921916 3.59192
    Par contre, Excel me donne:
    82.8339694 -11.33084355 -1.83890416 -16.34941688
    -11.33084355 252.6730142 50.18818708 5.047245904
    -1.83890416 50.18818708 43.47161365 0.921894277
    -16.34941688 5.047245904 0.921894277 3.591773088
    Ce qui fait une différence de:
    0.003730597 -0.000656448 -0.00010584 -0.000783119
    -0.000656448 -1.41645E-05 1.29217E-05 0.000124096
    -0.00010584 1.29217E-05 -1.36459E-05 2.17228E-05
    -0.000783119 0.000124096 2.17228E-05 0.000146912
    Bon, au moins l'inversion fonctionne.
    mais d'où peut venir la différence? Mes matrices sont en double, ce qui devrait être suffisant pour conserver la précision... non? Faudrait-il que je passe en long double? Y a-t-il plus grand encore? ^^

    Cependant, pour la matrice:
    29.1694 145.914 2.9161 0.0291432
    145.914 729.909 14.5872 0.145783
    2.9161 14.5872 0.291527 0.00291348
    0.0291432 0.145783 0.00291348 2.91E-05
    Le programme bug et renvoie:
    Check failed in file c:\qtsdk\mingw\bin\../lib/gcc/mingw32/4.4.0/../../../../include/boost/numeric/ublas/lu.hpp at line 299:
    detail::expression_type_check (prod (triangular_adaptor<const_matrix_type, upper> (m), e), cm2)
    terminate called after throwing an instance of 'boost::numeric::ublas::internal_logic'
    what(): internal logic

    ...c'est-à-dire au niveau du lu_substitute de InvertMatrix...

    Une idée sur le problème?

    Excel me renvoie:
    29583.05966 -1036.301438 -110716.8234 -13342628.25
    -1036.301438 263.7012475 -687.1073365 -214312.0502
    -110716.8234 -687.1073363 1034457.92 10747589.39
    -13342628.25 -214312.0502 10747589.4 13352224310
    La matrice est donc bien inversible, par contre, on voit que l'étendue est très importante, +/- 10^10... Mais ce qui devrait largement tenir dans du double...

    Encore une idée?


    Merci!

  2. #2
    Membre Expert Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Par défaut
    Utilise plutôt ça : http://arma.sourceforge.net/

    Sinon, l'explication vient sûrement de la différence entre les algos pour approximer la matrice inverse.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 87
    Par défaut
    Merci pour ta contribution.

    Si je comprends bien, ce que tu me proposes là, c'est de changer complètement tout mon code pour passer de boost à armadillo?

    Bien que cela représenterait pas mal de travail, je n'ai rien contre. Cependant, est-ce qu'un peu de justifications supplémentaires pourraient être apportées?

    Boost a l'air d'être éprouvé, alors pourquoi le balayer si vite?

    Je n'ai trouvé aucune info supplémentaire sur cette bibliothèque lorsque je cherchais les inversions de matrice, est-elle peu connue? récente? moins efficace/fiable/... que Boost?

  4. #4
    Invité
    Invité(e)
    Par défaut
    J'aimerais également te proposer gsl, que j'ai trouvé assez facile d'emploi, et suffisamment complet à mon gout.

    Quant à l'erreur, comme dit par davcha les algo mis en jeu sont probablement différents.
    Cela dit, le déterminant de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    29.1694 145.914 2.9161 0.0291432;
    145.914 729.909 14.5872 0.145783;
    2.9161 14.5872 0.291527 0.00291348;
    0.0291432 0.145783 0.00291348 2.91E-05
    est -1.8620e-15 qui vaut quasiment 0, donc tu y vas un peu au bonheur la chance.

    Un exemple simple:
    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
    A=[
    29.1694 145.914 2.9161 0.0291432;
    145.914 729.909 14.5872 0.145783;
    2.9161 14.5872 0.291527 0.00291348;
    0.0291432 0.145783 0.00291348 2.91E-05
    ]
    invA=inv(A)
    invInvA=inv(inv(A))
    B=[
     29583.05966 -1036.301438 -110716.8234 -13342628.25;
    -1036.301438 263.7012475 -687.1073365 -214312.0502;
    -110716.8234 -687.1073363 1034457.92 10747589.39;
    -13342628.25 -214312.0502 10747589.4 13352224310 
    ];
    invB=inv(B)
    et la sortie
    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
    A =
     
       2.9169e+01   1.4591e+02   2.9161e+00   2.9143e-02
       1.4591e+02   7.2991e+02   1.4587e+01   1.4578e-01
       2.9161e+00   1.4587e+01   2.9153e-01   2.9135e-03
       2.9143e-02   1.4578e-01   2.9135e-03   2.9100e-05
     
    invA =
     
       1.6191e+04  -1.2514e+03  -9.9930e+04   5.8695e+04
      -1.2514e+03   2.6025e+02  -5.1384e+02   9.4276e+02
      -9.9930e+04  -5.1384e+02   1.0258e+06  -4.7279e+04
       5.8695e+04   9.4276e+02  -4.7279e+04  -5.8737e+07
     
    invInvA =
     
       2.9169e+01   1.4591e+02   2.9161e+00   2.9143e-02
       1.4591e+02   7.2991e+02   1.4587e+01   1.4578e-01
       2.9161e+00   1.4587e+01   2.9153e-01   2.9135e-03
       2.9143e-02   1.4578e-01   2.9135e-03   2.9100e-05
     
    invB =
     
       2.9167e+01   1.4590e+02   2.9158e+00   2.9140e-02
       1.4590e+02   7.2984e+02   1.4586e+01   1.4577e-01
       2.9158e+00   1.4586e+01   2.9150e-01   2.9132e-03
       2.9140e-02   1.4577e-01   2.9132e-03   2.9114e-05
    on constate que l'inversion de B donne bien A, l'inversion de l'inversion de A donne bien A, mais l'inversion de A (invA) est différente de B...
    bref, le comportement sur l'inverse est erratique...

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 87
    Par défaut
    Merci également galerien69 pour ta participation.

    Je ne pourrai pas utiliser gsl car elle est GPL, j'avais oublié de le mentionner, mais je ne peux pas placer mon application en licence GPL, donc c'est exclu.
    Armadillo est LGPL, ce qui serait acceptable.

    Je suis d'accord au niveau de la précision, cela ne pose pour le moment pas le plus gros problème, et je verrai à terme comment je veux traiter ces différences, qui, si elles restent minimes, n'ont pas d'importance.
    Par contre, le bug du programme est lui totalement bloquant, et il est donc primordial de le supprimer, en corrigeant Boost, ou en passant à autre chose. Mais le choix doit être justifié, et vous êtes là pour m’aiguiller et me conseiller

    Merci!

    La question reste ouvert...

  6. #6
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    l'inversion de matrice c'est un truc instable numeriquement donc cooli sur "on change de lib" :o

    ensuite, y a besoin de cette inverse ? en genral on resout Ax=b et on ne calcule *jamais* A-1

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 87
    Par défaut
    Il y a effectivement besoin de cette matrice inverse, à mon avis.
    C'est pour une compensation par les moindres carrés:
    J'ai une matrice A, et une matrice K.
    La solution recherchée est:
    dX = (At * A)^-1 * (At * K)

    Soit N = At * A et nk = At * K,
    on a donc dX = N^-1 * nk.

    La matrice N^-1 sert donc pour ce calcul de dX, mais également pour d'autres calculs qui nécessitent la matrice Q ( = N^-1).

    Si tu vois une solution pour ne pas calculer N^-1, je suis preneur, mais comme il me la faut à plusieurs endroits, elle sera nécessaire, calculée par l'inversion ou par un autre moyen...

  8. #8
    Invité
    Invité(e)
    Par défaut
    La matrice N^-1 sert donc pour ce calcul de dX, mais également pour d'autres calculs qui nécessitent la matrice Q ( = N^-1).

    Si tu vois une solution pour ne pas calculer N^-1, je suis preneur, mais comme il me la faut à plusieurs endroits, elle sera nécessaire, calculée par l'inversion ou par un autre moyen...
    c'est rare qu'on ait à calculer explicitement une matrice inverse.

    Ici, le cas trivial de dX, c'est que
    dX = (At * A)^-1 * (At * K) = A^-1 At^-1 At K = A^-1 K
    AdX=k
    et tu cherches dX
    Tu peux y aller à coup de LU, ou simplement à coup de gradient pour trouver dX.

    Si tous tes systems sont linéaires, tu peux trouver ta solution X (ici dX) en une vingtaine d'itérations avec un gradient par exemple. Après il reste peut être à conditionner l'initialisation, mais globalement, tu es gagnant à ne pas calculer l'inverse explicitement.

    Quels sont tes autres systèmes?

    edit: je viens de comprendre que A est probablement non carrée, et que tu prends A^tA pour avoir une matrice carrée. Si c'est le cas, c'est évident que A^tA ne sera pas inversible (je me rappèle plus de la démo...). Tu peux regarder du côté des valeurs singulières.
    Dernière modification par Invité ; 07/07/2012 à 10h37.

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 87
    Par défaut
    Pour dX, tout à fait d'accord.
    Cependant, les systèmes ne sont pas linéaires.
    Mais il est vrai qu'on pourrait passer par un solveur de A*dX = K, au lieu de faire dX = A^-1 * K, en calculant A^-1.

    Par contre, mes autres systèmes sont:
    C = constante² * Q
    avec Q = N^-1

    Et c'est là que je suis obligé d'avoir la matrice inverse, donc autant la calculer directement dès le début...

  10. #10
    Invité
    Invité(e)
    Par défaut
    ben non
    C = constante² * Q
    NC=constante
    et c'est encore un système easy

  11. #11
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 87
    Par défaut
    Ah ben oui d'accord...
    Et donc avec tout ca je pourrais conserver Boost ou vaut-il mieux tout de même passer à Armadillo?
    Pour Boost, ca serait donc la fonction solve(matrix, matrix, C), mais je ne trouve pas la documentation dessus... (que le solve pour les matrices triangulaires)

    Donc quand je cherche dX = N^-1 * nk, il faudrait faire le solveur avec: N * dX = nk ? Qui renverrait la matrice dX?

    Idem pour C = cste² * N^-1, avec N * C = cste² ? Mais il faudrait alors gérer cste² comme un double ou comme un vecteur à une valeur?

    Comment fonctionne le solveur? C'est-à-dire, que renvoie-t-il à la fin?
    Est-ce la solution finale dans le cas d'un système non-linéaire? Ou faut-il quand même relancer des itérations sur le solveur?

    Et concernant Armadillo:
    Quelle est la fonction correspondant à la multiplication matricielle?
    Il y a dot() pour les vecteurs, cross() pour le produit vectoriel, mais quel est l'équivalent du prod(matrice, matrice) de Boost?

    Et par rapport au bug de départ:
    Est-ce que quelqu'un a une idée sur la provenance du problème? Car si boost me renvoie un erreur, c'est peut-être que ma matrice a un problème, non?

  12. #12
    Invité
    Invité(e)
    Par défaut
    Pour Boost, ca serait donc la fonction solve(matrix, matrix, C), mais je ne trouve pas la documentation dessus... (que le solve pour les matrices triangulaires)
    ben dans ce cas là, tu la triangularise avant
    Note: tu parlais de moindre carrés, donc ca veut dire que ta matrice est probablement symétric définie positive, donc tu peux utiliser un cholesky à la place (mais dans un premier temps fais ptet le bon vieux solve pour te faire la main)

    C = cste² * N^-1
    pour moi, cstr était une matrice. Si c'est un scalaire, il est clairement trivial de trouver C...
    N*C=I*cstr, tu prends le premier coeff de I*cste, et tu peux le calculer à la mano.

    Comment fonctionne le solveur? C'est-à-dire, que renvoie-t-il à la fin?
    de quel solveur parles tu?

    Est-ce que quelqu'un a une idée sur la provenance du problème
    ben tu peux considérer ta matrice comme non inversible A comme non inversible.
    Ta matrice A^t A ne l'est pas non plus.
    Si tu cherches l'inverse de (A^tA), il s'agit d'une pseudo inverse qui va te donner des valeurs propres dont certaines vaudront zero...(ou tout proche vu que c'est numérique)
    Après, ca devient exotique

  13. #13
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 87
    Par défaut
    Si, en utilisant une bibliothèque, je dois repartir dans un développement spécifique à partir des fonctions fournies, alors qu'une autre en propose des toutes faites, mieux vaut prendre la seconde non?

    Alors dans ces conditions, il vaudrait mieux passer à Armadillo?
    Qui propose a priori tout ce que j'utilisais dans Boost, plus encore ce que je devrais développer...
    Le passage permettra même un contrôle de ce qui marchait.

    Mon raisonnement se tient ou c'est absurde? ^^
    Sachant que le temps joue contre moi et que l'essentiel est d'avoir quelque chose qui marche et qui est juste...

  14. #14
    Invité
    Invité(e)
    Par défaut
    J'ai fait la même erreur que toi, à savoir commencer avec Boost, parce que c'est connu.

    La première des choses, c'est que tu saches ce dont tu as besoin.
    La seconde, c'est que tu regardes avant même de coder si les alternatives te permettent d'y arriver sans trop te fouler (plus)
    La troisième, c'est qu'il faut que tu te fasses un jeu de test pour t'assurer que ce que tu implémentes est correcte.

    Quant à modifier ton programme de fond en comble je sais pas.

    Personnellement, je te conseillerais de te tourner la ou la communauté est plus importante, et de fait, plutot vers boost, étant wrapper de ublas qui est plutot pas mal utilisé...
    bref de ne pas changer, et de chercher une alternative à ton problème, en changeant ton approche du calcul de N^-1 comme dit plus haut.

    Après, Armadillo à l'air également assez simple d'emploi, éventuellement, fais un petit test avant de choisir pour voir là ou tu te sens le plus à l'aise...

  15. #15
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 87
    Par défaut
    Ok, je te remercie.
    Je vais effectivement faire quelques tests pour voir ce qui pourrait être le mieux, et je verrai en choisissant d'après le résultat

  16. #16
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    changer l'algo me parait bien bien mieux :o

  17. #17
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 87
    Par défaut
    Changer d'algo?
    C'est-à-dire?
    Passer de Boost à Armadillo ou éviter l'inversion en passant par le solve?

  18. #18
    Membre Expert Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Par défaut
    Armadillo propose des primitives qui sont très proches de matlab/octave.

    Le produit matriciel c'est simplement :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mat A,B,C;
    // ...
    A = B*C;

    Armadillo se base également sur des librairies type blas/lapack... Si tu la compiles comme il faut, tu peux la faire utiliser acml ou d'autres librairies blas/lapack plus performantes.

    Pour ce qui est de ton erreur, excel raconte n'importe quoi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    A
    2.9169e+01   1.4591e+02   2.9161e+00   2.9143e-02
    1.4591e+02   7.2991e+02   1.4587e+01   1.4578e-01
    2.9161e+00   1.4587e+01   2.9153e-01   2.9135e-03
    2.9143e-02   1.4578e-01   2.9135e-03   2.9100e-05
     
    B
    2.9583e+04  -1.0363e+03  -1.1072e+05  -1.3343e+07
    -1.0363e+03   2.6370e+02  -6.8711e+02  -2.1431e+05
    -1.1072e+05  -6.8711e+02   1.0345e+06   1.0748e+07
    -1.3343e+07  -2.1431e+05   1.0748e+07   1.3352e+10
    En supposant que B = A^-1, AB = I, or...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    AB
    1.0001e+00   1.7345e-05  -4.6794e-04  -3.7062e-02
    4.4987e-04   1.0001e+00  -2.3408e-03  -1.8539e-01
    8.9906e-06   1.7340e-06   9.9995e-01  -3.7051e-03
    2.2816e-01   3.6648e-03  -1.8378e-01  -2.2732e+02
    A^-1 est égal à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A^-1
    1.6191e+04  -1.2514e+03  -9.9930e+04   5.8695e+04
    -1.2514e+03   2.6025e+02  -5.1384e+02   9.4276e+02
    -9.9930e+04  -5.1384e+02   1.0258e+06  -4.7279e+04
    5.8695e+04   9.4276e+02  -4.7279e+04  -5.8737e+07
    Après, vu les tailles de tes matrices, si c'est du 4x4... Tu peux les inverser, y'a pas de problème...

  19. #19
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 87
    Par défaut
    J'essaie de passer à Armadillo pour faire les tests, mais je n'y arrive pas.

    Je suis sous Windows, je passe donc à la partie === 2.2: Manual Installation / Installation on Windows === du Readme.
    * Step 1:
    Copy the entire "include" folder to a convenient location
    and tell your compiler to use that location for header files
    (in addition to the locations it uses already).
    Alternatively, you can use the "include" folder directly.
    J'utilise Qt Creator, j'ai donc copié tout le include d'Armadillo dans le include de Qt, là où j'avais placé boost. Puis j'ai renommé le dossier en armadillo.
    jusque là, c'est ok?

    * Step 2:
    Modify "include/armadillo_bits/config.hpp" to indicate
    which libraries are currently available on your system.
    For example, if you have LAPACK and BLAS present,
    uncomment the following lines:

    #define ARMA_USE_LAPACK
    #define ARMA_USE_BLAS
    Je n'en avais aucune des deux. J'ai donc téléchargé à partir du site d'Armadillo LAPACK et BLAS, que j'ai placées toujours dans le include de Qt.
    Puis j'ai décommenté les deux lignes spécifiées.
    toujours bon?

    * Step 3:
    If you have LAPACK and/or BLAS present, configure your
    compiler to link with these libraries.
    euh... ca suffit ce que j'ai fait en step 2 non?

    Mais après, je ne sais pas comment inclure armadillo...
    Comme je veux utiliser les matrices, j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <armadillo/armadillo_bits/Mat_bones.hpp>
     
        Mat<double> matrice;
        //mat matrice;
    Mais le compilateur n'a pas l'air de connaitre...

    Comment faire?

    Et si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <armadillo/armadillo_bits/Mat_bones.hpp>
     
        //Mat<double> matrice;
        mat matrice;
    Le compilateur m'envoie des problèmes sur le fichier Mat_bones.hpp...

    Une idée?

    EDIT:
    En me basant sur les exemples, j'ai finalement en partie débloqué la chose.
    C'était le using namespace qui me manquait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <armadillo/armadillo>
    using namespace arma;
    mat A(2,3);
    Cela fonctionne aussi si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <armadillo/armadillo>
    arma::mat A(2,3);
    Mais pourquoi alors lorsque je fais arma::, le compilateur ne me propose rien?
    Alors que quand je faisais boost::, j'avais la liste de toutes les possibilités?

  20. #20
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 87
    Par défaut
    J'ai utilisé le fichier d'exemple example1.cpp fourni avec Armadillo:
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    cout << "Armadillo version: " << arma_version::as_string() << endl;
     
        // directly specify the matrix size (elements are uninitialised)
        mat A(2,3);
     
        // .n_rows = number of rows    (read only)
        // .n_cols = number of columns (read only)
        cout << "A.n_rows = " << A.n_rows << endl;
        cout << "A.n_cols = " << A.n_cols << endl;
     
        // directly access an element (indexing starts at 0)
        A(1,2) = 456.0;
     
        A.print("A:");
     
        // scalars are treated as a 1x1 matrix,
        // hence the code below will set A to have a size of 1x1
        A = 5.0;
        A.print("A:");
     
        // if you want a matrix with all elements set to a particular value
        // the .fill() member function can be used
        A.set_size(3,3);
        A.fill(5.0);
        A.print("A:");
     
     
     
        mat B;
     
        // endr indicates "end of row"
        B << 0.555950 << 0.274690 << 0.540605 << 0.798938 << endr
          << 0.108929 << 0.830123 << 0.891726 << 0.895283 << endr
          << 0.948014 << 0.973234 << 0.216504 << 0.883152 << endr
          << 0.023787 << 0.675382 << 0.231751 << 0.450332 << endr;
     
        // print to the cout stream
        // with an optional string before the contents of the matrix
        B.print("B:");
     
        // the << operator can also be used to print the matrix
        // to an arbitrary stream (cout in this case)
        cout << "B:" << endl << B << endl;
     
        // save to disk
        B.save("B.txt", raw_ascii);
     
        // load from disk
        mat C;
        C.load("B.txt");
     
        C += 2.0 * B;
        C.print("C:");
     
     
        // submatrix types:
        //
        // .submat(first_row, first_column, last_row, last_column)
        // .row(row_number)
        // .col(column_number)
        // .cols(first_column, last_column)
        // .rows(first_row, last_row)
     
        cout << "C.submat(0,0,3,1) =" << endl;
        cout << C.submat(0,0,3,1) << endl;
     
        // generate the identity matrix
        mat D = eye<mat>(4,4);
     
        D.submat(0,0,3,1) = C.cols(1,2);
        D.print("D:");
     
        // transpose
        cout << "trans(B) =" << endl;
        cout << trans(B) << endl;
     
        // maximum from each column (traverse along rows)
        cout << "max(B) =" << endl;
        cout << max(B) << endl;
     
        // maximum from each row (traverse along columns)
        cout << "max(B,1) =" << endl;
        cout << max(B,1) << endl;
     
        // maximum value in B
        cout << "max(max(B)) = " << max(max(B)) << endl;
     
        // sum of each column (traverse along rows)
        cout << "sum(B) =" << endl;
        cout << sum(B) << endl;
     
        // sum of each row (traverse along columns)
        cout << "sum(B,1) =" << endl;
        cout << sum(B,1) << endl;
     
        // sum of all elements
        cout << "sum(sum(B)) = " << sum(sum(B)) << endl;
        cout << "accu(B)     = " << accu(B) << endl;
     
        // trace = sum along diagonal
        cout << "trace(B)    = " << trace(B) << endl;
     
        // random matrix -- values are uniformly distributed in the [0,1] interval
        mat E = randu<mat>(4,4);
        E.print("E:");
     
        cout << endl;
     
        // row vectors are treated like a matrix with one row
        rowvec r;
        r << 0.59499 << 0.88807 << 0.88532 << 0.19968;
        r.print("r:");
     
        // column vectors are treated like a matrix with one column
        colvec q;
        q << 0.81114 << 0.06256 << 0.95989 << 0.73628;
        q.print("q:");
     
        // dot or inner product
        //cout << "as_scalar(r*q) = " << as_scalar(r*q) << endl;
     
     
        // outer product
        cout << "q*r =" << endl;
        //cout << q*r << endl;
     
        // multiply-and-accumulate operation
        // (no temporary matrices are created)
        cout << "accu(B % C) = " << accu(B % C) << endl;
     
        // sum of three matrices (no temporary matrices are created)
        mat F = B + C + D;
        F.print("F:");
     
        // imat specifies an integer matrix
        imat AA;
        imat BB;
     
        AA << 1 << 2 << 3 << endr << 4 << 5 << 6 << endr << 7 << 8 << 9;
        BB << 3 << 2 << 1 << endr << 6 << 5 << 4 << endr << 9 << 8 << 7;
     
        // comparison of matrices (element-wise)
        // output of a relational operator is a umat
        umat ZZ = (AA >= BB);
        ZZ.print("ZZ =");
     
     
        // 2D field of arbitrary length row vectors
        // (fields can also store abitrary objects, e.g. instances of std::string)
        field<rowvec> xyz(3,2);
     
        xyz(0,0) = randu(1,2);
        xyz(1,0) = randu(1,3);
        xyz(2,0) = randu(1,4);
        xyz(0,1) = randu(1,5);
        xyz(1,1) = randu(1,6);
        xyz(2,1) = randu(1,7);
     
        cout << "xyz:" << endl;
        cout << xyz << endl;
     
     
        // cubes ("3D matrices")
        cube Q( B.n_rows, B.n_cols, 2 );
     
        Q.slice(0) = B;
        Q.slice(1) = 2.0 * B;
     
        Q.print("Q:");
    Tout fonctionne, sauf les lignes 120 et 125. Si je les décommente, le compilateur me renvoie:
    :-1: erreur : collect2: ld returned 1 exit status

    Mais sans donner plus d'information sur l'erreur...
    Est-ce que ça peut venir d'un problème avec un fichier que j'ai inclus (ou pas inclus...)?
    Comment résoudre cette erreur de compilation?

    Si j'essaie un B = inv(A); , j'ai le même problème... donc c'est absolument à régler...

    A mon avis, c'est un problème avec Blas et/ou Lapack. Mais je ne sais pas comment faire l'inclusion. J'ai bien modifié le config.cpp d'Armadillo pour les defined, mais je n'ai nulle part donné le chemin à utiliser...

    EDIT:
    Le problème venait effectivement de Blas et Lapack. J'ai modifié le fichier .pro pour les inclure:
    Code qt-pro : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    symbian: LIBS += -lblas_win32_MT
    else:unix|win32: LIBS += -L$$PWD/lib/lib_win32/ -lblas_win32_MT
     
    INCLUDEPATH += $$PWD/lib/lib_win32
    DEPENDPATH += $$PWD/lib/lib_win32
     
    symbian: LIBS += -llapack_win32_MT
    else:unix|win32: LIBS += -L$$PWD/lib/lib_win32/ -llapack_win32_MT
     
    INCLUDEPATH += $$PWD/lib/lib_win32
    DEPENDPATH += $$PWD/lib/lib_win32

    Et tout fonctionne.

    Par contre suis-je obligé de passer par les .dll pour cela?
    N'y a-t-il pas un moyen de faire comme pour boost et armadillo, sans les compiler au préalable?

    Je demande cela, car pour le moment je suis sous Windows XP, donc les .dll fournies avec Armadillo pour Blas et Lapack passent, mais si jamais je change de version ou d'OS, les .dll ne seront plus les bonnes?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. installation de boost
    Par heinquoi dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 18/04/2005, 17h20
  2. Fichiers, dossier, chemin et lib boost ?
    Par Clad3 dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 24/11/2004, 18h21
  3. Installation de boost (librairie)
    Par dj.motte dans le forum Autres éditeurs
    Réponses: 14
    Dernier message: 21/11/2004, 03h11
  4. boost::serialize
    Par Fry dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 05/11/2004, 18h03
  5. cherchecomment utiliser boost sous linux
    Par Krost dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 25/02/2004, 22h03

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