La théorie des flux aléatoires et le FOREX - page 40

 
Prival >> :

Veuillez faire la procédure de transposition, je ne peux pas le faire dans MQL. Voici un exemple en matcad. Une condition est que les dimensions m et n ne soient pas connues à l'avance et la fonction doit de préférence être inversée, c'est-à-dire que le tableau à transposer n'a pas d'importance. Bien sûr, elle doit pouvoir être appelée plusieurs fois et fonctionner correctement.

Essayez-le :



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 );
}
 

Non, les matrices A et B doivent être transposées, mais vous avez généré deux matrices supplémentaires AT et BT, c'est-à-dire que vous n'avez pas transposé, mais vous avez fait des matrices qui sont transposées par rapport à la matrice originale.

 

Je ne vois pas de différence. Ajouter plus :


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

si nécessaire, et obtenir le résultat de la transposition dans les matrices originales.


Mais je n'utiliserais AT et BT que lorsque j'ai besoin de matrices transposées, car elles ont tendance à aller par paires.

 
bstone писал(а) >>

Je ne vois pas de différence. Ajouter plus :

si nécessaire, et obtenir le résultat de la transposition dans les matrices originales.


Bien que j'utiliserais AT et BT uniquement lorsque j'ai besoin des matrices de transposition, car elles ont tendance à aller par paire.

Merci pour l'idée de faire des copies de AT et BT et de les utiliser là où j'en ai besoin. Je vais vérifier avec un crayon si c'est possible, mais je crains que non, car le filtre de Kalman est itératif, et une seule et même matrice est transposée plusieurs fois, sans les multiplier pour chaque tick.

Mais votre transposition n'a pas fonctionné.

Vous vous êtes trompé - les matrices B et BT sont bidimensionnelles, c'est-à-dire que leur rang = 2, et vous en avez 1.

Insérer Print("-------",ArrayDimension(BT)) ; la réponse est 1

c'est-à-dire que vous avez un tableau à une dimension et que vous n'avez pas échangé les lignes avec les colonnes.

 
Prival >> :

c'est-à-dire que vous avez un tableau unidimensionnel et que vous n'avez pas échangé les lignes avec les colonnes.

Ne tirez pas de conclusions hâtives - les tableaux sont unidimensionnels à l'extérieur, mais bidimensionnels à l'intérieur :)

 
bstone писал(а) >>

Ne tirez pas de conclusions hâtives - les tableaux sont unidimensionnels à l'extérieur mais bidimensionnels à l'intérieur :)

Comprendre alors vole toute l'algèbre matricielle, voici une image encore une fois de matcad. Je continue avec mon exemple.

et il n'y a pas que la multiplication, mais toutes sortes d'opérations + celles qui sont propres à l'algèbre matricielle.

Si la dimensionnalité est violée lors de la transposition, tout est mauvais, très mauvais.

Ce n'est pas un problème simple, bien qu'à première vue, ce qu'il y a des lignes et des colonnes pour échanger des places, mais ici si à un coup d'oeil il ne tourne pas.

Bien que je sois sûr que ce problème est soluble, mais dans MQL c'est la main droite sur l'oreille gauche, et Dieu interdit que je puisse l'atteindre.

 
Prival >> :

Comprendre alors vole toute l'algèbre matricielle, voici une image encore une fois de matcad. Je continue avec mon exemple.


Prival, croyez-moi, je connais très bien l'algèbre des matrices. Je vous ai proposé la solution de votre problème en termes de MQL4. Il n'y a tout simplement pas d'autre solution, puisque dans MQL4, seule la première dimension peut être gérée dynamiquement.


Afin d'obtenir une bibliothèque complète d'opérations matricielles, vous devez retravailler votre version actuelle pour travailler avec une abstraction différente pour représenter les matrices. Plus précisément, vous devez passer des tableaux bidimensionnels aux tableaux linéaires.


Pensez à la façon dont matcad stocke les matrices ? N'est-ce pas dans les tableaux linéaires ? Ou pensez-vous qu'il les stocke sur des disques durs bidimensionnels ? Pendant des siècles, les tableaux multidimensionnels ont été stockés en mémoire de manière linéaire, en utilisant deux manières de distribuer les données : ligne par ligne ou colonne par colonne.


Si vous avez une matrice 3x2, en mémoire (un tableau linéaire), lorsqu'elle est empilée ligne par ligne, elle ressemblera à ceci : { a(1,1) a(1,2) a(2,1) a(2,2) a(3,1) a(3,2) }


Par conséquent, toutes les opérations matricielles doivent utiliser cette organisation des données. Le passage d'une indexation bidimensionnelle à une indexation linéaire dans le code existant ne posera pas de problème. Mais vous aurez un contrôle total sur les dimensions dynamiques de la matrice.

 

Au fait, l'opération de transposition des matrices rectangulaires dans le sens que vous souhaitiez à l'origine (c'est-à-dire immédiatement dans le tableau d'origine) n'est pas aussi triviale qu'il n'y paraît à première vue. En fait, il s'agit d'un problème complexe et il existe de nombreux algorithmes délicats pour le résoudre. Les dieux de la programmation tentent de le résoudre efficacement (nombre minimum de permutations, cache-localité, minimum de mémoire supplémentaire, etc.) depuis 1950.


Ne vous en voulez donc pas trop de ne pas avoir réussi à le résoudre.

 
Prival >> :

Mais votre transposition n'a pas fonctionné.

Vous avez fait le mauvais choix - les matrices B et BT sont bidimensionnelles, c'est-à-dire que leur rang = 2, et vous en avez 1.

Insérer Print("-------",ArrayDimension(BT)) ; la réponse est 1

c'est-à-dire que vous avez un tableau à une dimension et que vous n'avez pas échangé les lignes avec les colonnes.

Le "rang d'une matrice" et le "rang d'un tableau" sont-ils identiques ? Autant que je me souvienne, le rang d'une matrice est l'ordre le plus élevé de ses mineurs... Mais qu'est-ce que le "rang d'un tableau"... franchement, je ne sais pas...

 
bstone писал(а) >>

Prival, croyez-moi, j'ai une très bonne compréhension de l'algèbre matricielle. Je vous ai proposé une solution à votre problème en termes de MQL4. Il n'y a pas d'autre solution, puisque dans MQL4, seule la première dimension peut être contrôlée dynamiquement.

C'est là que le problème est résolu d'une autre manière, si vous pouvez transférer des tableaux dans et hors d'une procédure, mais MQL4 ne permet pas de le faire non plus. J'ai créé un indicateur basé sur le modèle ci-dessus, je me suis débarrassé de toutes les transpositions, appels de matrice, exponentiation de matrice (SQRT(-1), mais je ne pouvais pas l'éviter), etc. J'ai implémenté Kalman dans MQL4 (matrice 2*2) mais j'ai passé plus de 3 mois dessus. Et maintenant, si je décide d'ajouter une devise supplémentaire, tout recommence. Et c'est une énorme perte de temps. Cela fait longtemps que je choisis un langage de programmation en fonction de la vitesse d'accomplissement d'une tâche donnée (et je connais la mémoire, l'efficacité, la pile, il fut un temps où je programmais en assembleur). L'essentiel est le temps, c'est la seule valeur que nous avons.

Je vais attendre le MQL5.