Diskussion zum Artikel "Matrix- und Vektoroperationen in MQL5" - Seite 2

 
Rashid Umarov #:
Es gibt sie, lesen Sie den Artikel.

Der Artikel kopiert ein mehrdimensionales Array, aber Sie brauchen ein eindimensionales!

 
Hallo zusammen. Ich möchte den Indikator studieren, aber ich weiß nicht, wo ich anfangen soll.
 

Ich verstehe nicht, warum Sie nicht einfach helfen können, zeigen ein Beispiel - das ist, was der Artikel Diskussion ist für - traurig.

Im Allgemeinen habe ich beschlossen, dass nur durch einen Vektor es möglich ist - ein Array dort übergeben, und dann schrauben Sie es zu einer Matrix, aber bisher habe ich nicht einmal auf den Punkt, wie es zu biegen (von einem Vektor ist es möglich, eine Matrix mit einer bestimmten Anzahl von Spalten zu machen, als ob es zu transformieren?), und nicht die Tatsache, dass es möglich ist, so bekam ich einen Absturz.

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)      

Ich bin den Code natürlich anhängen

//+------------------------------------------------------------------+
//|Test_Matrix_02.mq5 |
//|Urheberrecht 2022, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
void OnStart()
  {
   matrix target;
   int count=1000;
   target.Init(count, 1);
   vector V_Target;//Vektor, um ein Array mit Zielen zu erhalten und es in eine Matrix zu übertragen
   int arr_Target[];
   ArrayResize(arr_Target,count);
   int T_Rand=0;//Wir schreiben eine zufällige
   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);
   
  }
//+------------------------------------------------------------------+
 

Alexej, bei mir funktioniert alles. Hier ist Ihr Skript, leicht abgeändert:

//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
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;
     }
//--- Vektor
   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);
  }
//+------------------------------------------------------------------+


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

Alexej, bei mir funktioniert alles. Hier ist Ihr Skript, leicht gezwickt:


Log:

Ich danke Ihnen. Ja, ich weiß, dass das /n im Ausdruck den Absturz verursacht, aber ich weiß nicht, was das ":" bedeutet.

Danke für den Matrix-Transfer - ich habe ihn heute morgen gelesen, aber noch nicht ausprobiert. Aber es stellt sich heraus, dass immer noch eine Menge Speicher verbraucht wird - sagen wir, wir haben Daten in einem eindimensionalen Array gesammelt, dann müssen wir sie in einen Vektor packen, dann in eine Matrix - schon 3 wiederholte Einheiten, was nicht gut ist. Warum können wir ein eindimensionales Array nicht sofort in eine Matrix übertragen?

 

Ich kann das nicht verstehen:

1. Wie kann man eine Matrix in ein Array übertragen?

2. Wie lese ich einen bestimmten Wert in der Matrix und wie schreibe ich ihn mit der Angabe von Zeile und Spalte?

Ich habe den Artikel mehr als einmal gelesen - vielleicht verstehe ich die Formulierungen darin nicht, aber hier ist die Tatsache - es gibt Fragen.

 
Aleksey Vyazmikin #:

Ich danke Ihnen. Ja, ich weiß, dass /n im Ausdruck den Absturz verursacht, aber ich weiß nicht, was ":" bedeutet.

Danke für den Matrix-Transfer - ich habe ihn heute morgen gelesen, aber ich habe es noch nicht ausprobiert. Aber es stellt sich heraus, dass immer noch eine Menge Speicher verbraucht wird - sagen wir, wir haben Daten in einem eindimensionalen Array gesammelt, dann müssen wir sie in einen Vektor packen, dann in eine Matrix - schon 3 wiederholte Einheiten, was nicht gut ist. Warum können wir ein eindimensionales Array nicht sofort in eine Matrix übertragen?

Ich weiß es nicht, ich denke, der Entwickler weiß es besser.... Und warum kann man nicht sofort Daten in eine Matrix sammeln, indem man die Kette "Array-Vektor-Matrix" umgeht? ))

 
Denis Kirichenko #:

Ich weiß es nicht, vielleicht weiß es der Entwickler besser.... Warum kann man die Daten nicht einfach in einer Matrix sammeln und so die "Array-Vektor-Matrix"-Kette umgehen? ))

Bis jetzt habe ich nicht verstanden, wie man die Matrix direkt mit Zellen füllt und wie man sie ausliest.

Im Allgemeinen lese ich Daten aus einer Bin-Datei in ein Array - es ist ein Beispiel - ich wollte damit wie mit einer Matrix arbeiten, ich denke, am Anfang gab es eine Möglichkeit, eine Matrix aus der Datei zu lesen, aber jetzt sehe ich eine solche Möglichkeit in den Anweisungen nicht.

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

Bisher habe ich noch nicht verstanden, wie man die Matrix zellenweise direkt ausfüllt und wie man sie ausliest.

Siehe das Beispiel zur Matrixmultiplikation in OpenCL

 
Oder suchen Sie im Artikel MatrixSetValues, dort ist alles klar ersichtlich.