![](/media/cache/group/Diana_su_nero.jpg.50x50_q85.jpg)
test_IPKF
Dependencies: mbed
source/matrix.c
- Committer:
- LudovicoDani
- Date:
- 2016-04-20
- Revision:
- 0:fb6e494a7656
File content as of revision 0:fb6e494a7656:
#include "matrix.h" int CreateMatrix(matrix *m) { int i; int k ; m->element = (float**) malloc(m->row * (sizeof (float*))); if(m->element == NULL) { return 1; } else { for(i = 0; i < m->row; i++) { m->element[i]= (float*) malloc(m->col * (sizeof (float))); if(m->element[i] == NULL) { return 1; } } } for(i = 0; i < m->row; i++) { for(k = 0; k < m->col; k++) { m->element[i][k] = 0; } } return 0; } void DeleteMatrix(matrix *m) { int i; for(i = 0; i< m->row; i ++) { if (m->element[i]!= NULL) { free(m->element[i]); m->element[i] = NULL; } } if (m->element[i]!= NULL) { free(m->element); m->element = NULL; } } int InitMatrix(matrix* m, int row, int col) { m->row = row; m->col = col; return CreateMatrix(m); } int MxM (matrix* a, matrix* b, matrix* r) { int i; int z; int j; matrix temp; InitMatrix(&temp, a->row, b->col); if (a->col != b->row) { DeleteMatrix(&temp); return 1; } else if(a->row!=r->row) { DeleteMatrix(&temp); return 2; } else if(b->col!=r->col) { DeleteMatrix(&temp); return 3; } else { for(i = 0; i < a->row; i++) { for(j = 0; j < b->col; j++) { for(z = 0; z < a->col; z++) { temp.element[i][j]+= a->element[i][z] * b->element[z][j]; } } } for(i = 0; i < temp.row; i++) { for(j = 0; j < temp.col; j++) { r->element[i][j]=temp.element[i][j]; } } DeleteMatrix(&temp); return 0; } } int axM(matrix *m,float a, matrix* r) { int i = 0; int j = 0; matrix temp; InitMatrix(&temp,m->row,m->col); if(m->row!=r->row) { DeleteMatrix(&temp); return 1; } else if(m->col!=r->col) { DeleteMatrix(&temp); return 2; } else { for(i = 0; i < m->row; i++) { for(j = 0; j < m->col; j++) { temp.element[i][j] = (m->element[i][j]) * a; } } for(i = 0; i < temp.row; i++) { for(j = 0; j < temp.col; j++) { r->element[i][j]=temp.element[i][j]; } } DeleteMatrix(&temp); return 0; } } int Sum(matrix *a, matrix *b, matrix* r) { int i = 0; int j = 0; if(a->col != b->col) { return 1; } else if(a->row != b->row) { return 2; } else if(a->row != r->row) { return 3; } else if(a->col != r->col) { return 4; } else { for(i = 0; i < r->row; i++) { for(j = 0; j < r->col; j++) { r->element[i][j] = (a->element[i][j]) + (b->element[i][j]); } } return 0; } } int Sub(matrix *a, matrix *b, matrix* r) { int i = 0; int j = 0; if(a->col != b->col) { return 1; } else if(a->row != b->row) { return 2; } else if(a->row != r->row) { return 3; } else if(a->col != r->col) { return 4; } else { for(i = 0; i < r->row; i++) { for(j = 0; j < r->col; j++) { r->element[i][j] = (a->element[i][j]) - (b->element[i][j]); } } return 0; } } int Traspost(matrix *m, matrix *r) { int i; int j; matrix temp; InitMatrix(&temp,m->row,m->col); if (m->row!=r->col) { DeleteMatrix(&temp); return 1; } else if (m->col!=r->row) { DeleteMatrix(&temp); return 2; } else { for(i = 0; i < m->row; i++) { for(j = 0; j < m->col; j++) { temp.element[j][i] = m->element[i][j]; } } for(i = 0; i < r->row; i++) { for(j = 0; j < r->col; j++) { r->element[i][j] = temp.element[i][j]; } } DeleteMatrix(&temp); return 0; } } int Inv(matrix *m, matrix *inv_m) { int i = 0; int j = 0; int k = 0; float regTemp = 0; matrix temp; temp.row = m->row; temp.col = (m->col) * 2; CreateMatrix(&temp); if (m->col != m->row) { DeleteMatrix(&temp); return 1; } else if (m->row != inv_m->row) { DeleteMatrix(&temp); return 2; } else if (m->col != inv_m->col) { DeleteMatrix(&temp); return 3; } else { for(i = 0; i < m->row; i++) { for(j = 0 ; j < m->col; j++) { temp.element[i][j] = m->element[i][j]; if(j == 0) { temp.element[i][i + m->col] = 1; } } } /*start gauss algorithm*/ for(k = 0; k < temp.row; k++) { /*check if element [k][k] != 0*/ if(temp.element[k][k] == 0) { /*find an element [j][k] != 0*/ for(i = k; i < temp.row; i++) { if(temp.element[i][k] != 0) { break; } } /*if not the matrix has no inverse*/ if(i == temp.row) { DeleteMatrix(&temp); return 4; } /*else exchange row*/ for(j = 0; j < temp.col; j++) { regTemp = temp.element[k][j]; temp.element[k][j] = temp.element[i][j]; temp.element[i][j] = regTemp; } } /*row k divided by element[k][k]*/ regTemp = temp.element[k][k]; for(j = 0; j<temp.col; j++) { temp.element[k][j] = temp.element[k][j]/regTemp; } /*compute the other value of matrix*/ for (i = 0; i < temp.row; i++) { if (i != k) { regTemp = temp.element[i][k]; for(j = 0; j < temp.col; j++) { temp.element[i][j] = temp.element[i][j] - temp.element[k][j] * regTemp; } } } } for(i = 0; i < inv_m->row; i++) { for(j = 0; j < inv_m->col; j++) { inv_m->element[i][j] = temp.element[i][inv_m->col + j]; } } DeleteMatrix(&temp); return 0; } } void CrossProd(matrix* v, matrix* w, matrix* r) { matrix s; InitMatrix(&s, 3,3); //Sv = [0,-v(3),v(2);v(3),0,-v(1);-v(2),v(1),0]; s.element[0][0] = 0; s.element[0][1] = -(v->element[2][0]); s.element[0][2] = v->element[1][0]; s.element[1][0] = v->element[2][0]; s.element[1][1] = 0; s.element[1][2] = -v->element[0][0]; s.element[2][0] = -v->element[1][0]; s.element[2][1] = v->element[0][0]; s.element[2][2] = 0; //k = Sv*w; MxM(&s, w, r); DeleteMatrix(&s); return; } void Print_Matrix(matrix* m) { int i; int j; for (i = 0; i<m->row;i++) { for( j = 0; j < m->col;j++) { printf("%f ",m->element[i][j]); } printf("\n"); } printf("\n"); return; }