Aiuto per risolvere un problema con l'importazione di una funzione da una dll - pagina 10
![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Si è rivelato esattamente come descritto nella documentazione!
La funzione rmatrixsvd è "onesta"!
La questione di come controllarlo non è più rilevante - l'ho controllato, funziona.
In realtà, il controllo consiste nel confrontare la matrice sorgente
con prodotto U x S x Vt.
.
Controllate anche le matrici diagonali, tutte le possibili dimensioni delle righe 3...10 - dimensioni delle colonne 3...10.
Ho messo un controllo piuttosto rigoroso sulla differenza tra la matrice originale e la matrice ricostruita:
double delta = arr(row, col) - usRvt(row, col);
if(delta > 0.00000000001) { throw "Bad everything"; }
Questa condizione non ha mai funzionato per me.
.
Miha mandato un messaggio in un messaggioprivato.
Grande!!!
Ti ho inviato un messaggio in un messaggioprivato.
OK, lasciatemi provare a spiegare...
Se una matrice quadrata è abbastanza grande, diciamo 1000x1000, allora trovare tutti gli autovalori tramite le bise è inefficiente e qui entra in gioco il principio dei moderni algoritmi di decomposizione singolare: ridurre la matrice a una forma bidiagonale seguita dalla diagonalizzazione tramite l'algoritmo QR. Questo è il testo che porto dal sito http://alglib.sources.ru/. Inoltre c'è la seguente frase: Questo semplice schema è abbastanza operativo, ma può essere migliorato facendo un'aggiunta che aumenterà notevolmente la velocità del programma. Lo schema dell'algoritmo migliorato descritto di seguito è quasi completamente preso in prestito dal pacchetto LAPACK (subroutine xGESVD). Una descrizione completa dell'algoritmo: http://alglib.sources.ru/matrixops/general/svd.php
Cioè per i miei compiti ho bisogno di un algoritmo veloce, che lavori con grandi matrici di 1000x1000 o anche più... e ho bisogno esattamente di TUTTI i valori singolari insieme ai vettori, cioè l'espansione completa. Ecco perché ho scelto la libreria http://alglib.sources.ru/. Soprattutto, visto che c'è già del codice C++ già pronto. C'è un algoritmo per 300 linee di codice, ma è più lento di 3000 linee di codice.
Siete sicuri di avere una matrice 1000x1000 non singolare (non senza significato)?
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
Il punto è che i dati reali non casuali con un milione di campioni, cioè 1000x1000, mostrano spesso e chiaramente una dipendenza lineare tra i dati e la matrice perde il suo significato. Conosco personalmente diversi algoritmi reali multistadio, per esempio, di ottimizzazione degli interi in cui una matrice così grande viene creata appositamente per risolvere un problema perché il problema non può essere risolto altrimenti, cioè il problema viene risolto aumentando la sua dimensionalità. Una matrice così grande è fatta artificialmente; i suoi segmenti rappresentano effettivamente diverse varianti di problemi, cioè non sono quasi linearmente dipendenti.
Prima di fare un programma, dovresti rispondere alla domanda: sei sicuro che la tua matrice 1000x1000 non sia degenerata?
Siete sicuri di avere una matrice 1000x1000 che non sia stretta (non senza senso)?
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
Il punto è che i dati reali non casuali con un milione di campioni, cioè 1000x1000, mostrano spesso e chiaramente una relazione lineare tra i dati e la matrice diventa senza senso. Conosco personalmente diversi algoritmi reali multistadio, per esempio, di ottimizzazione degli interi dove una matrice così grande viene creata appositamente per risolvere un problema perché il problema non può essere risolto altrimenti, cioè il problema viene risolto aumentando la sua dimensionalità. Una matrice così grande è fatta artificialmente; i suoi segmenti rappresentano effettivamente diverse varianti di problemi, cioè non sono quasi linearmente dipendenti.
Prima di fare un programma, dovresti rispondere alla domanda: sei sicuro che la tua matrice di 1000x1000 non sia degenerata?
Vediamo, vedremo...
Ti ho inviato un messaggio in un messaggio privato.
Grande!!!
>>Ti ho mandato un messaggio privato.
Impossibile importare la DLL. (((
In MS Visual C++ ho scritto una DLL:
//MyDll.h
#define MY_EXPORT extern "C" __declspec ( dllexport )
MY_EXPORT int CALLBACK Return1();
//MyDll.cpp
MY_EXPORT int CALLBACK Return1() { restituisce 1; }
//MyDll.def
LIBRERIA "MyDll"
ESPORTAZIONI Ritorno1 @1
Dopo la compilazione, ho ottenuto MyDll.dll e MyDll.lib.
Ha anche scritto un micro-prog in C++ usando la DLL. MyDll.lib è stato specificato nelle impostazioni del progetto. Funziona bene con DLL.
Poi ho provato a importare la DLL da MT4 mettendo il file MyDll.dll nella directory experts\libraries. Non ho trovato nulla su *.lib nella documentazione, quindi non l'ho messo lì.
//ImportDll.mqh (nella directory experts\include)
#import "MyDll.dll"
int Return1();
//ImportDll.mq4 (nella directory experts\indicators)
#include <ImportDll.mqh>
int init()
{
Stampa("Return1="+Return1();
return("0);
}
Quando si esegue ImportDll.ex4 dice: le chiamate dll non sono permesse; 'MyDll.dll' - 'Return1'
HELP .... Mi sono già rotto il cervello ((((((((((((((((((((((((( Il mio ICQ: 573794562, e-mail: AKalashnikov84@mail.ru