Discussão do artigo "Operações com Matrizes e Vetores em MQL5" - página 2

 
Rashid Umarov #:
Existe, leia o artigo .

O artigo copia uma matriz multidimensional, mas você precisa de uma unidimensional!

 
Olá a todos. Quero estudar o indicador, mas não sei por onde começar.
 

Não entendo por que você não pode simplesmente ajudar, mostrar um exemplo - é para isso que serve a discussão do artigo - triste.

Em geral, decidi que somente por meio de um vetor é possível - passar uma matriz para lá e, em seguida, parafusá-la em uma matriz, mas até agora nem cheguei ao ponto de como dobrá-la (a partir de um vetor é possível fazer uma matriz com um número especificado de colunas, como se estivesse transformando-a?

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 -->  0000000140 D77E04 6644896473 FE      mov        [rbx+rsi*2-0x2], r12w
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)                    0000000140 D77E0A 83 F8FE            cmp        eax, 0xfe
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)                    0000000140 D77E0D 751 C              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)                    0000000140 D77E0F 4 C3BF7            cmp        r14, rdi
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)                    0000000140 D77E12 751 B              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)                    0000000140 D77E14 443865 F0          cmp        [rbp-0x10], r12b
2022.10.08 06:12:48.942 Test_Matrix_02 (EURUSD,H1)                    0000000140 D77E18 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)      

Estou anexando o código, é claro

//+------------------------------------------------------------------+
//|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"
//+------------------------------------------------------------------+
//| Função de início do programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
   matrix target;
   int count=1000;
   target.Init(count, 1);
   vector V_Target;//Vetor para obter uma matriz com alvos e transferi-la para uma matriz
   int arr_Target[];
   ArrayResize(arr_Target,count);
   int T_Rand=0;//Escreveremos um arquivo aleatório
   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);
   
  }
//+------------------------------------------------------------------+
 

Alexei, tudo funciona para mim. Aqui está seu script, ligeiramente ajustado:

//+------------------------------------------------------------------+
//| Função de início do programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
   const int count = 20;
   ::MathSrand(1);
//--- matriz
   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;
     }
//--- vetor
   vector target_vc;
   target_vc.Assign(target_arr);
//--- matriz
   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);
  }
//+------------------------------------------------------------------+


Log:

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 #:

Alexei, tudo funciona para mim. Aqui está seu script, ligeiramente ajustado:


Log:

Obrigado. Sim, eu sei que o /n na impressão causa a falha, mas não sei o que significa o ":".

Obrigado - eu li isso hoje de manhã, mas ainda não tentei. Mas parece que ainda será consumida muita memória - digamos que coletamos dados em uma matriz unidimensional, depois precisamos colocá-los em um vetor e, em seguida, em uma matriz - já são três entidades repetidas, o que não é bom. Por que não podemos transferir imediatamente uma matriz unidimensional para uma matriz?

 

Não consigo entender:

1. Como transferir uma matriz para uma matriz

2. Como ler um valor específico na matriz e como escrevê-lo com a indicação de linha e coluna

Li o artigo mais de uma vez - talvez eu não tenha entendido o texto, mas aqui está o fato - há perguntas.

 
Aleksey Vyazmikin #:

Obrigado. Sim, eu sei que /n na impressão causa a falha, mas não sei o que ":" significa.

Obrigado pela transferência de matriz - eu a li hoje de manhã, mas ainda não a experimentei. Mas parece que ainda será consumida muita memória - digamos que coletamos dados em uma matriz unidimensional, depois precisamos colocá-los em um vetor e, em seguida, em uma matriz - já são três entidades repetidas, o que não é bom. Por que não podemos transferir imediatamente uma matriz unidimensional para uma matriz?

Não sei, acho que o desenvolvedor sabe melhor.... E por que você não pode coletar dados imediatamente em uma matriz, ignorando a cadeia "matriz-vetor-matriz"? ))

 
Denis Kirichenko #:

Não sei, talvez o desenvolvedor saiba mais.... Por que você não pode simplesmente coletar dados em uma matriz, ignorando a cadeia "matriz-vetor-matriz"? ))

Até agora não entendi como preencher a matriz diretamente pelas células e como ler a partir dela.

Em geral, leio dados de um arquivo bin em uma matriz - é um exemplo - e queria trabalhar com ele como se fosse uma matriz. Acho que, no início, havia uma oportunidade de ler uma matriz do arquivo, mas agora não vejo essa oportunidade nas instruções.

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

Até o momento, não entendi como preencher a matriz diretamente célula por célula e como ler a partir dela.

Veja o exemplo sobre multiplicação de matrizes no OpenCL

 
Ou pesquise o artigo MatrixSetValues, pois tudo está à vista de todos.