Aide à résoudre un problème d'importation d'une fonction depuis une dll - page 9

 

М... ouais... c'est une déception... avec la programmation C++ dans Bilder... Mec, encore beaucoup d'erreurs :'-(

:-) cette décomposition de svd m'a déjà pris tellement de temps, et il semble qu'il n'y ait pas de fin en vue.

Désolé pour la question immodeste, mais pourriez-vous faire le travail pour un tarif N-ième ?

Honnêtement, je suis fatigué de lutter contre ça... Je suis sur ce forum depuis le 2 septembre, et combien j'ai lutté avant cela... Oooh...

Bien sûr, j'étudierai le C++ à l'avenir, mais cela prendra du temps.

J'espère vraiment que vous pourrez m'aider.

 

C'est ce qu'était la fonction de transformation singulière de Klot :

à l'adresse https://www.mql5.com/ru/code/7359

>> void fastsingular( double X[],int n,int l,int s,double &Y[])

Je ne comprends pas bien quel genre de calculs vous voulez faire.

avec des matrices à 2 dimensions.

.

Essayez de décrire le problème.

Si cela a un sens pour moi, je vous aiderai.

.

J'ai besoin de voir étape par étape :

Remplissez une matrice 3 par 3 avec ceci, envoyez-la à cela,

nous devrions obtenir quelque chose.

Le passage à des matrices plus grandes est une question de technique.

 
Pardonnez ma question immodeste, mais seriez-vous en mesure de faire le travail pour un tarif N-ième ? <br / translate="no">

Bonne question :-).

 

OK, laissez-moi essayer d'expliquer...

Je regardais le code MQL de Klot. Au début, quand j'ai trouvé le lien, j'étais très heureux, mais après avoir compris le code et réfléchi à ce que je veux, je me suis rendu compte que ce n'est pas exactement ce que je veux...

C'est une recherche de nombres entiers basée sur la bissection. Après avoir lu quelques ouvrages, j'ai compris que cet algorithme est bon quand on ne trouve qu'une partie de toutes les valeurs propres possibles.

Mais si une matrice carrée est assez grande, disons 1000x1000, trouver toutes les valeurs propres par des bissections est inefficace et c'est là que le principe des algorithmes modernes de décomposition singulière entre en jeu - conduire une matrice à une forme bidiagonale suivie de sa diagonalisation par l'algorithme QR. C'est le texte que j'apporte du site http://alglib.sources.ru/. En outre, il y a la phrase suivante : Ce schéma simple est tout à fait opérationnel, mais il peut être amélioré afin d'augmenter considérablement la vitesse du programme. Le schéma de l'algorithme amélioré décrit ci-dessous est presque entièrement emprunté au paquet LAPACK (sous-routine xGESVD). Description complète de l'algorithme : http://alglib.sources.ru/matrixops/general/svd.php

C'est-à-dire que pour mes tâches, j'ai besoin d'un algorithme rapide, travaillant avec de grandes matrices de 1000x1000 ou même plus... et j'ai besoin exactement de TOUTES les valeurs singulières avec les vecteurs, c'est-à-dire une décomposition complète. C'est pourquoi j'ai choisi la bibliothèque http://alglib.sources.ru/. D'autant plus qu'il contient déjà du code C++ tout fait. Il y a un algorithme de 300 lignes, mais il est plus lent que le code de 3000 lignes. Au début, j'ai essayé d'apprendre à travailler avec les dll, afin de pouvoir compiler mes propres dll, mais ça n'a pas marché. J'ai ensuite essayé de le réécrire du C++ vers MQL, mais il m'a semblé également assez difficile de comprendre l'algorithme et de le traduire dans un autre langage. Après cela, j'ai décidé de revenir à dll par le biais du forum et de demander de l'aide aux professionnels, car cette version semble être plus universelle, vous ne trouvez pas ? De plus, si je comprends bien, MQL5 est sur le point de sortir. On ignore quelle sera la compatibilité avec MQL4. Par conséquent, il serait probablement préférable de mettre en œuvre l'idée par le biais d'une DLL. J'aimerais connaître votre avis sur cette question.

Puisque la dimensionnalité de la matrice carrée sera inconnue à l'entrée, je suggère que la matrice à 2 dimensions soit implémentée comme une matrice à une dimension, et une fois la dimensionnalité connue, utiliser la fonction ArrayResize pour la remplir. Et ce serait l'entrée. Il est ensuite converti en ap::real_2d_array pour être entré dans rmatrixsvd. Il y a une méthode :

void setbounds(int iLow1, int iHigh1, int iLow2, int iHigh2)
Allocation de la mémoire pour le tableau. Cela supprime le contenu de l'ancien tableau et libère la mémoire qui lui était allouée, puis alloue une nouvelle zone de mémoire séparée de la taille des éléments (iHigh1-iLow1+1)*(iHigh2-iLow2+1).
La numérotation des éléments dans le nouveau tableau pour la première dimension commence par iLow1 et se termine par iHigh1, de même pour la deuxième dimension.
Le contenu du nouveau tableau est indéfini.

C'est une méthode très pratique, à mon avis, lorsque la taille du tableau n'est pas connue à l'avance par la 1ère ou la 2ème dimension.

Ensuite, il faut calculer la fonction rmatrixsvd elle-même qui produit et donne les nombres singuliers et les vecteurs singuliers dans des matrices bidimensionnelles, qui sont également convertis en matrices unidimensionnelles et déjà exportés dans MQL pour un traitement ultérieur.

Cela semble être tout. Je pense que je n'ai rien oublié.

 

C'est clair, vous voulez vraiment travailler avec une variante complexe.

.

Vous avez dit que vous avez un cas de test.

Dans lequel vous devez remplir une matrice de 3 par 3.

Et vous connaissez le résultat.

.

Maintenant, vous allez me dire ce qui est censé aller

à la fonction rmatrixsvd, et ce qu'elle doit produire.

.

Je veux des chiffres précis.

 

Exemples

Bien qu'il soit probablement préférable d'utiliser le deuxième exemple pour vérifier. Dans la première, les numéros d'identification sont comptés. Mais en principe, logiquement, si on y place une matrice 3x3, on devrait obtenir des racines de nombres entiers sur la diagonale, c'est-à-dire des valeurs singulières, dans l'ordre décroissant

Dossiers :
jgdwni.rar  18 kb
 

Vous pourriez, en principe, chercher d'autres exemples pour vérifier... Si ces exemples ne vous satisfont pas, je chercherai d'autres exemples. Pour que nous soyons sûrs que l'algorithme fonctionne correctement...

 

D'après la description de svd.cpp :

Paramètres de sortie :
W - contient des valeurs singulières classées par ordre décroissant.
U - si UNeeded=0, ne change pas. Vecteurs singuliers de gauche
ne sont pas calculés.
si UNeeded=1, contient les vecteurs singuliers de gauche (le premier
min(M,N) colonnes de la matrice U). Un tableau avec des éléments numérotés
[0..M-1, 0..Min(M,N)-1].
si UNeed=2, contient la matrice complète U. Un tableau avec des éléments numérotés [0.
Tableau numéroté d'éléments [0..M-1, 0..M-1].
VT - si VTNeed=0, il n'est pas modifié. Les vecteurs singuliers de droite
ne sont pas calculés.
si VTNeeded=1, il contient les vecteurs singuliers de droite
(les premières min(M,N) lignes de la matrice V^T). Le tableau avec la numérotation
d'éléments [0...min(M,N)-1, 0...N-1].
si VTNeeded=2, contient la matrice complète V^T. Tableau avec
en numérotant les éléments [0..N-1, 0..N-1].

 
Vous regardez tous les matériaux, les descriptions, les codes... l'étendue du travail... et à quel prix vous allez finir par fixer votre travail et nous en discuterons avec vous. J'aimerais alors obtenir le code source en plus de la dll finie et fonctionnelle...
 
J'ai de grands espoirs pour vous !