Ayuda para resolver un problema con la importación de una función desde una dll - página 10

 

Resultó exactamente como se describe en la documentación.

¡La función rmatrixsvd es "honesta"!

La cuestión de cómo comprobarlo en sí ya no es relevante: lo he comprobado y funciona.

En realidad, la comprobación consiste en comparar la matriz de origen

con el producto U x S x Vt.

.

También he comprobado las matrices diagonales, todos los tamaños de fila posibles 3...10 - tamaños de columna 3...10.

Puse un control bastante estricto de la diferencia entre la matriz original y la reconstruida:

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

Esta condición nunca me ha funcionado.

.

Envíame un mensajeprivado.

 

¡¡¡Grandioso!!!

Me envió un mensajea mi correo electrónico personal.

 
boysn >> :

Bien, déjame intentar explicarte...


Si una matriz cuadrada es lo suficientemente grande, digamos 1000x1000, encontrar todos los valores propios a través de bisecciones es ineficiente y aquí entra en juego el principio de los modernos algoritmos de descomposición singular: reducir la matriz a una forma bidiagonal seguida de la diagonalización mediante un algoritmo QR. Este es el texto que traigo del sitio http://alglib.sources.ru/. Además, está la siguiente frase: Este sencillo esquema es bastante operativo, pero se puede mejorar haciendo un añadido que aumentará notablemente la velocidad del programa. El esquema del algoritmo mejorado que se describe a continuación está tomado casi por completo del paquete LAPACK (subrutina xGESVD). Descripción completa del algoritmo: http://alglib.sources.ru/matrixops/general/svd.php

Es decir, para mis tareas necesito un algoritmo rápido, que trabaje con matrices grandes de 1000x1000 o incluso más... y necesito exactamente TODOS los valores singulares junto con los vectores, es decir, la expansión completa. Por eso me decidí por la biblioteca http://alglib.sources.ru/. Especialmente, porque ya hay un código C++ listo en él. Hay un algoritmo para 300 líneas de código, pero es más lento que 3000 líneas de código.

¿Estás seguro de que tendrás una matriz de 1000x1000 no sinular (no sin sentido)?

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

La cuestión es que los datos reales no aleatorios con un millón de muestras, es decir, 1000x1000, muestran a menudo y claramente una dependencia lineal entre los datos y la matriz pierde su significado. Personalmente, conozco varios algoritmos reales multietapa, por ejemplo, de optimización de enteros, en los que una matriz tan grande se crea específicamente para resolver un problema porque éste no puede resolverse de otra manera, es decir, el problema se resuelve aumentando su dimensionalidad. Una matriz tan grande está hecha artificialmente, sus segmentos representan en realidad diferentes variantes de problemas, es decir, apenas son linealmente dependientes.

Antes de hacer un programa, debes responder a la pregunta: ¿estás seguro de que tu matriz de 1000x1000 no es degenerada?

 
AlexEro писал(а) >>

¿Está seguro de que tendrá una matriz de 1000x1000 que no es estrecha (no sin sentido)?

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

La cuestión es que los datos reales no aleatorios con un millón de muestras, es decir, 1000x1000, muestran a menudo y claramente una relación lineal entre los datos y la matriz pierde su significado. Personalmente conozco varios algoritmos reales multietapa, por ejemplo, de optimización de enteros en los que se crea una matriz tan grande específicamente para resolver un problema porque éste no puede resolverse de otra manera, es decir, el problema se resuelve aumentando su dimensionalidad. Una matriz tan grande está hecha de forma artificial; sus segmentos representan en realidad diferentes variantes de problemas, es decir, apenas son linealmente dependientes.

Antes de hacer un programa, deberías responder a la pregunta: ¿estás seguro de que tu matriz de 1000x1000 no es degenerada?

Veamos, veremos...

 
jartmailru писал(а) >>

Te he enviado un mensaje privado.

¡¡¡Grandioso!!!

>>Te he enviado un mensaje privado.

 

No se puede importar la DLL. (((

En MS Visual C++ escribí una DLL:

//MyDll.h

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

//MyDll.cpp

MY_EXPORT int CALLBACK Retorno1() { devuelve 1; }

//MyDll.def

BIBLIOTECA "MyDll"

EXPORTACIONES Retorno1 @1

Después de compilar, obtuve MyDll.dll y MyDll.lib.

También escribí un micro-programa en C++ usando DLL. Se ha especificado MyDll.lib en la configuración del proyecto. Funciona bien con la DLL.

Entonces intenté importar la DLL de MT4 poniendo el archivo MyDll.dll en el directorio experts\libraries. No encontré nada sobre *.lib en la documentación, así que no lo puse.
//ImportDll.mqh (en el directorio experts\include)
#import "MyDll.dll"

int Return1();

//ImportDll.mq4 (en el directorio de expertos en indicadores)
#include <ImportDll.mqh>
int init()

{

Print("Retorno1="+Retorno1();

return("0);
}

Al ejecutar ImportDll.ex4 dice: las llamadas a dll no están permitidas; 'MyDll.dll' - 'Return1'
AYUDA .... Ya me rompí el cerebro ((((((((((((((((((((((((( Mi ICQ: 573794562, correo electrónico: AKalashnikov84@mail.ru


Razón de la queja: