Обсуждение статьи "Работа с матрицами и векторами в MQL5" - страница 2

 
Привет всем. Хочу изучать индикатор но не знаю с чего начать. 
 

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

В общем, решил, что только через вектор можно - передать туда массив, а потом его к матрице прикрутить, но пока даже не дошел до того, как бы его согнуть (из вектора можно сделать матрицу с указанным числом столбцов, как бы трансформировав её?), и не факт что можно, так получил краш.

2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)      Access violation at 0x0000000140D77E04 write to 0x00000002CBD3617E
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)         crash -->  0000000140D77E04 6644896473FE      mov        [rbx+rsi*2-0x2], r12w
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)                    0000000140D77E0A 83F8FE            cmp        eax, 0xfe
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)                    0000000140D77E0D 751C              jnz        0x140d77e2b
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)      
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)                    0000000140D77E0F 4C3BF7            cmp        r14, rdi
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)                    0000000140D77E12 751B              jnz        0x140d77e2f
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)      
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)                    0000000140D77E14 443865F0          cmp        [rbp-0x10], r12b
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)                    0000000140D77E18 7478              jz         0x140d77e92
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)      
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)      
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)      00: 0x0000000140D77E04
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)      01: 0x00000001403246C7
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)      02: 0x0000000140BCBBC8
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)      03: 0x0000000140BCBA81
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)      04: 0x0000000140BCB78B
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)      05: 0x0000000140BB848B
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)      06: 0x0000000140BBA5D1
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)      07: 0x0000000140BBA491
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)      08: 0x00000000040E06D0
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)      

Код конечно прикладываю

//+------------------------------------------------------------------+
//|                                               Test_Matrix_02.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   matrix target;
   int count=1000;
   target.Init(count, 1);
   vector V_Target;//Вектор для получения массива с целевыми и передачи в матрицу
   int arr_Target[];
   ArrayResize(arr_Target,count);
   int T_Rand=0;//Будем писать рандом
   for(int i=0; i<count; i++)
     {
     T_Rand=rand();
     if(T_Rand>32767/2)arr_Target[i]=1;
     else arr_Target[i]=0;
     }
   V_Target.Assign(arr_Target);
   if(!target.Col(V_Target,0))
   return ;
   Print("data after Col(V_Target) \n", target);
   
  }
//+------------------------------------------------------------------+
 

Алексей, у меня всё работает. Вот Ваш скрипт, немного подкорректирован:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   const int count = 20;
   ::MathSrand(1);
//--- array
   int target_arr[];
   ::ArrayResize(target_arr, count);
   for(int i = 0; i < count; i++)
     {
      int T_Rand = ::MathRand();
      if(T_Rand > 32767 / 2)
         target_arr[i] = 1;
      else
         target_arr[i] = 0;
     }
//--- vector
   vector target_vc;
   target_vc.Assign(target_arr);
//--- matrix
   matrix target_mx(count, 1);
   if(!target_mx.Col(target_vc, 0))
      return;
   ::Print("data after Col(target_vc) \n", target_mx);
   int rows, cols;
   rows = 4;
   cols = 5;
   if(!target_mx.Reshape(rows, cols))
      return;
   ::Print("data after Reshape \n", target_mx);
  }
//+------------------------------------------------------------------+


Журнал:

2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)        data after Col(target_vc) 
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)        [[0]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [1]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [0]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [1]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [1]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [0]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [0]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [1]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [1]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [1]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [0]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [1]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [1]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [1]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [0]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [0]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [0]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [0]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [0]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [0]]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)        data after Reshape 
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)        [[0,1,0,1,1]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [0,0,1,1,1]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [0,1,1,1,0]
2022.10.08 20:48:55.335 Test_Matrix_02 (SBER,H1)         [0,0,0,0,0]]
 
Denis Kirichenko #:

Алексей, у меня всё работает. Вот Ваш скрипт, немного подкорректирован:


Журнал:

Спасибо. Да, я знаю, что из-за /n в принте краш, но что значит ":" - не знаю.

Про перенос матрицы - спасибо - с утра прочел, но не пробовал. Но получается всё равно много памяти съедаться будет - допустим собрали данные в массив одномерный, потом надо это в вектор, потом в матрицу - уже 3 повторных сущности же получилось, что не хорошо. Почему нельзя сразу одномерный массив в матрицу перебросить?

 

Не могу понять:

1. Как матрицу перенести в массив

2. Как считывать конкретное значение в матрице и как его записывать с указанием строки и столбца

Статью читал уже не раз - может не понимаю формулировку в ней, но вот факт - вопросы имеются.

 
Aleksey Vyazmikin #:

Спасибо. Да, я знаю, что из-за /n в принте краш, но что значит ":" - не знаю.

Про перенос матрицы - спасибо - с утра прочел, но не пробовал. Но получается всё равно много памяти съедаться будет - допустим собрали данные в массив одномерный, потом надо это в вектор, потом в матрицу - уже 3 повторных сущности же получилось, что не хорошо. Почему нельзя сразу одномерный массив в матрицу перебросить?

Не знаю, наверное Разработчику виднее... А почему Вам сразу нельзя собирать данные в матрицу, минуя цепочку "массив- вектор - матрица" ? ))

 
Denis Kirichenko #:

Не знаю, наверное Разработчику виднее... А почему Вам сразу нельзя собирать данные в матрицу, минуя цепочку "массив- вектор - матрица" ? ))

Пока я не понимаю, как по ячейкам заполнить матрицу напрямую и как считать с неё.

Вообще я считываю данные из bin файла в массив - это выборка - хотел с ней работать, как с матрицей, вроде была возможность в начале читать из файла матрицу, но сейчас не вижу такой возможности в инструкции.

Документация по MQL5: Методы матриц и векторов
Документация по MQL5: Методы матриц и векторов
  • www.mql5.com
Методы матриц и векторов - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Aleksey Vyazmikin #:

Пока я не понимаю, как по ячейкам заполнить матрицу напрямую и как считать с неё.

Посмотрите пример про умножение матриц в OpenCL

 
Или поищите в статье MatrixSetValues, все же на виду.
 
Rashid Umarov #:
Или поищите в статье MatrixSetValues, все же на виду.

Понял, спасибо, в итоге как с массивом двухмерным получается.

Причина обращения: