long double ** Simulador :: armarMatrizSimulacion(){
atb = prodPorTraspuesta();
ata = prodTraspuestas();
unsigned ncuad = m->getTamanio()*m->getTamanio();
long double ** matriz = new long double *[ncuad];
for(int i = 0; i < anchoCuerpo*anchoCuerpo; i++) {
matriz[i] = new long double [ncuad+1];
}
for(int i = 0; i < ncuad; i++) {
for(int j = 0; j < ancuad; j++) {
matriz[i][j] = ata[i][j];
}
matriz[i][ncuad] = b[i];
}
return matriz;
}
/* multiplica a traspuesta por a */
long double ** Simulador :: prodTraspuestas() {
unsigned int filas = seniales->size();
unsigned int columnas = m->getTamanio();
long double ** m = new long double *[columnas];
for(int i = 0; i < columnas; i++) {
m[i] = new long double [columnas];
}
long double * aux = new long double[filas];
for(int i = 0; i < columnas; i++) {
/* "cacheamos" una columna para que la acceda linealmente sin dobles saltos */
for(int t = 0; t < filas; t++){
aux[t] = a[t][i];
}
for(int j = 0; j <= i; j++) {
long double acum = 0;
for(int k = 0; k < filas; k++) {
acum = acum + aux[k]*a[k][j];
}
m[i][j] = acum;
m[j][i] = acum;
}
}
return m;
}
/* multiplica b por a^t */
long double * Simulador :: prodPorTraspuesta(int filas, int columnas) {
unsigned int filas = seniales->size();
unsigned int columnas = m->getTamanio();
long double * d = new long double[columnas];
for(int i = 0; i < columnas; i++) {
long double acum = 0;
for(int j = 0; j < filas; j++) {
acum = acum + a[j][i]*b[j];
}
d[i] = acum;
}
return d;
}