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

 

Es ist genau so geworden, wie in der Dokumentation beschrieben!

Die Funktion rmatrixsvd ist "ehrlich"!

Die Frage, wie man es selbst überprüft, ist nicht mehr relevant - ich habe es überprüft, es funktioniert.

Die Prüfung besteht aus einem Vergleich der Quellmatrix

mit dem Produkt U x S x Vt.

.

Auch diagonale Matrizen wurden geprüft, alle möglichen Zeilengrößen 3...10 - Spaltengrößen 3...10.

Ich habe die Differenz zwischen der Originalmatrix und der rekonstruierten Matrix ziemlich streng geprüft:

double delta = arr(row, col) - usRvt(row, col);
if(delta > 0.00000000001) { throw "Bad everything"; }

Diese Bedingung hat bei mir nie funktioniert.

.

Schicken Sie mir eine Nachrichtin einer privaten Nachricht.

 

Toll!!!

Hat mir eine Nachrichtin meiner persönlichen E-Mailgeschickt.

 
boysn >> :

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


Wenn eine quadratische Matrix groß genug ist, z.B. 1000x1000, dann ist es ineffizient, alle Eigenwerte über Bisektionen zu finden, und hier kommt das Prinzip der modernen Singulärzerlegungsalgorithmen ins Spiel: die Matrix in eine bidiagonale Form zu reduzieren, gefolgt von einer 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 (Unterprogramm xGESVD) entlehnt. Eine vollständige Beschreibung des Algorithmus: http://alglib.sources.ru/matrixops/general/svd.php

D.h. 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. volle Expansion. 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 Algorithmus für 300 Zeilen Code, aber er ist langsamer als 3000 Zeilen Code.

Sind Sie sicher, dass Sie eine nicht-singuläre (nicht bedeutungslose) 1000x1000-Matrix haben werden?

https://ru.wikipedia.org/wiki/%D0%92%D1%8B%D1%80%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0

Der Punkt ist, dass reale, nicht zufällige Daten mit einer Million Stichproben, d.h. 1000x1000, oft und eindeutig eine lineare Abhängigkeit zwischen den Daten zeigen und die Matrix ihre Bedeutung verliert. Ich persönlich kenne mehrere echte mehrstufige Algorithmen, z. B. zur ganzzahligen Optimierung, bei denen eine so große Matrix speziell zur Lösung eines Problems erstellt wird, weil das Problem anders nicht gelöst werden kann, d. h. das Problem wird durch Erhöhung seiner Dimensionalität gelöst. Eine so große Matrix ist künstlich hergestellt, ihre Segmente stellen eigentlich verschiedene Varianten von Problemen dar, d.h. sie sind kaum linear abhängig.

Bevor Sie ein Programm erstellen, sollten Sie die Frage beantworten: Sind Sie sicher, dass Ihre 1000x1000 Matrix nicht entartet ist?

 
AlexEro писал(а) >>

Sind Sie sicher, dass Sie eine 1000x1000-Matrix haben werden, die nicht zu schmal ist (nicht bedeutungslos)?

https://ru.wikipedia.org/wiki/%D0%92%D1%8B%D1%80%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0

Der Punkt ist, dass reale, nicht zufällige Daten mit einer Million Stichproben, d.h. 1000x1000, oft und eindeutig eine lineare Beziehung zwischen Daten zeigen und die Matrix ihre Bedeutung verliert. Ich persönlich kenne mehrere echte mehrstufige Algorithmen, z. B. zur ganzzahligen Optimierung, bei denen eine so große Matrix speziell zur Lösung eines Problems erstellt wird, weil das Problem anders nicht gelöst werden kann, d. h. das Problem wird durch Erhöhung seiner Dimensionalität gelöst. Eine so große Matrix ist künstlich erzeugt; ihre Segmente stellen tatsächlich verschiedene Varianten von Problemen dar, d.h. sie sind kaum linear abhängig.

Bevor Sie ein Programm erstellen, sollten Sie die Frage beantworten: Sind Sie sicher, dass Ihre Matrix von 1000x1000 nicht entartet ist?

Mal sehen, wir werden sehen...

 
jartmailru писал(а) >>

Ich habe Ihnen eine Nachricht in einer privaten Nachricht geschickt.

Toll!!!

>>Ich habe Ihnen eine private Nachricht geschickt.

 

Die DLL kann nicht importiert werden. (((

In MS Visual C++ habe ich eine DLL geschrieben:

//MyDll.h

#define MY_EXPORT extern "C" __declspec ( dllexport )
MY_EXPORT int CALLBACK Return1();

//MyDll.cpp

MY_EXPORT int CALLBACK Return1() { return 1; }

//MyDll.def

LIBRARY "MyDll"

EXPORTE Rückkehr1 @1

Nach dem Kompilieren erhielt ich MyDll.dll und MyDll.lib.

Außerdem habe ich ein Mikroprogramm in C++ mit DLL geschrieben. MyDll.lib wurde in den Projekteinstellungen angegeben. Es funktioniert gut mit DLL.

Dann habe ich versucht, die DLL aus MT4 zu importieren, indem ich die Datei MyDll.dll in das Verzeichnis experts\libraries gelegt habe. Ich habe in der Dokumentation nichts über *.lib gefunden, also habe ich es dort nicht eingefügt.
//ImportDll.mqh (im Verzeichnis experts\include)
#import "MyDll.dll"

int Return1();

//ImportDll.mq4 (im Verzeichnis experts\indicators)
#include <ImportDll.mqh>
int init()

{

Print("Return1="+Return1();

return("0);
}

Beim Ausführen von ImportDll.ex4 heißt es: dll-Aufrufe sind nicht erlaubt; 'MyDll.dll' - 'Return1'
HELP .... Ich habe mir bereits das Gehirn gebrochen ((((((((((((((((((((((((( Mein ICQ: 573794562, E-Mail: AKalashnikov84@mail.ru


Grund der Beschwerde: