Hilfe bei der Lösung eines Problems beim Importieren einer Funktion aus einer DLL - Seite 9

 

М... Ja... Das ist ein Jammer... mit C++ Programmierung in Bildern... Mann, schon wieder so viele Fehler :'-(

:-) diese svd-Zerlegung hat mich schon so viel Zeit gekostet, und es sieht so aus, als ob kein Ende in Sicht ist.

Entschuldigen Sie die unbescheidene Frage, aber könnten Sie den Job für ein N-faches Honorar erledigen?

Ehrlich gesagt, bin ich es leid, dagegen anzukämpfen... Ich bin seit dem 2. September in diesem Forum, und wie sehr ich mich davor abgemüht habe... Oooh...

Natürlich werde ich in Zukunft C++ studieren, aber das wird einige Zeit dauern.

Ich hoffe wirklich auf Ihre Hilfe.

 

Dies war die singuläre Transformationsfunktion von Klot:

unter https://www.mql5.com/ru/code/7359

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

Ich verstehe nicht ganz, was für Berechnungen Sie anstellen wollen

mit 2-dimensionalen Matrizen.

.

Versuchen Sie, das Problem zu beschreiben.

Wenn es für mich Sinn macht, werde ich Ihnen helfen.

.

Ich muss Schritt für Schritt sehen:

Füllen Sie eine 3-mal-3-Matrix aus und schicken Sie sie dorthin,

sollten wir etwas bekommen.

Der Übergang zu größeren Matrizen ist eine Frage der Technik.

 
Entschuldigen Sie die unbescheidene Frage, aber wären Sie in der Lage, die Arbeit für eine N-te Gebühr zu erledigen? <br / translate="no">

Gute Frage :-).

 

OK, lassen Sie mich versuchen, es zu erklären...

Ich habe mir den MQL-Code von klot angesehen. Zuerst, als ich den Link fand, war ich sehr glücklich, aber nachdem ich den Code verstanden und darüber nachgedacht hatte, was ich will, wurde mir klar, dass es nicht genau das ist, was ich will...

Es handelt sich um eine auf der Halbierung basierende Suche nach Eigennumern. Nachdem ich etwas Literatur gelesen habe, habe ich verstanden, dass dieser Algorithmus gut ist, wenn wir nur einen Teil aller möglichen Eigenwerte finden.

Wenn eine quadratische Matrix jedoch recht groß ist, z. B. 1000x1000, ist es ineffizient, alle Eigenwerte durch Bisektionen zu finden. Hier kommt das Prinzip moderner Algorithmen der Singulärzerlegung ins Spiel, das eine Matrix in eine bidiagonale Form bringt, gefolgt von ihrer Diagonalisierung durch den QR-Algorithmus. Dies ist der Text, den ich von der Website http://alglib.sources.ru/ mitbringe . Außerdem gibt es folgenden Satz: Dieses einfache Schema ist durchaus funktionsfähig, aber es kann durch einen Zusatz verbessert werden, der die Geschwindigkeit des Programms merklich erhöht. Das Schema des im Folgenden beschriebenen verbesserten Algorithmus ist fast vollständig aus dem LAPACK-Paket entlehnt (Unterprogramm xGESVD). Vollständige Beschreibung des Algorithmus: http://alglib.sources.ru/matrixops/general/svd.php

Das heißt, für meine Aufgaben brauche ich einen schnellen Algorithmus, der mit großen Matrizen von 1000x1000 oder sogar mehr arbeitet... und ich brauche genau ALLE Singulärwerte zusammen mit Vektoren, d.h. eine vollständige Zerlegung. Deshalb habe ich mich für die Bibliothek http://alglib.sources.ru/ entschieden. Vor allem, da es bereits vorgefertigten C++-Code enthält. Es gibt einen 300-Zeilen-Algorithmus, der aber langsamer ist als der 3000-Zeilen-Code. Zuerst habe ich versucht zu lernen, wie man mit dll arbeitet, damit ich später meine eigene dll kompilieren kann, aber es hat nicht funktioniert. Dann habe ich versucht, es von C++ in MQL umzuschreiben, aber es schien mir auch ziemlich schwierig zu sein, den Algorithmus herauszufinden und ihn in eine andere Sprache zu übersetzen. Danach habe ich beschlossen, wieder zu dll durch das Forum zu gehen und um Hilfe von den Fachleuten zu bitten, denn diese Version scheint universeller zu sein, meinen Sie nicht auch? Außerdem wird, soweit ich weiß, MQL5 in Kürze veröffentlicht werden. Es ist nicht bekannt, wie die Kompatibilität mit MQL4 aussehen wird. Daher wäre es wahrscheinlich besser, die Idee durch eine DLL umzusetzen. Ich würde gerne Ihre Meinung zu diesem Thema erfahren.

Da die Dimensionalität der quadratischen Matrix bei der Eingabe nicht bekannt ist, schlage ich vor, die zweidimensionale Matrix als eindimensionale Matrix zu implementieren und, sobald die Dimensionalität bekannt ist, die Funktion ArrayResize zu verwenden, um sie auszufüllen. Und das wäre dann der Input. Dann wird es in ap::real_2d_array umgewandelt und in rmatrixsvd eingegeben. Das hat Methode:

void setbounds(int iLow1, int iHigh1, int iLow2, int iHigh2)
Zuweisung von Speicher für das Array. Dies entfernt den alten Array-Inhalt und gibt den dafür reservierten Speicher frei. Anschließend wird ein neuer, separater Speicherbereich mit der Größe von (iHigh1-iLow1+1)*(iHigh2-iLow2+1) Elementen reserviert.
Die Nummerierung der Elemente im neuen Array für die erste Dimension beginnt mit iLow1 und endet mit iHigh1, ebenso für die zweite Dimension.
Der Inhalt des neuen Arrays ist undefiniert.

D.h., es ist meiner Meinung nach eine sehr bequeme Methode, wenn die Größe des Arrays weder in der ersten noch in der zweiten Dimension im Voraus bekannt ist.

Dann sollte die Funktion rmatrixsvd selbst berechnet werden, die Singulärzahlen und Singulärvektoren in 2-dimensionalen Matrizen ausgibt und liefert, die auch in eindimensionale Matrizen umgewandelt und bereits in MQL zur weiteren Verarbeitung exportiert werden.

Das scheint alles zu sein. Ich glaube, ich habe nichts vergessen.

 

Es ist klar, dass Sie wirklich mit einer komplexen Variante arbeiten wollen.

.

Sie sagten, dass Sie einen Testfall haben.

Hier müssen Sie eine 3 x 3 Matrix ausfüllen.

Und Sie kennen das Ergebnis.

.

Jetzt werden Sie mir sagen, was ich tun soll.

an die Funktion rmatrixsvd, und was sie ausgeben soll.

.

Ich möchte konkrete Zahlen.

 

Beispiele

Obwohl es wahrscheinlich besser ist, das zweite Beispiel zur Überprüfung heranzuziehen. In der ersten werden die Eigennummers gezählt. Aber im Prinzip, logischerweise, wenn wir dort eine 3x3-Matrix einsetzen, sollten wir Wurzeln von Eigenzahlen auf der Diagonale, d.h. Singulärwerte, in absteigender Reihenfolge erhalten

Dateien:
jgdwni.rar  18 kb
 

Sie könnten im Prinzip nach anderen Beispielen suchen, um sie zu überprüfen... Wenn Ihnen diese Beispiele nicht genügen, werde ich nach anderen Beispielen suchen. Damit wir sicher sein können, dass der Algorithmus richtig funktioniert...

 

Aus der Beschreibung von svd.cpp:

Ausgabeparameter:
W - enthält singuläre Werte in absteigender Reihenfolge.
U - wenn UNeeded=0, wird nicht geändert. Linke singuläre Vektoren
werden nicht berechnet.
wenn UNeeded=1, enthält linke singuläre Vektoren (die erste
min(M,N) Spalten der Matrix U). Ein Array mit nummerierten Elementen
[0...M-1, 0...Min(M,N)-1].
wenn UNeeded=2, enthält die vollständige Matrix U. Ein Array mit nummerierten Elementen [0.
Nummerierte Anordnung von Elementen [0..M-1, 0..M-1].
VT - wenn VTNeeded=0, wird er nicht geändert. Die rechten singulären Vektoren
werden nicht berechnet.
wenn VTNeeded=1, enthält er die rechten Singularvektoren
(die ersten min(M,N) Zeilen der Matrix V^T). Das Array mit Nummerierung
der Elemente [0...min(M,N)-1, 0...N-1].
wenn VTNeeded=2, enthält die vollständige Matrix V^T. Array mit
durch Nummerierung der Elemente [0..N-1, 0..N-1].

 
Sie sehen sich alle Materialien, Beschreibungen, Codes... der Umfang der Arbeit... und wie hoch der Preis für Ihre Arbeit sein wird, und wir werden ihn mit Ihnen besprechen. Ich würde dann gerne den Quellcode zusätzlich zu der fertigen, funktionierenden dll bekommen...
 
Ich setze große Hoffnungen in Sie!
Grund der Beschwerde: