Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
992 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Inverser une matrice / DLL utilisee depuis VBA

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Inverser une matrice / DLL utilisee depuis VBA

n°1268268
alexbid
Posté le 16-12-2005 à 11:48:03  profilanswer
 

Bonjour tout le monde!
Voici mon premier code, alors soyez un peu indulgent. Je poste ce petit bout de code car je n ai pas trouve l equivalent sur ce forum mais aussi car j ai besoin d aide pour l ameliorer...
 
Ce code permet d inverser une matrice (n x n) (DIM x DIM en l occurence...) sous VBA via une DLL codee en C++.
 
Mes problemes sont les suivants:
1/ je suis oblige de rentrer la dimension de la matrice manuellement dans la DLL (?!! c est nul) => Cf. ligne1
je pense pouvoir recuperer la dimension du tableau par un safearrayget... mais je ne sais pas comment dimensionner un tableau avec des indices dynamiques...
2/ je suis oblige de faire une boucle pour construire un tableau 2 dimensions.... Cf. Ligne 44/52
 
Par contre l algorythme d inversion est tres puissant (LU decomposition trouvee sur internet).
Voila, vos commentaires sur ce code sont les bienvenus!
 A+
 
Alex
 

Code :
  1. #define DIM 38
  2. long  _stdcall MatriceInv(LPSAFEARRAY FAR *ArrayData1, LPSAFEARRAY FAR *ArrayData2)
  3. {
  4. // n est le rang de la matrice ArrayDAta1 et aussi de ArrayData2 !
  5. // renvoie 1 si inversible, 0 sinon
  6.             // ArrayData1 est la matrice a inverser, ArrayData est le resultat
  7. /*****************************************************************************************
  8. ******************************************************************************************
  9. ************************** O) Initialisation des Variables *******************************
  10. ******************************************************************************************
  11. ******************************************************************************************/
  12. /*long   a[DIM+1][DIM+1]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};    // dimension n x n
  13. double b[DIM+1][DIM+1]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};*/ // dimension n x n
  14. double   a[DIM+1][DIM+1]= {0};    // dimension n x n
  15. double b[DIM+1][DIM+1]= {0}; // dimension n x n
  16. double c[(DIM+1) * (DIM+1)] = {0}; // dimension n^2
  17. double t[DIM+1][2*DIM+1];  // dimension n x 2*n-1
  18. int n = DIM;
  19. /*****************************************************************************************
  20. ******************************************************************************************
  21. ****************************** I) Get The Tableau! ***************************************
  22. ******************************************************************************************
  23. ******************************************************************************************/
  24. long rgIndices[2] = {0,0};
  25. double element = 0;
  26. int u, v;
  27. int w = 0;
  28. for (v = 0; v < n+1; v++)
  29. {
  30.  for (u = 0; u < n+1; u++)
  31.  {
  32.   rgIndices[0] = u;
  33.   rgIndices[1] = v;
  34.   SafeArrayGetElement (*ArrayData1, rgIndices, &element);
  35.   c[w] = element;
  36.   w = w + 1;
  37.  }
  38. }
  39. w= 0;
  40. for (v = 0; v < n+1; v++)
  41. {
  42.  for (u = 0; u < n+1; u++)
  43.  {
  44.   a[u][v] = c[w];
  45.   w = w + 1;
  46.  }
  47. }
  48. /* // On test!
  49. ofstream fout("dict.txt",ios::app);  
  50.   for (v = 0; v < 16; v++)
  51.  {
  52.    fout << "\n"  << "c[";
  53.    fout << v;
  54.    fout <<"] := ";
  55.    fout << c[v];
  56.   }
  57. for (u = 0; u < 3+1; u++)
  58. {
  59.   for (v = 0; v < 3+1; v++)
  60.  {
  61.    fout << "\n"  << "a[";
  62.    fout << u;
  63.    fout << "],[";
  64.    fout << v;
  65.    fout <<"] := ";
  66.    fout << a[u][v];
  67.   }
  68. }/*
  69. /*****************************************************************************************
  70. ******************************************************************************************
  71. **************************** II) Inverse la Bête! ****************************************
  72. ******************************************************************************************
  73. ******************************************************************************************/
  74.     int i,j,k,l;
  75.     float max,pivot,coef;
  76. for(i=1;i<=n;i++)
  77.   for(j=1;j<=n;j++)
  78.    {
  79.     t[i][j]=a[i][j];
  80.     if (i==j) t[i][j+n]=1.0;else t[i][j+n]=0.0;
  81.    }
  82.  int err=1;
  83.  k=1;
  84.  while (err==1 && k<=n)
  85.  {
  86.   max = fabs(t[k][k]);
  87.    l=k;
  88.    for(i=k+1;i<=n;i++)
  89.     if(max<fabs(t[i][k]))
  90.     {
  91.      max = fabs(t[i][k]);
  92.      l=i;
  93.     }
  94.    if(max!=0)
  95.    {
  96.      for(j=k;j<=2*n;j++)
  97.      {
  98.    max=t[k][j];
  99.    t[k][j]=t[l][j];
  100.    t[l][j]=max;
  101.      }
  102.      pivot=t[k][k];
  103.      for(j=k+1;j<=2*n;j++)
  104.      {
  105.     t[k][j] /= pivot;
  106.      }
  107.   
  108.      for(i=1;i<=n;i++)
  109.      {
  110.       if(i!=k)
  111.       {
  112.     coef=t[i][k];
  113.     for(j=k+1;j<=2*n;j++)
  114.     t[i][j] -= coef*t[k][j];
  115.       }
  116.      }
  117.    }
  118.    else err=0;
  119.    k++;
  120.  }
  121. for(i=1;i<=n;i++)
  122.  {
  123.    for(j=1;j<=n;j++)
  124.    {
  125.    b[i][j]=t[i][j+n];
  126.    }
  127.  }
  128. /*     // On test encore!
  129.  ofstream fout("dict.txt",ios::app);  
  130.  for (u = 1; u < n+1; u++)
  131.  {
  132.    for (v = 1; v < n+1; v++)
  133.   {
  134.     fout << "\n"  << "b[";
  135.     fout << u;
  136.     fout << "],[";
  137.     fout << v;
  138.     fout <<"] := ";
  139.     fout << b[u][v];
  140.    }
  141.  }*/
  142. /*****************************************************************************************
  143. ******************************************************************************************
  144. ********************* III) Retourne le resultat dans ArrayData2 **************************
  145. ******************************************************************************************
  146. ******************************************************************************************/
  147. for (v = 0; v < n+1; v++)
  148. {
  149.  for (u = 0; u < n+1; u++)
  150.  {
  151.   rgIndices[0] = u;
  152.   rgIndices[1] = v;
  153.   element = b[u][v];
  154.   SafeArrayPutElement (*ArrayData2, rgIndices, &element);
  155.   w = w + 1;
  156.  }
  157. }
  158. return(err);
  159. }


 
Appel en VBA:

Code :
  1. Declare Function MatriceInv Lib "C:\misc\Test3.dll" (integerArrayA() As Double, integerArrayB() As Double) As Long
  2. Sub test1()
  3.     Dim a() As Double
  4.     Dim b() As Double
  5.     ReDim a(1 To 38, 1 To 38) As Double
  6.     ReDim b(1 To 38, 1 To 38) As Double
  7. '''''''''''''''''''''''''''''''''''''''''''''''''''''
  8.         For u = 1 To 38
  9.             For v = 1 To 38
  10.                 b(u, v) = 0
  11.             Next
  12.         Next
  13. '''''''''''''''''''''''''''''''''''''''''''''''''''''
  14.                 a(1, 1) = 36
  15.                   *
  16.                   *
  17.                   *
  18.                 a(38, 38) = 225
  19. '''''''''''''''''''''''''''''''''''''''''''''''''''''
  20. tt = MatriceInv(a(), b())
  21. ' l inverse de a() est b()!
  22. End Sub

mood
Publicité
Posté le 16-12-2005 à 11:48:03  profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Inverser une matrice / DLL utilisee depuis VBA

 

Sujets relatifs
Réception d'un mail en VBA[VBA] maitlo et bouton/userform
[VBA] While et VlookupDebogage de DLL sous XP (c++ builder 5)
[VBA] utiliser une variable dont le nom est dans une variable[VBA Excel] Bloquer les barres de défilement à la fin d'un tableau
[c++] DLL fichier de logsEcriture de formule via VBA
Fermer Acrobat reader automatiquement [VBA]Aide sur Projet VBA Excel
Plus de sujets relatifs à : Inverser une matrice / DLL utilisee depuis VBA


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR