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

 
Aleksey Vyazmikin #:

Это не вектор, а матрица, выше у меня код

Вы должны сами разобраться или убедить в этом компилятор. Смотрите примеры, читайте.


 
Aleksey Vyazmikin #:
Так как вытащить столбец из матрицы?

Можно получить вектор из матрицы с помощью Col

Что значит "вытащить"? Удалить?

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

Можно получить вектор из матрицы с помощью Col

Что значит "вытащить"? Удалить?

Вытащить в плане конвертировать во что либо, что б далее работать.

Выше же я показал код, что с Col у меня ничего не вышло, там была матрица, а не вектор, как Вы написали.

 
Вам нужно отдохнуть и завтра перечитать все свои вопросы в этом обсуждении.
 
Rashid Umarov #:
Вам нужно отдохнуть и завтра перечитать все свои вопросы в этом осбуждении

Спасибо за заботу!

Большинство вопросов нашли разрешение с Вашей помощью.

Подожду до завтра, может Вы сможете потом мне ответить по моему вопросу.

 
Rashid Umarov #:

Никто не читает, но готовы поддержать. Вроде я видел вас в ветке машинного обучения? Если так, то вы должны понимать написанное в статье.

Видимо не до конца понимаю. Почему в элементе матрицы 3 значения. Это 3х мерный массив. Почему в справке вектор это одномерный массив а матрица в данном примере представлена трехмерным.
ЗЫ, бывает))) в примере 3 строки и вроде 4 столбца))) матрица)))
 

Наверное тут небольшая ошибка:

//--- копирование матриц
  matrix a= {{2, 2}, {3, 3}, {4, 4}};
  matrix b=a+2;
  matrix c;
  Print("matrix a \n", a);
  Print("matrix b \n", b);
  c.Assign(b);
  Print("matrix c \n", a);
  /*
   matrix a
   [[2,2]
    [3,3]
    [4,4]]
   matrix b
   [[4,4]
    [5,5]
    [6,6]]
   matrix c
   [[2,2]
    [3,3]
    [4,4]]
  */

Должно быть так:

//--- копирование матриц
  matrix a= {{2, 2}, {3, 3}, {4, 4}};
  matrix b=a+2;
  matrix c;
  Print("matrix a \n", a);
  Print("matrix b \n", b);
  c.Assign(b);
  Print("matrix c \n", с);
  /*
   matrix a
   [[2,2]
    [3,3]
    [4,4]]
   matrix b
   [[4,4]
    [5,5]
    [6,6]]
   matrix c
   [[4,4]
    [5,5]
    [6,6]]
  */
 

Ещё мелкая ошибка в разделе "Копирование таймсерий в матрицу или вектор":

//--- список символов для вычисления
  string symbols[]= {"EURUSD", "GBPUSD", "USDJPY", "USDCAD", "USDCHF"};
  int size=ArraySize(symbols);
//--- матрица и вектор для получения цен Close
  matrix rates(InBars, size);
  vector close;
  for(int i=0; i<size; i++)
   {
    //--- получим цены Close в вектор
    if(close.CopyRates(symbols[i], InTF, COPY_RATES_CLOSE, 1, InBars))
     {
      //--- вставим вектор в матрицу таймсерий
      rates.Col(close, i);
      PrintFormat("%d. %s: %d цен Close добавлено в матрицу", i+1, symbols[i], close.Size());
      //--- выведем для отладки первые 20 значений вектора
      int  digits=(int)SymbolInfoInteger(symbols[i], SYMBOL_DIGITS);
      Print(VectorToString(close, 20, digits));
     }
    else
     {
      Print("vector.CopyRates(%d,COPY_RATES_CLOSE) failed. Error ", symbols[i], GetLastError());
      return;
     }
   }

Наверное лучше так:

//--- список символов для вычисления
   string symbols[] = {"EURUSD", "GBPUSD", "USDJPY", "USDCAD", "USDCHF"};
   int size =::ArraySize(symbols);
//--- матрица и вектор для получения цен Close
   matrix rates_mx(InBars, size);
   vector close_vc;
   for(int i = 0; i < size; i++)
      {
      ::ResetLastError();
      //--- получим цены Close в вектор
      if(close_vc.CopyRates(symbols[i], InTF, COPY_RATES_CLOSE, 1, InBars))
         {
         //--- вставим вектор в матрицу таймсерий
         rates_mx.Col(close_vc, i);
         ::PrintFormat("%d. %s: %d цен Close добавлено в матрицу", i + 1, symbols[i],close_vc.Size());
         //--- выведем для отладки первые 20 значений вектора
         int  digits = (int)::SymbolInfoInteger(symbols[i], SYMBOL_DIGITS); ::Print(VectorToString(close_vc, 20, digits));
         }
      else
         {
         ::PrintFormat("vector.CopyRates(%s,COPY_RATES_CLOSE) failed. Error %d", symbols[i], ::GetLastError());
         return;
         }
      }
 
Denis Kirichenko #:

Наверное тут небольшая ошибка:

Должно быть так:

Спасибо, поправили

 
Rashid Umarov #:
Вам нужно отдохнуть и завтра перечитать все свои вопросы в этом обсуждении.

Ваш совет помог, спасибо.

Но, теперь дальше мучаюсь вопросами:

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

   matrixf Test;
   Test.Init(3,2);
   Test.Fill(1);//Заполняем матрицу нулями

   vectorf Zero;
   Zero.Init(3);
   Zero.Fill(0);//Заполняем матрицу нулями

   Zero=Test/Zero;

Получаю ошибку

cannot convert type 'vectorf' to type 'matrixf' Primer_02.mq5   325     11
cannot convert type 'matrixf' to type 'vectorf' Primer_02.mq5   325     10

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

2. Бывает, что при делитель является нулем, и тогда получаем "-nan(ind)" - но такое не очень то удобно для дальнейшей работы, может есть возможность в этом случае получать ноль или иное принудительное значение, или не проводить вычисление в этой ячейке - по выбору?

   matrixf Test;
   Test.Init(3,2);
   Test.Fill(0);//Заполняем матрицу нулями

   float z=0;
   Test=Test/z;
   Print(Test);
2022.10.13 06:09:52.125 Primer_02 (EURUSD,H1)   [[-nan(ind),-nan(ind)]
2022.10.13 06:09:52.125 Primer_02 (EURUSD,H1)    [-nan(ind),-nan(ind)]
2022.10.13 06:09:52.125 Primer_02 (EURUSD,H1)    [-nan(ind),-nan(ind)]]