Hola!
Para construir unos filtros de kalman estoy programando unas funciones para trabajar con las matrices. Y no tengo mucha experiencia con Arduino / C++
Como en ocasiones el filtro trabajará con matrices de 2x2 o de 3x3 me gustaría que el tamaño de los arrays no estuviese hardcoded en la definición de la función, por lo que he intentado esto:
float m1[2][2]= {
{2.0, 1.0},
{5.0, 3.0}
};
float m2[2][2]={
{1.0, 0.0},
{0.0, 1.0}
};
float a[2][2]={0};
void setup() {
Serial.begin(9600);
}
void loop() {
// multiplico
matmult(m1, m2, a, 2);
}
void matmult(const float** matrix1, const float** matrix2, float** matres, const int n){
int i,j,k;
for (i = 0; i<n; ++i){
for(j = 0; j<n; ++j){
matres[i][j]=0;
for(k = 0; k<n; ++k){
matres[i][j]+= matrix1[i][k]*matrix2[k][j];
}
}
}
}
y obtengo el siguiente error
sketch_matmult:25: error: cannot convert 'float (*)[2]' to 'const float**' for argument '1' to 'void matmult(const float**, const float**, float**, int)'
No tengo muy claro como solucionarlo. La verdad es que lo he visto hacer así y la opción que se me ocurre es que quizá el problema esté en la definición de la matriz como un array "rígido".
Obviamente, si declaro la función así:
void matmult(const float matrix1[2][2], const float matrix2[2][2], float matres[2][2], const int n){
No tengo el problema, pero me gustaría que la función fuese más flexible.
Muchas gracias.
Solucionado por surbyte:
Era necesario declarar las variables como:
float **m1;
float **m2;
float **a;
byte nrows = 2;
byte ncolumns = 2;
Y alocatarlas en el setup así:
m1 = (float **) malloc(nrows * sizeof(float));
for(int i=0; i<ncolumns; i++) {
m1[i] = (float *) malloc(ncolumns * sizeof(float));
}