Teoria del flusso casuale e FOREX - pagina 40

 
Prival >> :

Per favore fai la procedura di trasposizione, non posso farla in MQL. Ecco un esempio in matcad. Una condizione è che le dimensioni m e n non sono note in anticipo e la funzione dovrebbe essere preferibilmente inversale, cioè non importa quale array trasporre, ovviamente dovrebbe essere chiamata più volte e funzionare correttamente.

Provate:



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, le matrici A e B devono essere trasposte, ma avete generato altre due matrici AT e BT, cioè non avete trasposto, ma avete fatto matrici che sono trasposte rispetto alla matrice originale

 

Non vedo alcuna differenza. Aggiungere di più:


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

se necessario, e ottenere il risultato della trasposizione nelle matrici originali.


Anche se io userei solo AT e BT dove ho bisogno di matrici trasposte, dato che tendono ad andare in coppia.

 
bstone писал(а) >>

Non vedo alcuna differenza. Aggiungere di più:

se necessario, e ottenere il risultato della trasposizione nelle matrici originali.


Anche se io userei solo AT e BT dove ho bisogno delle matrici di trasposizione, dato che tendono ad andare in coppia.

Grazie per l'idea di fare delle copie di AT e BT e usarle dove ne ho bisogno. Controllerò con una matita se si può fare, ma temo di no, poiché il filtro Kalman è iterativo, e una stessa matrice viene trasposta più volte, non moltiplicata per ogni tick.

Ma la tua trasposizione non ha funzionato.

Hai sbagliato - le matrici B e BT sono bidimensionali, cioè il loro rango = 2, e tu ne hai 1.

Insert Print("-------",ArrayDimension(BT)); la risposta è 1

Cioè avete un array monodimensionale e non avete scambiato nessuna riga con le colonne.

 
Prival >> :

cioè avete un array unidimensionale e non avete scambiato nessuna riga con le colonne.

Non saltate alle conclusioni - gli array sono unidimensionali fuori, ma bidimensionali dentro :)

 
bstone писал(а) >>

Non saltate alle conclusioni - gli array sono unidimensionali all'esterno ma bidimensionali all'interno :)

Capire poi vola tutta l'algebra matriciale, ecco un'immagine ancora da matcad. Continuando con il mio esempio.

e non c'è solo la moltiplicazione, ma tutti i tipi di operazioni + le loro specifiche che sono uniche per l'algebra matriciale.

Se la dimensionalità è violata durante la trasposizione, tutto va male, molto male.

Non è un problema semplice, anche se a prima vista, quello che ci righe e colonne per scambiare i posti, ma qui così a colpo d'occhio non risulta.

Anche se so per certo che questo problema è risolvibile, ma in MQL è mano destra sull'orecchio sinistro, e Dio non voglia che io possa raggiungerlo.

 
Prival >> :

Capire poi vola tutta l'algebra matriciale, ecco un'immagine ancora da matcad. Continuando con il mio esempio.


Prival, mi creda, sono molto ferrato in algebra matriciale. Ti ho offerto la soluzione del tuo problema in termini di MQL4. Semplicemente non c'è altra soluzione, poiché in MQL4, solo la prima dimensione può essere gestita dinamicamente.


Per ottenere una libreria completa di operazioni matriciali devi rielaborare la tua versione attuale per lavorare con una diversa astrazione per rappresentare le matrici. In particolare, è necessario passare dagli array bidimensionali agli array lineari.


Pensate a come matcad memorizza le matrici? Non è in matrici lineari? O pensate che li memorizzi su dischi rigidi bidimensionali? Per secoli, gli array multidimensionali sono stati immagazzinati in memoria in modo lineare, usando due modi di distribuire i dati: riga per riga o colonna per colonna.


Se avete una matrice 3x2, in memoria (una matrice lineare) quando è impilata riga per riga, apparirà così: { a(1,1) a(1,2) a(2,1) a(2,2) a(3,1) a(3,2) }


Pertanto, tutte le operazioni di matrice devono utilizzare questa organizzazione dei dati. La transizione dall'indicizzazione bidimensionale a quella lineare nel codice esistente non sarà un problema. Ma avrete il pieno controllo sulle dimensioni dinamiche della matrice.

 

A proposito, l'operazione di trasposizione di matrici rettangolari nel modo in cui la volevate all'inizio (cioè immediatamente nell'array originale) non è così banale come sembra a prima vista. In effetti, è un problema complesso e ci sono molti algoritmi complicati per risolverlo. Gli dei della programmazione cercano di risolverlo efficacemente (numero minimo di permutazioni, cache-località, minima memoria aggiuntiva, ecc.) dal 1950.


Quindi non prendetevi troppo a calci per non essere stati in grado di risolverlo.

 
Prival >> :

Ma la tua trasposizione non ha funzionato.

Hai fatto la cosa sbagliata - le matrici B e BT sono bidimensionali, cioè il loro rango = 2, e tu ne hai 1.

Insert Print("-------",ArrayDimension(BT)); la risposta è 1

Cioè avete un array monodimensionale e non avete scambiato nessuna riga con le colonne.

Il "grado di una matrice" e il "grado di una matrice" sono identici? Per quanto mi ricordo, il rango di una matrice è l'ordine più alto dei suoi minori... Ma cos'è il "rango di un array"... francamente, non lo so...

 
bstone писал(а) >>

Prival, mi creda, ho un'ottima comprensione dell'algebra delle matrici. Ti ho offerto una soluzione al tuo problema in termini di MQL4. Non c'è altra soluzione, poiché in MQL4, solo la prima dimensione può essere controllata dinamicamente.

Qui il problema si risolve in un altro modo, se si possono trasferire gli array dentro e fuori una procedura, ma MQL4 non permette nemmeno di farlo. Ho creato un indicatore basato sul modello di cui sopra, mi sono sbarazzato di tutte le trasposizioni, chiamate alla matrice, esponenziazione della matrice (SQRT(-1), ma non ho potuto evitarlo), ecc. Ho implementato Kalman in MQL4 (matrice 2*2) ma ci ho passato più di 3 mesi. E ora se decido di aggiungere 1 moneta in più, tutto da capo. E questo è un enorme spreco di tempo. Ho scelto a lungo un linguaggio di programmazione in base alla velocità di esecuzione di un dato compito (e so di memoria, efficienza, stack, una volta programmavo in assembler). La cosa principale è il tempo, è l'unico valore che abbiamo.

Aspetterò MQL5.