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