Умножение матриц с Arduino и Eigen не работает - PullRequest
0 голосов
/ 29 октября 2019

Я знаю, используя #include <stlport.h> и #include <Eigen30.h>, чтобы заставить Eigen работать с Arduino - довольно старый способ получить работу Eigen .

Поэтому я пыталсятакже #include <ArduinoSTL.h> с двумя либами Eigen Arduino, которые я там обнаружил (#include <Eigen30.h> и #include <Eigen.h>). Я оставлю здесь ссылки на репозитории GitHub всех библиотек.

#include <Eigen.h>: https://github.com/bolderflight/Eigen

#include <Eigen30.h>: https://github.com/vancegroup/EigenArduino/tree/Eigen30

#include <stlport.h>: https://github.com/vancegroup/stlport-avr/tree/STLport-5.2-arduino-installed

#include <ArduinoSTL.h>: https://github.com/mike-matera/ArduinoSTLТолько #include <stlport.h> и #include <Eigen30.h> фактически скомпилированы в IDE Arduino. На самом деле я version 1.6.20 из пакета AVR Boards , который мы можем изменить в Инструменты Доска Менеджер доски .

Когда я начал выполнять некоторые базовые операции для проверки Eigen , такие как добавление матриц и инициализация матриц. Затем я заметил, что всякий раз, когда я умножал 2 матрицы, независимо от того, какой метод я использовал (я пробовал каждый метод, который документация Eigen предлагает в качестве передового опыта), программа зависала в этой конкретной инструкции.

Вот пример:

#include <stlport.h>
#include <Eigen30.h>
#include <Eigen/Dense>

using namespace Eigen;

void setup()
{
   Serial.begin(9600);
   delay(2000);
   Serial.print("Hi");

Matrix3f m;
MatrixXf b(2,2);
MatrixXf M1(2,2); //EDIT: I missed this last time.
MatrixXf matA(2, 2);

 m << 1, 2, 3,
      4, 5, 6,
      7, 8, 9;

matA << 1, 2,
        1, 2;

b = matA;

 print_mtxf(b);  // Goes ok
 print_mtxf(matA);  // Goes ok

Serial.print("M1:\n");  // Goes ok
 M1.noalias() =  matA*b;  // Something wrong is going on here.
 print_mtxf(M1);  // Nerver gets to print this or the following
 Serial.print("M1:\n");
 Serial.print("M1:\n");

}

void loop()
{

}

void print_mtxf(const Eigen::MatrixXf &X)  
{
   int i, j, nrow, ncol;

   nrow = X.rows();
   ncol = X.cols();

   Serial.print("nrow: "); Serial.println(nrow);
   Serial.print("ncol: "); Serial.println(ncol);       
   Serial.println();

   for (i=0; i<nrow; i++)
   {
       for (j=0; j<ncol; j++)
       {
           Serial.print(X(i,j), 6);   // print 6 decimal places
           Serial.print(", ");
       }
       Serial.println();
   }
   Serial.println();
}

Итак, какие у меня варианты? Я действительно хочу работать Eigen , потому что я собираюсь использовать базовую библиотеку c ++, которая зависит только от Eigen, она довольно проста, но Eigen не работает должным образом. Я думаю, что это жест к бесконечному циклу, потому что продолжающиеся печати никогда не заканчиваются.

...