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();
}