Zufallsstromtheorie und FOREX - Seite 40

 
Prival >> :

Bitte machen Sie die Transponierungsprozedur, ich kann es nicht in MQL machen. Hier ist ein Beispiel in Matcad. Eine Bedingung ist, dass die Dimensionen m und n nicht vorher bekannt sind und die Funktion sollte vorzugsweise invers sein, d.h. es ist egal, welches Array transponiert werden soll, natürlich sollte sie mehrfach aufgerufen werden und korrekt funktionieren.

Versuchen Sie es:



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

Nein, die Matrizen A und B müssen transponiert werden, aber Sie haben zwei weitere Matrizen AT und BT erzeugt, d. h. Sie haben nicht transponiert, sondern Matrizen gebildet, die in Bezug auf die ursprüngliche Matrix transponiert sind

 

Ich sehe da keinen Unterschied. Mehr hinzufügen:


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

und erhalten das Ergebnis der Transponierung in den ursprünglichen Matrizen.


Allerdings würde ich AT und BT nur verwenden, wenn ich transponierte Matrizen benötige, da sie in der Regel paarweise verwendet werden.

 
bstone писал(а) >>

Ich sehe da keinen Unterschied. Mehr hinzufügen:

und erhalten das Ergebnis der Transponierung in den ursprünglichen Matrizen.


Obwohl ich AT und BT nur dort verwenden würde, wo ich die Transpositionsmatrizen benötige, da sie in der Regel paarweise verwendet werden.

Danke für die Idee, Kopien von AT und BT anzufertigen und sie dort einzusetzen, wo ich sie brauche. Ich werde mit einem Bleistift prüfen, ob es möglich ist, aber ich fürchte nicht, da der Kalman-Filter iterativ ist und ein und dieselbe Matrix mehrmals transponiert wird, anstatt sie für jeden Tick zu multiplizieren.

Aber Ihre Umsetzung hat nicht funktioniert.

Sie haben es falsch gemacht - Matrix B und BT sind zweidimensional, d.h. ihr Rang ist 2, und Sie haben 1.

Insert Print("-------",ArrayDimension(BT)); die Antwort ist 1

d.h. Sie haben ein eindimensionales Array und Sie haben keine Zeilen mit Spalten vertauscht.

 
Prival >> :

d.h. Sie haben ein eindimensionales Array und Sie haben keine Zeilen mit Spalten vertauscht.

Ziehen Sie keine voreiligen Schlüsse - Arrays sind außen eindimensional, aber innen zweidimensional :)

 
bstone писал(а) >>

Ziehen Sie keine voreiligen Schlüsse - Arrays sind äußerlich eindimensional, aber innerlich zweidimensional :)

Verstehen Sie dann fliegt alle Matrix-Algebra, hier ist ein Bild wieder von matcad. Ich fahre mit meinem Beispiel fort.

und es gibt nicht nur die Multiplikation, sondern alle Arten von Operationen und ihre eigenen spezifischen Operationen, die nur in der Matrixalgebra vorkommen.

Wenn die Dimensionalität bei der Transposition verletzt wird, ist alles schlecht, sehr schlecht.

Es ist zwar auf den ersten Blick kein einfaches Problem, was da Zeilen und Spalten vertauscht, aber so auf den ersten Blick stellt es sich nicht heraus.

Ich weiß zwar, dass dieses Problem lösbar ist, aber bei MQL ist es die rechte Hand am linken Ohr, und Gott bewahre, dass ich es erreichen kann.

 
Prival >> :

Verstehen Sie dann fliegt alle Matrix-Algebra, hier ist ein Bild wieder von matcad. Ich fahre mit meinem Beispiel fort.


Im Privaten, glauben Sie mir, kenne ich mich mit Matrixalgebra sehr gut aus. Ich habe Ihnen die Lösung für Ihr Problem in Form von MQL4 angeboten. Es gibt einfach keine andere Lösung, da in MQL4 nur die erste Dimension dynamisch verwaltet werden kann.


Um eine vollständige Bibliothek von Matrixoperationen zu erhalten, müssen Sie Ihre aktuelle Version überarbeiten, um mit einer anderen Abstraktion für die Darstellung von Matrizen zu arbeiten. Konkret müssen Sie von zweidimensionalen Arrays zu linearen Arrays wechseln.


Denken Sie darüber nach, wie Matcad Matrizen speichert? Handelt es sich nicht um lineare Arrays? Oder glauben Sie, dass er sie auf zweidimensionalen Festplatten speichert? Seit Jahrhunderten werden mehrdimensionale Arrays linear im Speicher abgelegt, wobei die Daten auf zwei Arten verteilt werden: Zeile für Zeile oder Spalte für Spalte.


Wenn Sie eine 3x2-Matrix im Speicher haben (ein lineares Array), sieht sie, wenn sie Zeile für Zeile gestapelt wird, wie folgt aus: { a(1,1) a(1,2) a(2,1) a(2,2) a(3,1) a(3,2) }


Daher müssen alle Matrixoperationen diese Datenorganisation verwenden. Der Übergang von der zweidimensionalen zur linearen Indizierung im bestehenden Code wird kein Problem darstellen. Sie haben jedoch die volle Kontrolle über die dynamischen Matrixdimensionen.

 

Übrigens ist das Transponieren von rechteckigen Matrizen so, wie Sie es ursprünglich wollten (d. h. sofort in der ursprünglichen Matrix), nicht so trivial, wie es auf den ersten Blick scheint. In der Tat handelt es sich um ein komplexes Problem, für dessen Lösung es viele knifflige Algorithmen gibt. Die Programmiergötter haben seit 1950 versucht, dieses Problem effektiv zu lösen (minimale Anzahl von Permutationen, Cache-Lokalität, minimaler zusätzlicher Speicher usw.).


Machen Sie sich also nicht zu viele Vorwürfe, weil Sie das Problem nicht lösen konnten.

 
Prival >> :

Aber Ihre Umsetzung hat nicht funktioniert.

Sie haben das Falsche getan - Matrix B und BT sind zweidimensional, d.h. ihr Rang ist 2, und Sie haben 1.

Insert Print("-------",ArrayDimension(BT)); die Antwort ist 1

d.h. Sie haben ein eindimensionales Array und Sie haben keine Zeilen mit Spalten vertauscht.

Sind "Rang einer Matrix" und "Rang eines Arrays" identisch? Soweit ich mich erinnere, ist der Rang einer Matrix die höchste Ordnung ihrer Minoren... Aber was ist der "Rang eines Arrays"... ehrlich gesagt, ich weiß es nicht...

 
bstone писал(а) >>

Im Privaten, glauben Sie mir, habe ich ein sehr gutes Verständnis von Matrixalgebra. Ich habe Ihnen eine Lösung für Ihr Problem in Form von MQL4 angeboten. Eine andere Lösung gibt es nicht, da in MQL4 nur die erste Dimension dynamisch gesteuert werden kann.

Hier wird das Problem auf eine weitere Art und Weise gelöst, wenn man Arrays in und aus einer Prozedur übertragen kann, aber auch das ist in MQL4 nicht möglich. Ich habe einen Indikator auf der Grundlage des obigen Modells erstellt, alle Transpositionen, Matrixaufrufe, Matrixpotenzierung (SQRT(-1), aber ich konnte es nicht vermeiden) usw. losgeworden. Ich habe Kalman in MQL4 (2*2 Matrix) implementiert, aber ich habe mehr als 3 Monate damit verbracht. Und wenn ich mich jetzt entschließe, eine weitere Währung hinzuzufügen, geht alles wieder von vorne los. Und das ist ein riesiger Zeitfresser. Seit langem wähle ich eine Programmiersprache auf der Grundlage der Geschwindigkeit, mit der ich eine bestimmte Aufgabe bewältigen kann (und ich weiß über Speicher, Effizienz und Stack Bescheid, denn ich habe früher einmal in Assembler programmiert). Das Wichtigste ist die Zeit, sie ist der einzige Wert, den wir haben.

Ich werde auf MQL5 warten.