Octave/Matlab Vector Programming in Due

Even without the Due you can download the IDE, follow the instructions to get Eigen working then try compiling your code and see what the code size is, that will give you an idea if it will work. The IDE will work without a board.

Although std::cout does work on the Due you might want to change those lines to use Serial.print as that uses a lot less flash.

Thanks I downloaded Arduino 1.5 ...
I put the eigen subdirectory into arduino hardware sam libraries then the eigen.h file in there. That is in the adafruit post.

Now I am getting errors with namespace...
using namespace Eigen; // Eigen related statement; simplifies syntax for declaration of matrices
The print out option of the matrix tipe I am not shure how that works.

I useualy use standard c and arduino c.

I switched the board type to duo and it must look into the sam libraries folder so now the example compiles. I will try my code latter. Thank You. :smiley: :grin: XD

Binary sketch size: 183,028 bytes (of a 524,288 byte maximum) - 34% used

So the LDA eample that has slightly different number results but did one calculation correctly i would have to try it with some of the sample data or octave or r example data to see if it continues to work.

Well I got the code to compile for a pc and compile for the arduino due. Now the pc I tested it will this run on the arduino due? Sorry about the mess.

//Josh W
//lda example reference http://people.revoledu.com/kardi/tutorial/LDA/Numerical%20Example.html
//reference http://eigen.tuxfamily.org/dox/TutorialMatrixArithmetic.html
// Example By: RandomVibe
// Eigen Doc: http://eigen.tuxfamily.org/dox/
// Quick Reference: http://eigen.tuxfamily.org/dox/QuickRefPage.html

#include <iostream>
#include <math.h>
#include <Eigen312.h>     // Calls main Eigen3.1.2 matrix class library
#include <Dense>
#include <LU>             // Calls inverse, determinant, LU decomp., etc.
using namespace Eigen;    // Eigen related statement; simplifies syntax for declaration of matrices
using Eigen::MatrixXd;
using namespace std;

void print_mtxf(const Eigen::MatrixXf& K);


void setup() {

    Serial.begin(9600);
   
    // DECLARE MATRICES
    //--------------------
  //data matrix x row col
MatrixXd x(4,2);
//cur
x(0,0) = 2.95;//g0
x(1,0) = 2.53;
x(2,0) = 3.57;
x(3,0) = 3.16;

//dia
x(0,1) = 6.63;//g0
x(1,1) = 7.79;
x(2,1) = 5.65;
x(3,1) = 5.47;

MatrixXd x1(3,2);

x1(0,0) = 2.58;//g1
x1(1,0) = 2.16;
x1(2,0) = 3.27;

x1(0,1) = 4.46;//g1
x1(1,1) = 6.22;
x1(2,1) = 3.52;

MatrixXd ui(1,2);//group/feature

ui(0,0)=(x(0,0) + x(1,0) + x(2,0) + x(3,0))/4.0;
ui(0,1)=(x(0,1) + x(1,1) + x(2,1) + x(3,1))/4.0;

//transpose ui to uit
MatrixXd uit(1,2);//group/feature
uit=ui.transpose();


MatrixXd ui1(1,2);//group/feature

ui1(0,0)=(x1(0,0) + x1(1,0) + x1(2,0))/3.0;
ui1(0,1)=(x1(0,1) + x1(1,1) + x1(2,1))/3.0;

MatrixXd ui1t(1,2);//group/feature
ui1t=ui1.transpose();

MatrixXd u(1,2);//all group/feature
u(0,0)=(x(0,0) + x(1,0) + x(2,0) + x(3,0) + x1(0,0) + x1(1,0) + x1(2,0))/7.0;

u(0,1)=(x(0,1) + x(1,1) + x(2,1) + x(3,1) + x1(0,1) + x1(1,1) + x1(2,1))/7.0;

MatrixXd ximinu(4,2);
//cur
ximinu(0,0) = x(0,0) - u(0,0);//f0
ximinu(1,0) = x(1,0) - u(0,0);
ximinu(2,0) = x(2,0) - u(0,0);
ximinu(3,0) = x(3,0) - u(0,0);
//dia
ximinu(0,1) = x(0,1) - u(0,1);//f1
ximinu(1,1) = x(1,1) - u(0,1);
ximinu(2,1) = x(2,1) - u(0,1);
ximinu(3,1) = x(3,1) - u(0,1);
std::cout << ximinu << std::endl;
cout << "" << endl;

MatrixXd ximinu1(3,2);
//cur
ximinu1(0,0) = x1(0,0) - u(0,0);
ximinu1(1,0) = x1(1,0) - u(0,0);
ximinu1(2,0) = x1(2,0) - u(0,0);
//dia
ximinu1(0,1) = x1(0,1) - u(0,1);//g1
ximinu1(1,1) = x1(1,1) - u(0,1);
ximinu1(2,1) = x1(2,1) - u(0,1);

MatrixXd ximinut(4,2);
ximinut= ximinu.transpose();

MatrixXd ximinu1t(3,2);
ximinu1t= ximinu1.transpose();

MatrixXd ci(2,2);
ci = ( ximinut * ximinu ) /4.0;

MatrixXd ci1(2,2);
ci1 = ( ximinu1t * ximinu1 ) /3.0;

MatrixXd c(2,2);
c(0,0) = 4.0/7.0 * ci(0,0) + 3.0/7.0 * ci1(0,0);
c(1,0) = 4.0/7.0 * ci(1,0) + 3.0/7.0 * ci1(1,0);
c(0,1) = 4.0/7.0 * ci(0,1) + 3.0/7.0 * ci1(0,1);
c(1,1) = 4.0/7.0 * ci(1,1) + 3.0/7.0 * ci1(1,1);

MatrixXd cinverse(2,2);
cinverse=c.inverse();
 
MatrixXd xk(1,2);//new data
xk(0,0) = 2.81;//f1
xk(0,1) = 5.46;

MatrixXd xkt(1,2);//new data
xkt=xk.transpose();

MatrixXd lnp1(1,1);//p1 4/7
lnp1(0,0) = 0.0;
lnp1(0,0)=log(4.0/7.0);

MatrixXd lnp2(1,1);//p1 3/7
lnp2(0,0) = 0.0;
lnp2(0,0)=log(4.0/7.0);

MatrixXd f1(1,1);//ui   * cinverse * xkt  -1.0/2.0 * ui  * cinverse * uit + lnp1
MatrixXd f2(1,1);//ui1  * cinverse * xkt -1.0/2.0 * ui1 * cinverse * ui1t + lnp2

f1 = ui   * cinverse * xkt  -1.0/2.0 * ui  * cinverse * uit + lnp1;
f2 = ui1  * cinverse * xkt -1.0/2.0 * ui1 * cinverse * ui1t + lnp2;
 
if (f1(0,0)>f2(0,0)) cout << "the data is in group 1" << endl;
if (f1(0,0)<f2(0,0)) cout << "the data is in group 2" << endl;
    // Print Result
    //----------------------------
     //print_mtxf(K);      // Print Matrix Result (passed by reference)
   
}




void loop() {
  // put your main code here, to run repeatedly:
 
}




// PRINT MATRIX (float type)
//-----------------------------
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();
}

For those following this thread, you may be interested to know that the MatrixMath library has been patched to have the proper #includes for the latest Arduino library, and the source is again available in the Playground (the downloadable zip file recently disappeared).

It is indeed inadequate if you want the advanced functions and high-level language simplicity of Matlab/Octave, and horribly mismatched to the capabilities of the Due's ARM processor =)

But if you're rolling your own Kalman filter or system identification/adaptive control algorithm on a simpler Arduino, it should be useful.

The basic MatrixMath library is okay. If you want the high-level simplicity of Matlab/Octave for intense linear algebra operations, the Eigen3 C++ library is almost just a simple yet much faster.

Several projects use it including Google, the European Space Agency, some mobile apps, etc.

I have actually tested Eigne3 on the Arduino Due, and it works. Here's an excerpt from an Arduino sketch demonstrating Matlab/Octave-like programming, on the Due:

    // Kalman Gain Example
    // Matlab form:  K = Pp * H' * inv(H * Pp * H' + R)
    // On Arduino:
    X  = H * Pp * H.transpose() + R;    
    K  = Pp * H.transpose() * X.inverse();

I detailed out instructions for obtaining and setting up Eigen3 for the Arduino Due IDE here:

// Kalman Gain Example
    // Matlab form:  K = Pp * H' * inv(H * Pp * H' + R)
    // On Arduino:
    X  = H * Pp * H.transpose() + R;    
    K  = Pp * H.transpose() * X.inverse();

might be faster this way

// Kalman Gain Example
    // Matlab form:  K = Pp * H' * inv(H * Pp * H' + R)
    // On Arduino:
    T = Pp * H.transpose();
    X  = H * T + R;    
    K  = T * X.inverse();

Eigen3.1.3 has been recently released. Eigen is a C++ library enabling Matlab and Octave-like matrix programming, on the Due!

Step-by-step instructions (simplified) and example are posted in following link (full ready-to-use library attached there):

http://forum.arduino.cc/index.php?topic=144446.msg1089371#msg1089371

Hi,

I tried the same example and that works fine on due.
but, whem I tried to use it togehter wiht "DMP6050" which has "helper_3d_math" header file included.. then it gives me error "Quaternion unambigious" i dont know what is that...if anybody can help me that.

then also i troed to comment the line " using namespace Eigen " it complied partially and removed most of the errors. the only error i am getting with this is " expected constructor, destructor, or type conversion before '<<' token".

I think there is a conflict between the libaraies that i am using in my project. it will be really helpfull if someone can help me out.

Thank you.

I am not familiar with DMP6050, but after quickly reviewing your library, "helper_3d_mat.h", it appears to have a class called "Quaternion" that will certainly clash with Quaternion in the Eigen library. Since the "helper_3d_mat.h" only has 276 lines, I recommend changing the name of the class in question, but you'll have to rename the instances in DMP6050. Also, you have to leave the line "using namespace Eigen", otherwise you'll have to type "Eigen::" as a prefix to Eigen related commands. See the following example:

http://forum.arduino.cc/index.php?topic=144446.msg1089371#msg1089371

Good luck.

I'm using your lib inside a free and open basic air data lib.
Thank you for share you code.

eecharlie:
For those following this thread, you may be interested to know that the MatrixMath library has been patched to have the proper #includes for the latest Arduino library, and the source is again available in the Playground (the downloadable zip file recently disappeared).

It is indeed inadequate if you want the advanced functions and high-level language simplicity of Matlab/Octave, and horribly mismatched to the capabilities of the Due's ARM processor =)

But if you're rolling your own Kalman filter or system identification/adaptive control algorithm on a simpler Arduino, it should be useful.