Teoria do Fluxo Aleatório e FOREX - página 40

 
Prival >> :

Por favor, faça o procedimento de transposição, eu não posso fazê-lo em MQL. Aqui está um exemplo no matcad. Uma condição é que as dimensões m e n não sejam conhecidas de antemão e a função deve ser preferencialmente inversal, ou seja, não importa qual matriz transpor, é claro que deve ser chamada várias vezes e funcionar corretamente.

Experimente:



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

Não, as matrizes A e B devem ser transpostas, mas você gerou mais duas matrizes AT e BT, ou seja, você não transpôs, mas fez matrizes que são transpostas em relação à matriz original

 

Não vejo nenhuma diferença. Adicione mais:


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

se necessário, e obter o resultado de transposição nas matrizes originais.


Embora eu usaria apenas AT e BT onde preciso de matrizes transpostas, pois elas tendem a ir em pares.

 
bstone писал(а) >>

Não vejo nenhuma diferença. Adicione mais:

se necessário, e obter o resultado de transposição nas matrizes originais.


Embora eu usaria apenas AT e BT onde preciso das matrizes de transposição, pois elas tendem a ir em pares.

Obrigado pela idéia de fazer cópias de AT e BT e usá-las onde eu precisar. Vou verificar com um lápis se isso pode ser feito, mas receio que não, pois o filtro Kalman é iterativo, e uma mesma matriz é transposta várias vezes, para não multiplicá-las para cada carrapato.

Mas sua transposição não funcionou.

Você fez errado - a matriz B e BT são bidimensionais, ou seja, sua classificação = 2, e você tem 1.

Insira Imprimir("-------",ArrayDimension(BT)); a resposta é 1

ou seja, você tem uma matriz unidimensional e não trocou nenhuma fila por colunas.

 
Prival >> :

ou seja, você tem uma matriz unidimensional e não trocou nenhuma linha por colunas.

Não tire conclusões precipitadas - as matrizes são unidimensionais por fora, mas bidimensionais por dentro :)

 
bstone писал(а) >>

Não tire conclusões precipitadas - as matrizes são unidimensionais no exterior, mas bidimensionais no interior :)

Entenda então que voa toda álgebra matricial, aqui está uma foto novamente do matcad. Continuando com meu exemplo.

e não há apenas multiplicação, mas todos os tipos de operações + suas próprias operações específicas que são exclusivas da álgebra matricial.

Se a dimensionalidade for violada durante a transposição, tudo é ruim, muito ruim.

Não é um problema simples, embora à primeira vista, o que há filas e colunas para trocar de lugar, mas aqui, num piscar de olhos, não acontece.

Embora eu saiba com certeza que este problema é resolúvel, mas na MQL é a mão direita na orelha esquerda, e Deus me livre de alcançá-lo.

 
Prival >> :

Entenda então que voa toda álgebra matricial, aqui está uma foto novamente do matcad. Continuando com meu exemplo.


Prival, acredite-me, sou muito bem versado em álgebra matricial. Eu lhe ofereci a solução de seu problema em termos de MQL4. Simplesmente não há outra solução, já que na MQL4, somente a primeira dimensão pode ser gerenciada dinamicamente.


A fim de obter uma biblioteca completa de operações de matrizes, você precisa retrabalhar sua versão atual para trabalhar com uma abstração diferente para representar matrizes. Especificamente, você precisa mudar de matrizes bidimensionais para matrizes lineares.


Pense em como o matcad armazena matrizes? Não está em arrays lineares? Ou você acha que os armazena em discos rígidos bidimensionais? Durante séculos, as matrizes multidimensionais foram armazenadas na memória linearmente, usando duas formas de distribuição dos dados: linha por linha ou coluna por coluna.


Se você tiver uma matriz 3x2, em memória (uma matriz linear) quando empilhada linha por linha, ela terá este aspecto: { a(1,1) a(1,2) a(2,1) a(2,2) a(3,1) a(3,2) } { a(1,1) a(1,2) a(2,1) a(2,2)


Portanto, todas as operações de matriz devem utilizar esta organização de dados. A transição da indexação bidimensional para a linear no código existente não será um problema. Mas você terá controle total sobre as dimensões da matriz dinâmica.

 

A propósito, a operação de transposição de matrizes retangulares da forma que você originalmente queria (ou seja, imediatamente na matriz original) não é tão trivial quanto parece à primeira vista. Na verdade, é um problema complexo e há muitos algoritmos complicados para resolvê-lo. Os deuses da programação têm tentado resolvê-lo eficazmente (número mínimo de permutações, cache-localidade, memória mínima adicional, etc.) desde 1950.


Portanto, não se chute muito por não poder resolver.

 
Prival >> :

Mas sua transposição não funcionou.

Você fez a coisa errada - a matriz B e BT são bidimensionais, ou seja, sua classificação = 2, e você tem 1.

Insira Imprimir("-------",ArrayDimension(BT)); a resposta é 1

ou seja, você tem uma matriz unidimensional e não trocou nenhuma fila por colunas.

O "grau de uma matriz" e o "grau de uma matriz" são idênticos? Tanto quanto me lembro, a classificação de uma matriz é a ordem mais alta de seus menores. Mas qual é a "classificação de uma série"... francamente, não sei...

 
bstone писал(а) >>

Prival, acredite, eu tenho um entendimento muito bom da álgebra matricial. Eu lhe ofereci uma solução para seu problema em termos de MQL4. Não há outra solução, já que na MQL4, somente a primeira dimensão pode ser controlada dinamicamente.

Aqui é onde o problema é resolvido de uma maneira a mais, se você pode passar matrizes de e para um procedimento, mas a MQL4 também não permite fazê-lo. Eu fiz um indicador baseado no modelo acima, me livrei de todas as transposições, chamadas de matriz, exponenciação de matriz (SQRT(-1), mas não pude evitá-lo), etc. Eu implementei o Kalman na MQL4 (matriz 2*2), mas levei mais de 3 meses. E agora, se eu decidir acrescentar mais 1 moeda, tudo de novo. E isso é um grande desperdício de tempo. Há muito tempo eu venho escolhendo uma linguagem de programação baseada na velocidade de realização de uma determinada tarefa (e eu sei sobre memória, eficiência, empilhamento, era uma vez um tempo que eu costumava programar em assembler). O principal é o tempo, é o único valor que temos.

Vou esperar pela MQL5.