Teoría de los flujos aleatorios y FOREX - página 40

 
Prival >> :

Por favor, haga el procedimiento de transposición, no puedo hacerlo en MQL. Aquí hay un ejemplo en matcad. Una condición es que las dimensiones m y n no se conozcan de antemano y que la función sea preferiblemente inversa, es decir, que no importe el array a transponer, por supuesto que se llame varias veces y funcione correctamente.

Pruébalo:



void transposeMatrix( int rows, int cols, double a[], double & t[] )
{
    for( int i = 0; i < rows; i++ )
    {
        for( int j = 0; j < cols; j++ )
        {
            t[ j * rows + i ] = a[ i * cols + j ];
        }
    }
}

void example()
{
    int m = 5;
    int n = 3;

    int aRows = m + 1;
    int aCols = 1;
    double A[];

    ArrayResize( A, aRows * aCols );

    for( int i = 0; i <= m; i++ ) A[ i ] = i;

    int bRows = m + 1;
    int bCols = n + 1;
    double B[];

    ArrayResize( B, bRows * bCols );

    for( i = 0; i <= m; i++ )
    {
        for( int j = 0; j <= n; j++ ) B[ i * bCols + j ] = i + j;
    }

    // Получаем результат транспонирования A в AT

    double AT[];
    ArrayResize( AT, aRows * aCols );

    transposeMatrix( aRows, aCols, A, AT );

    // Получаем результат транспонирования B в BT

    double BT[];
    ArrayResize( BT, bRows * bCols );

    transposeMatrix( bRows, bCols, B, BT );
}
 

No, la matriz A y B deben estar transpuestas, pero has generado dos matrices más AT y BT, es decir, no has transpuesto, sino que has hecho matrices que están transpuestas respecto a la matriz original

 

No veo ninguna diferencia. Añade más:


ArrayCopy( A, AT );
ArrayCopy( B, BT );

si es necesario, y obtener el resultado de la transposición en las matrices originales.


Aunque yo sólo utilizaría AT y BT cuando necesite matrices transpuestas, ya que suelen ir por parejas.

 
bstone писал(а) >>

No veo ninguna diferencia. Añade más:

si es necesario, y obtener el resultado de la transposición en las matrices originales.


Aunque yo sólo utilizaría AT y BT cuando necesite las matrices de transposición, ya que suelen ir por parejas.

Gracias por la idea de hacer copias de AT y BT y utilizarlas donde las necesite. Comprobaré con un lápiz si se puede hacer, pero me temo que no, ya que el filtro de Kalman es iterativo, y una misma matriz se transpone varias veces, para no multiplicarlas en cada tic.

Pero su transposición no funcionó.

Lo has hecho mal: las matrices B y BT son bidimensionales, es decir, su rango = 2, y tú tienes 1.

Insert Print("-------",ArrayDimension(BT)); la respuesta es 1

es decir, tienes un array unidimensional y no has intercambiado ninguna fila con columnas.

 
Prival >> :

es decir, tienes un array unidimensional y no has intercambiado ninguna fila con columnas.

No saques conclusiones precipitadas: las matrices son unidimensionales por fuera, pero bidimensionales por dentro :)

 
bstone писал(а) >>

No saques conclusiones precipitadas: las matrices son unidimensionales por fuera pero bidimensionales por dentro :)

Entender entonces vuela todo el álgebra matricial, aquí hay una imagen de nuevo de matcad. Siguiendo con mi ejemplo.

y no sólo hay multiplicación, sino todo tipo de operaciones + las propias específicas del álgebra matricial.

Si se viola la dimensionalidad durante la transposición, todo va mal, muy mal.

No es un problema simple, aunque a primera vista, lo que hay filas y columnas para intercambiar lugares, pero aquí por lo que a simple vista no resulta.

Aunque sé con certeza que este problema es solucionable, pero en MQL es la mano derecha en la oreja izquierda, y Dios me libre de alcanzarla.

 
Prival >> :

Entender entonces vuela todo el álgebra de la matriz, aquí es una imagen de nuevo de matcad. Siguiendo con mi ejemplo.


En privado, créeme, estoy muy versado en álgebra matricial. Te he ofrecido la solución de tu problema en términos de MQL4. Sencillamente, no hay otra solución, ya que en MQL4 sólo se puede gestionar dinámicamente la primera dimensión.


Para obtener una biblioteca completa de operaciones con matrices es necesario rehacer la versión actual para trabajar con una abstracción diferente para representar matrices. En concreto, hay que pasar de matrices bidimensionales a matrices lineales.


Piensa en cómo almacena Matcad las matrices. ¿No está en matrices lineales? ¿O crees que los almacena en discos duros bidimensionales? Durante siglos, las matrices multidimensionales se han almacenado en memoria de forma lineal, utilizando dos formas de distribuir los datos: línea a línea o columna a columna.


Si tienes una matriz de 3x2, en la memoria (una matriz lineal) cuando se apila línea por línea, se verá así: { a(1,1) a(1,2) a(2,1) a(2,2) a(3,1) a(3,2) }


Por lo tanto, todas las operaciones matriciales deben utilizar esta organización de datos. La transición de la indexación bidimensional a la lineal en el código existente no será un problema. Pero tendrá un control total sobre las dimensiones dinámicas de la matriz.

 

Por cierto, la operación de transponer matrices rectangulares en la forma en que se quería originalmente (es decir, inmediatamente en la matriz original) no es tan trivial como parece a primera vista. De hecho, es un problema complejo y hay muchos algoritmos complicados para resolverlo. Los dioses de la programación llevan desde 1950 tratando de resolverlo con eficacia (número mínimo de permutaciones, localización en caché, mínima memoria adicional, etc.).


Así que no te des demasiadas patadas por no ser capaz de resolverlo.

 
Prival >> :

Pero su transposición no funcionó.

Te has equivocado: las matrices B y BT son bidimensionales, es decir, su rango = 2, y tú tienes 1.

Insert Print("-------",ArrayDimension(BT)); la respuesta es 1

es decir, tienes un array unidimensional y no has intercambiado ninguna fila con columnas.

¿Son idénticos el "rango de una matriz" y el "rango de un array"? Por lo que recuerdo, el rango de una matriz es el mayor orden de sus menores... Pero qué es el "rango de un array"... francamente, no lo sé...

 
bstone писал(а) >>

En privado, créeme, entiendo muy bien el álgebra matricial. Te he ofrecido una solución a tu problema en términos de MQL4. No hay otra solución, ya que en MQL4 sólo se puede controlar dinámicamente la primera dimensión.

Aquí es donde se resuelve el problema de una forma más, si se pueden transferir arrays dentro y fuera de un procedimiento, pero MQL4 tampoco permite hacerlo. He creado un indicador basado en el modelo anterior, me he librado de todas las transposiciones, llamadas a la matriz, exponenciación de la matriz (SQRT(-1), pero no he podido evitarlo), etc. He implementado el Kalman en MQL4 (matriz de 2*2) pero he dedicado más de 3 meses a ello. Y ahora si decido añadir 1 moneda más, todo de nuevo. Y eso es una gran pérdida de tiempo. Hace tiempo que elijo un lenguaje de programación en función de la velocidad de realización de una tarea determinada (y sé lo que es la memoria, la eficiencia, la pila, hace tiempo programaba en ensamblador). Lo principal es el tiempo, es el único valor que tenemos.

Esperaré a MQL5.