Yo Fleyt / Mbed 2 deprecated roboticLab_withclass_3_July

Dependencies:   ISR_Mini-explorer mbed

Fork of roboticLab_withclass_3_July by Georgios Tsamis

Committer:
Ludwigfr
Date:
Mon Jul 10 16:23:52 2017 +0000
Revision:
9:1cc27f33d3e1
Parent:
8:072a76960e27
Child:
10:d0109d7cbe7c
with lab 4 done with proper matrix function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ludwigfr 8:072a76960e27 1 #include "myMatrix.hpp"
Ludwigfr 8:072a76960e27 2
Ludwigfr 8:072a76960e27 3 using namespace std;
Ludwigfr 8:072a76960e27 4
Ludwigfr 8:072a76960e27 5 myMatrix::myMatrix(int inNbRow,int inNbColumn){
Ludwigfr 9:1cc27f33d3e1 6 int i;
Ludwigfr 8:072a76960e27 7 this->nbRow=inNbRow;
Ludwigfr 8:072a76960e27 8 this->nbColumn=inNbColumn;
Ludwigfr 8:072a76960e27 9 //initialise data
Ludwigfr 8:072a76960e27 10
Ludwigfr 8:072a76960e27 11 //memory
Ludwigfr 8:072a76960e27 12 this->data= new float*[this->nbColumn];
Ludwigfr 8:072a76960e27 13 for(i = 0; i < this->nbColumn; ++i)
Ludwigfr 8:072a76960e27 14 this->data[i] = new float[this->nbRow];
Ludwigfr 8:072a76960e27 15
Ludwigfr 8:072a76960e27 16 //fill with 0
Ludwigfr 9:1cc27f33d3e1 17 this->fillWithZeroes();
Ludwigfr 9:1cc27f33d3e1 18 }
Ludwigfr 8:072a76960e27 19
Ludwigfr 9:1cc27f33d3e1 20 void myMatrix::fillWithZeroes(){
Ludwigfr 9:1cc27f33d3e1 21 for(int i = 0; i < this->nbColumn; ++i) {
Ludwigfr 9:1cc27f33d3e1 22 for(int j = 0; j < this->nbRow; ++j) {
Ludwigfr 8:072a76960e27 23 this->data[i][j] = 0;
Ludwigfr 8:072a76960e27 24 }
Ludwigfr 8:072a76960e27 25 }
Ludwigfr 8:072a76960e27 26 }
Ludwigfr 8:072a76960e27 27
Ludwigfr 8:072a76960e27 28
Ludwigfr 9:1cc27f33d3e1 29 void myMatrix::fillByCopy(myMatrix mat1){
Ludwigfr 9:1cc27f33d3e1 30 for(int i = 0; i < mat1.nbRow; ++i) {
Ludwigfr 9:1cc27f33d3e1 31 for(int j = 0; j < mat1.nbColumn; ++j) {
Ludwigfr 9:1cc27f33d3e1 32 this->data[i][j] = mat1.data[i][j];
Ludwigfr 9:1cc27f33d3e1 33 }
Ludwigfr 9:1cc27f33d3e1 34 }
Ludwigfr 9:1cc27f33d3e1 35 }
Ludwigfr 9:1cc27f33d3e1 36
Ludwigfr 8:072a76960e27 37 //assume the dimensions are correct
Ludwigfr 8:072a76960e27 38 void myMatrix::fillWithTranspose(myMatrix mat1){
Ludwigfr 8:072a76960e27 39 for(int i = 0; i < mat1.nbRow; ++i) {
Ludwigfr 8:072a76960e27 40 for(int j = 0; j < mat1.nbColumn; ++j) {
Ludwigfr 8:072a76960e27 41 this->data[j][i] = mat1.data[i][j];
Ludwigfr 8:072a76960e27 42 }
Ludwigfr 8:072a76960e27 43 }
Ludwigfr 8:072a76960e27 44 }
Ludwigfr 8:072a76960e27 45
Ludwigfr 8:072a76960e27 46 //assume the dimensions are correct, and that this is fill with 0
Ludwigfr 8:072a76960e27 47 void myMatrix::fillByMultiplication(myMatrix mat1,myMatrix mat2){
Ludwigfr 8:072a76960e27 48 // Multiplying matrix firstMatrix and secondMatrix and storing in array mult.
Ludwigfr 8:072a76960e27 49 float sum=0;
Ludwigfr 8:072a76960e27 50 for(int i = 0; i < mat1.nbRow; ++i) {
Ludwigfr 8:072a76960e27 51 for(int j = 0; j < mat2.nbColumn; ++j) {
Ludwigfr 8:072a76960e27 52 for(int k=0; k < mat1.nbColumn; ++k) {
Ludwigfr 8:072a76960e27 53 sum += mat1.data[i][k] * mat2.data[k][j];
Ludwigfr 8:072a76960e27 54 }
Ludwigfr 8:072a76960e27 55 this->data[i][j] = sum;
Ludwigfr 8:072a76960e27 56 sum = 0;
Ludwigfr 8:072a76960e27 57 }
Ludwigfr 8:072a76960e27 58 }
Ludwigfr 8:072a76960e27 59 }
Ludwigfr 8:072a76960e27 60
Ludwigfr 8:072a76960e27 61 void myMatrix::addition(myMatrix mat1){
Ludwigfr 8:072a76960e27 62 for(int i = 0; i < mat1.nbRow; ++i) {
Ludwigfr 8:072a76960e27 63 for(int j = 0; j < mat1.nbColumn; ++j) {
Ludwigfr 8:072a76960e27 64 this->data[i][j] += mat1.data[i][j];
Ludwigfr 8:072a76960e27 65 }
Ludwigfr 8:072a76960e27 66 }
Ludwigfr 8:072a76960e27 67 }
Ludwigfr 8:072a76960e27 68
Ludwigfr 8:072a76960e27 69 void myMatrix::subtraction(myMatrix mat1){
Ludwigfr 8:072a76960e27 70 for(int i = 0; i < mat1.nbRow; ++i) {
Ludwigfr 8:072a76960e27 71 for(int j = 0; j < mat1.nbColumn; ++j) {
Ludwigfr 8:072a76960e27 72 this->data[i][j] -= mat1.data[i][j];
Ludwigfr 8:072a76960e27 73 }
Ludwigfr 8:072a76960e27 74 }
Ludwigfr 8:072a76960e27 75 }
Ludwigfr 8:072a76960e27 76
Ludwigfr 8:072a76960e27 77 /*
Ludwigfr 8:072a76960e27 78 void myMatrix::print(){
Ludwigfr 8:072a76960e27 79 for(int i = 0; i < this->nbRow; ++i) {
Ludwigfr 8:072a76960e27 80 for(int j = 0; j < this->nbColumn; ++j) {
Ludwigfr 8:072a76960e27 81 cout << this->data[i][j] << " ";
Ludwigfr 8:072a76960e27 82 }
Ludwigfr 8:072a76960e27 83 cout << endl;
Ludwigfr 8:072a76960e27 84 }
Ludwigfr 8:072a76960e27 85 }
Ludwigfr 8:072a76960e27 86 */
Ludwigfr 8:072a76960e27 87
Ludwigfr 8:072a76960e27 88 //The rest is for inversion
Ludwigfr 8:072a76960e27 89
Ludwigfr 8:072a76960e27 90 // calculate the cofactor of element (row,col)
Ludwigfr 8:072a76960e27 91 int GetMinor(float **src, float **dest, int row, int col, int order)
Ludwigfr 8:072a76960e27 92 {
Ludwigfr 8:072a76960e27 93 // indicate which col and row is being copied to dest
Ludwigfr 8:072a76960e27 94 int colCount=0,rowCount=0;
Ludwigfr 8:072a76960e27 95
Ludwigfr 8:072a76960e27 96 for(int i = 0; i < order; i++ )
Ludwigfr 8:072a76960e27 97 {
Ludwigfr 8:072a76960e27 98 if( i != row )
Ludwigfr 8:072a76960e27 99 {
Ludwigfr 8:072a76960e27 100 colCount = 0;
Ludwigfr 8:072a76960e27 101 for(int j = 0; j < order; j++ )
Ludwigfr 8:072a76960e27 102 {
Ludwigfr 8:072a76960e27 103 // when j is not the element
Ludwigfr 8:072a76960e27 104 if( j != col )
Ludwigfr 8:072a76960e27 105 {
Ludwigfr 8:072a76960e27 106 dest[rowCount][colCount] = src[i][j];
Ludwigfr 8:072a76960e27 107 colCount++;
Ludwigfr 8:072a76960e27 108 }
Ludwigfr 8:072a76960e27 109 }
Ludwigfr 8:072a76960e27 110 rowCount++;
Ludwigfr 8:072a76960e27 111 }
Ludwigfr 8:072a76960e27 112 }
Ludwigfr 8:072a76960e27 113
Ludwigfr 8:072a76960e27 114 return 1;
Ludwigfr 8:072a76960e27 115 }
Ludwigfr 8:072a76960e27 116
Ludwigfr 8:072a76960e27 117 // Calculate the determinant recursively.
Ludwigfr 8:072a76960e27 118 double CalcDeterminant( float **mat, int order)
Ludwigfr 8:072a76960e27 119 {
Ludwigfr 8:072a76960e27 120 // order must be >= 0
Ludwigfr 8:072a76960e27 121 // stop the recursion when matrix is a single element
Ludwigfr 8:072a76960e27 122 if( order == 1 )
Ludwigfr 8:072a76960e27 123 return mat[0][0];
Ludwigfr 8:072a76960e27 124
Ludwigfr 8:072a76960e27 125 // the determinant value
Ludwigfr 8:072a76960e27 126 float det = 0;
Ludwigfr 8:072a76960e27 127
Ludwigfr 8:072a76960e27 128 // allocate the cofactor matrix
Ludwigfr 8:072a76960e27 129 float **minor;
Ludwigfr 8:072a76960e27 130 minor = new float*[order-1];
Ludwigfr 8:072a76960e27 131 for(int i=0;i<order-1;i++)
Ludwigfr 8:072a76960e27 132 minor[i] = new float[order-1];
Ludwigfr 8:072a76960e27 133
Ludwigfr 8:072a76960e27 134 for(int i = 0; i < order; i++ )
Ludwigfr 8:072a76960e27 135 {
Ludwigfr 8:072a76960e27 136 // get minor of element (0,i)
Ludwigfr 8:072a76960e27 137 GetMinor( mat, minor, 0, i , order);
Ludwigfr 8:072a76960e27 138 // the recusion is here!
Ludwigfr 8:072a76960e27 139
Ludwigfr 8:072a76960e27 140 det += (i%2==1?-1.0:1.0) * mat[0][i] * CalcDeterminant(minor,order-1);
Ludwigfr 8:072a76960e27 141 //det += pow( -1.0, i ) * mat[0][i] * CalcDeterminant( minor,order-1 );
Ludwigfr 8:072a76960e27 142 }
Ludwigfr 8:072a76960e27 143
Ludwigfr 8:072a76960e27 144 // release memory
Ludwigfr 8:072a76960e27 145 for(int i=0;i<order-1;i++)
Ludwigfr 8:072a76960e27 146 delete [] minor[i];
Ludwigfr 8:072a76960e27 147 delete [] minor;
Ludwigfr 8:072a76960e27 148
Ludwigfr 8:072a76960e27 149 return det;
Ludwigfr 8:072a76960e27 150 }
Ludwigfr 8:072a76960e27 151
Ludwigfr 8:072a76960e27 152 // matrix inversion
Ludwigfr 8:072a76960e27 153 // the result is put in Y
Ludwigfr 8:072a76960e27 154 void MatrixInversion(float **A, int order, float **Y)
Ludwigfr 8:072a76960e27 155 {
Ludwigfr 8:072a76960e27 156 // get the determinant of a
Ludwigfr 8:072a76960e27 157 double det = 1.0/CalcDeterminant(A,order);
Ludwigfr 8:072a76960e27 158
Ludwigfr 8:072a76960e27 159 // memory allocation
Ludwigfr 8:072a76960e27 160 float *temp = new float[(order-1)*(order-1)];
Ludwigfr 8:072a76960e27 161 float **minor = new float*[order-1];
Ludwigfr 8:072a76960e27 162 for(int i=0;i<order-1;i++)
Ludwigfr 8:072a76960e27 163 minor[i] = temp+(i*(order-1));
Ludwigfr 8:072a76960e27 164
Ludwigfr 8:072a76960e27 165 for(int j=0;j<order;j++)
Ludwigfr 8:072a76960e27 166 {
Ludwigfr 8:072a76960e27 167 for(int i=0;i<order;i++)
Ludwigfr 8:072a76960e27 168 {
Ludwigfr 8:072a76960e27 169 // get the co-factor (matrix) of A(j,i)
Ludwigfr 8:072a76960e27 170 GetMinor(A,minor,j,i,order);
Ludwigfr 8:072a76960e27 171 Y[i][j] = det*CalcDeterminant(minor,order-1);
Ludwigfr 8:072a76960e27 172 if( (i+j)%2 == 1)
Ludwigfr 8:072a76960e27 173 Y[i][j] = -Y[i][j];
Ludwigfr 8:072a76960e27 174 }
Ludwigfr 8:072a76960e27 175 }
Ludwigfr 8:072a76960e27 176
Ludwigfr 8:072a76960e27 177 // release memory
Ludwigfr 8:072a76960e27 178 //delete [] minor[0];
Ludwigfr 8:072a76960e27 179 delete [] temp;
Ludwigfr 8:072a76960e27 180 delete [] minor;
Ludwigfr 8:072a76960e27 181 }
Ludwigfr 8:072a76960e27 182
Ludwigfr 8:072a76960e27 183
Ludwigfr 8:072a76960e27 184 //assume the matrix is invertible and square
Ludwigfr 8:072a76960e27 185 void myMatrix::fillWithInverse(myMatrix mat1){
Ludwigfr 8:072a76960e27 186 MatrixInversion(mat1.data,mat1.nbColumn,this->data);
Ludwigfr 8:072a76960e27 187 }
Ludwigfr 8:072a76960e27 188
Ludwigfr 8:072a76960e27 189 /*
Ludwigfr 8:072a76960e27 190 //assume the dimensions are correct
Ludwigfr 8:072a76960e27 191 void myMatrix::fillWithArray(float** array){
Ludwigfr 8:072a76960e27 192 for(int i = 0; i < this->nbRow; ++i) {
Ludwigfr 8:072a76960e27 193 for(int j = 0; j < this->nbColumn; ++j) {
Ludwigfr 8:072a76960e27 194 this->data[j][i] = array[i][j];
Ludwigfr 8:072a76960e27 195 }
Ludwigfr 8:072a76960e27 196 }
Ludwigfr 8:072a76960e27 197 }
Ludwigfr 8:072a76960e27 198 */