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

 

М... Sí... eso es un fastidio... con la programación C++ en Bilder... Hombre, muchos errores de nuevo :'-(

:-) esta descomposición del svd me ha llevado mucho tiempo, y parece que no hay final a la vista.

Perdón por la pregunta inmodesta, pero ¿podría hacer el trabajo por una tarifa N-ésima?

Para ser honesto, me estoy cansando de luchar contra ella... Llevo en este foro desde el 2 de septiembre, y lo mucho que he luchado antes... Oooh...

Por supuesto, estudiaré C++ en el futuro, pero me llevará algún tiempo.

Realmente espero su ayuda.

 

Esto es lo que era la función de transformación singular de klot:

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

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

No entiendo muy bien qué tipo de cálculos quieres hacer

con matrices bidimensionales.

.

Intenta describir el problema.

Si tiene sentido para mí, te ayudaré.

.

Necesito ver el paso a paso:

Rellena una matriz de 3 por 3 con esto, envíalo a aquello,

deberíamos conseguir algo.

Pasar a matrices más grandes es una cuestión de técnica.

 
Perdone mi inmodesta pregunta, pero ¿podría hacer el trabajo por una tarifa N-ésima? <br / translate="no">

Buena pregunta :-).

 

Bien, déjame intentar explicarte...

Estaba mirando el código MQL de klot. Al principio, cuando encontré el enlace, me puse muy contento, pero después de entender el código y pensar en lo que quiero, me di cuenta de que no es exactamente lo que quiero...

Se basa en la bisección para encontrar los números adecuados. Después de leer algo de literatura, entendí que este algoritmo es bueno cuando sólo encontramos una parte de todos los posibles valores propios.

Pero si una matriz cuadrada es bastante grande, digamos, 1000x1000, encontrar todos los valores propios mediante bisecciones es ineficiente y aquí es donde entra en juego el principio de los algoritmos modernos de descomposición singular -llevar una matriz a una forma bidiagonal seguida de su diagonalización mediante el 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 operable, pero puede mejorarse para aumentar considerablemente 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 descomposició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 de 300 líneas, pero es más lento que el código de 3000 líneas. Al principio intenté aprender a trabajar con dll, para poder compilar mi propia dll, pero no funcionó. Luego intenté reescribirlo de C++ a MQL, pero también me pareció bastante difícil averiguar el algoritmo y traducirlo a otro lenguaje. Después de eso decidí volver a dll a través del foro y pedir ayuda a los profesionales, porque esta versión parece ser más universal, ¿no crees? Además, según tengo entendido, MQL5 está a punto de salir al mercado. Se desconoce cuál será la compatibilidad con MQL4. Por lo tanto, probablemente sería mejor aplicar la idea a través de una dll. Me gustaría conocer su opinión sobre este asunto.

Dado que la dimensionalidad de la matriz cuadrada será desconocida en la entrada, sugiero que la matriz bidimensional se implemente como una matriz unidimensional, y una vez conocida la dimensionalidad, utilizar la función ArrayResize para rellenarla. Y esa sería la entrada. Luego se convierte en ap::real_2d_array para introducirlo en rmatrixsvd. Ahí hay un método:

void setbounds(int iLow1, int iHigh1, int iLow2, int iHigh2)
Asignación de memoria para el array. Esto elimina el contenido de la antigua matriz y libera la memoria que fue asignada para ella, y luego asigna una nueva área de memoria separada en el tamaño de (iHigh1-iLow1+1)*(iHigh2-iLow2+1) elementos.
La numeración de los elementos en la nueva matriz para la primera dimensión comienza con iLow1 y termina con iHigh1, de forma similar para la segunda dimensión.
El contenido del nuevo array es indefinido.

En mi opinión, es un método muy conveniente cuando el tamaño del array no se conoce de antemano ni por la 1ª ni por la 2ª dimensión.

A continuación, se debe calcular la función rmatrixsvd en sí, que produce y da números singulares y vectores singulares en matrices de 2 dimensiones, que también se convierten en matrices unidimensionales y ya se exportan a MQL para su posterior procesamiento.

Eso parece ser todo. Creo que no he olvidado nada.

 

Está claro que quieres trabajar con una variante difícil.

.

Has dicho que tienes un caso de prueba.

En el que hay que rellenar una matriz de 3 por 3.

Y ya sabes el resultado.

.

Ahora me vas a decir lo que debe ir

a la función rmatrixsvd y lo que debe producir.

.

Quiero cifras concretas.

 

Ejemplos

Aunque probablemente sea mejor utilizar el segundo ejemplo para comprobarlo. En la primera, se cuentan los números de identificación. Pero, en principio, lógicamente, si ponemos ahí una matriz de 3x3, deberíamos obtener raíces de números de eigenes en la diagonal, es decir, valores singulares, en orden descendente

Archivos adjuntos:
jgdwni.rar  18 kb
 

En principio, podría buscar otros ejemplos para comprobar... Si estos ejemplos no te satisfacen, buscaré otros. Para saber con seguridad que el algoritmo funciona correctamente...

 

De la descripción de svd.cpp:

Parámetros de salida:
W - contiene valores singulares ordenados de forma descendente.
U - si UNeeded=0, no cambia. Vectores singulares izquierdos
no se calculan.
si UNeeded=1, contiene vectores singulares de la izquierda (el primer
min(M,N) columnas de la matriz U). Una matriz con elementos numerados
[0...M-1, 0...Min(M,N)-1].
si UNeeded=2, contiene la matriz completa U. Un array con elementos numerados [0.
Matriz numerada de elementos [0..M-1, 0..M-1].
VT - si VTNeeded=0, no se modifica. Los vectores singulares de la derecha
no se calculan.
si VTNeeded=1, contiene los vectores singulares derechos
(las primeras filas min(M,N) de la matriz V^T). La matriz con numeración
de elementos [0...min(M,N)-1, 0...N-1].
si VTNeeded=2, contiene la matriz completa V^T. Matriz con
numerando los elementos [0..N-1, 0..N-1].

 
Miras todos los materiales, descripciones, códigos... el alcance del trabajo... y el precio de su trabajo y lo discutiremos con usted. Me gustaría entonces obtener el código fuente además de la dll de trabajo terminada...
 
Tengo muchas esperanzas puestas en ti.
Razón de la queja: