Теория случайных потоков и FOREX - страница 40

 
Prival >>:

Пожалуста сделайте процедуру транспонирования, у меня на MQL не получаеться. Вот пример в маткаде. Одно условие размерность m и n заранее не известны, и функция желательно должна быть уневерсальна, т.е. все равно какой массив транспонировать, естественно должна вызываться многократно и при этом правильно работать.

Ну попробуйте:



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

нет так нельзя, именно матрица A и B должна быть транспонирована, а вы породили еще 2 матрицы AT и BT, т.е вы не транспонировали, а сделали матрицы которые являються транспонированными по отношению к исходным

 

Не вижу никакой разницы. Добавьте еще:


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

если надо, и получите результат транспонирования в исходных матрицах.


Хотя я бы просто использовал AT и BT там, где мне нужны транспонированные матрицы, т.к. они, как правило, ходят парами.

 
bstone писал(а) >>

Не вижу никакой разницы. Добавьте еще:

если надо, и получите результат транспонирования в исходных матрицах.


Хотя я бы просто использовал AT и BT там, где мне нужны транспонированные матрицы, т.к. они, как правило, ходят парами.

За идею спасибо сделать копии АТ и BT и использовать их там где нужно. Проверю с карандашом можно ли это зделать, но боюсь нет, так как фильтр калмана итерационный, и одна и таже матрица несколько раз транспонируеться, не плодить же их к каждому тику.

Но у вас транспонировать не получилось.

Вы сделали не то - матрица B и BT двух мерные, т.е. их ранг = 2, а у вас 1.

Вставте Print("-------",ArrayDimension(BT)); ответ 1

т.е. у вас одномерный массив и никакие строки со столбцами вы не поменяли местами.

 
Prival >>:

т.е. у вас одномерный массив и никакие строки со столбцами вы не поменяли местами.

Не спешите с выводами - массивы одномерные снаружи, но двумерные внутри :)

 
bstone писал(а) >>

Не спешите с выводами - массивы одномерные снаружи, но двумерные внутри :)

Поймте тогда летит вся матричная алгебра, вот картинка снова из маткада. Продолжаю свой пример.

а там есть не только умножение, а все виды операций + свои специфические, присущие только матричной алгебре.

Если при транспонировании нарушается размерность то все плохо, очень плохо.

Не простая это задача, хотя на первый взгляд, да что там строки со столбцами поменять местами, а вот так с наскока не получается.

Хотя точно известно что эта задача разрешаема, только вот в MQL это правой рукой за левое ухо, и дай бог чтобы дотянуться смог.

 
Prival >>:

Поймте тогда летит вся матричная алгебра, вот картинка снова из маткада. Продолжаю свой пример.


Ув. Prival, поверьте, я очень хорошо разбираюсь в матричной алгебре. Я вам предложил решение вашей проблемы в разрезе MQL4. Другого решения просто физически не существует, т.к. в MQL4 динамически можно управлять только первой размерностью.


Для того чтобы получить полноценную библиотеку матричных операций вам нужно ваш текущий вариант переделать под работу с другой абстракцией для представления матриц. А конкретно - нужно перейти от двумерных массивов к линейным.


Задумайтесь, как маткад хранит матрицы? Не в линейных ли массивах? Или вы думаете, что он их хранит на двумерных жестких дисках? Испокон веков многомерные массивы хранились в памяти линейно, используя два варианта распределения данных: построчный или постолбцовый.


Если у вас есть матрица 3х2, то в памяти (линейном массиве) при построчной укладке, она будет выглядеть так: { a(1,1) a(1,2) a(2,1) a(2,2) a(3,1) a(3,2) }


Соотвественно все матричные операции должны использовать такую организацию данных. Перейти от двумерной индексации к линейной в существующем коде будет несложно. Зато вы получите полный контроль над динамическими размерами матриц.

 

Кстати операция транспонирования прямоугольных матриц в том виде, в котором вы ее изначально хотели (т.е. сразу в исходном массиве) не такая тривиальная, как кажется на первый взгляд. На самом деле это сложная задача и существует множество непростых алгоритмов для ее решения. Над ее эффективным (минимальное число пермутаций, кэш-локальность, минимум доп. памяти и т.п.) решением боги от программирования бились с 1950 года.


Так что не пинайте себя сильно за то, что не смогли ее решить.

 
Prival >>:

Но у вас транспонировать не получилось.

Вы сделали не то - матрица B и BT двух мерные, т.е. их ранг = 2, а у вас 1.

Вставте Print("-------",ArrayDimension(BT)); ответ 1

т.е. у вас одномерный массив и никакие строки со столбцами вы не поменяли местами.

А разве понятия "ранг матрицы" и "ранг массива" тождественны? Насколько я помню ранг матрицы - это наибольший из порядков её миноров... А вот что такое "ранг массива"... честно говоря, не знаю...

 
bstone писал(а) >>

Ув. Prival, поверьте, я очень хорошо разбираюсь в матричной алгебре. Я вам предложил решение вашей проблемы в разрезе MQL4. Другого решения просто физически не существует, т.к. в MQL4 динамически можно управлять только первой размерностью.

вот тут собака и зарыта, можно еще одним способом решить, если можно былобы передавать массивы в процедуру и из неё, но MQL4 это тоже не позволяет делать. Обойти всегда можно, я сделал индикатор на основе той модель что приводил выше, избавился от всех транспонирований, обращений матриц, матричную экспонету сделал (SQRT(-1), только не смог обойти) и т.д. как смог реализовал калмана на MQL4 (матрица 2*2) но убил на это более 3 месяцев. И теперь если я решу добавить еще 1 валюту, все поновой. А это потеря времени, и огромная. Я уже давно выбираю язык программирования исходя из скорости выполнения поставленной задачи (и про память знаю, эффективность, стек, когдато давно на ассемблере программировал). Главное время, это единственная ценность что у нас есть.

bstone спасибо, что старались помочь, буду ждать MQL5.