void generateIdentityMatrix(Matrix * const M) { size_t rowInd, colInd; for (rowInd = 0; rowInd < M->rowSize; rowInd++) { for (colInd = 0; colInd < M->colSize; colInd++) { if(rowInd == colInd) setMatrixElement(M, rowInd, colInd, 1.0); else setMatrixElement(M, rowInd, colInd, 0.0); } } }
void generateZeroMatrix(Matrix * const M) { size_t rowInd, colInd; for (rowInd = 0; rowInd < M->rowSize; rowInd++) for (colInd = 0; colInd < M->colSize; colInd++) setMatrixElement(M, rowInd, colInd, 0.0); }
void loadMatrix(const char * const fileName, Matrix * const M) { int i, j, rows, cols; FILE * inFile; double value; destructMatrix(M); inFile = fopen(fileName, "r"); if(NULL == inFile) { changeColor("magenta"); printf("=[ I can't find %s\n", fileName); return; } fscanf(inFile, "%i %i", &rows, &cols); M->rowSize = rows; M->colSize = cols; M->grid = (double *) calloc(rows * cols, sizeof(double)); for(i = 0; i < rows; i++) { for(j = 0; j < cols; j++) { fscanf(inFile, "%lg", &value); setMatrixElement(M, i, j, value); } } fclose(inFile); }
Matrix *formMatrixFromFloatVal(const lbfgsfloatval_t *x, size_t nrow, size_t ncol) { Matrix *m = createMatrix(nrow, ncol); for(size_t i=0; i<nrow; i++) { for(size_t j=0; j<ncol; j++) { setMatrixElement(m, i, j, x[j*nrow + i]); } } return(m); }
void generateRandomMatrix(Matrix * const M) { size_t rowInd, colInd; int lowerBound, upperBound; lowerBound = -10; upperBound = 10; for (rowInd = 0; rowInd < M->rowSize; rowInd++) { for (colInd = 0; colInd < M->colSize; colInd++) { double randomValue = lowerBound + (rand() % (upperBound - lowerBound)) + 1; setMatrixElement(M, rowInd, colInd, randomValue); } } }
Matrix* processThroughReceptiveFields(Matrix *ts, const double *centers, const Constants *c) { Matrix *ts_out = createMatrix(c->M, ts->ncol); // printf("%d %d %d", c->M, ts->nrow, c->M % ts->nrow); assert(c->M % ts->nrow == 0); size_t neurons_per_ts = c->M / ts->nrow; size_t i, ri; for(i=0, ri=0; (i < c->M) && (ri < ts->nrow); i+=neurons_per_ts, ri++) { for(size_t ni=i; ni<(i+neurons_per_ts); ni++) { for(size_t vi=0; vi < ts->ncol; vi++) { double val = getMatrixElement(ts, ri, vi); double val_field = c->preproc->gain * exp( - ((centers[ni] - val) * (centers[ni] - val))/c->preproc->sigma ); setMatrixElement(ts_out, ni, vi, val_field); } } } return(ts_out); }
Matrix* calcErrorGrad(Matrix *y, Matrix *w, doubleVector *target, int jobs) { assert(y->ncol == target->size); pthread_t *threads = (pthread_t *) malloc( jobs * sizeof( pthread_t ) ); FiltWorker *workers = (FiltWorker*) malloc( jobs * sizeof(FiltWorker) ); for(size_t wi=0; wi < jobs; wi++) { int points_per_thread = (y->ncol + jobs - 1) / jobs; workers[wi].first = min( wi * points_per_thread, y->ncol ); workers[wi].last = min( (wi+1) * points_per_thread, y->ncol ); workers[wi].y = y; workers[wi].w = w; workers[wi].target = target; } for( int i = 0; i < jobs; i++ ) { P( pthread_create( &threads[i], NULL, error_grad_routine, &workers[i]) ); } for( int i = 0; i < jobs; i++ ) { P( pthread_join( threads[i], NULL) ); } Matrix *dedw = createZeroMatrix(w->nrow, w->ncol); for( size_t wi=0; wi< jobs; wi++) { for(size_t i=0; i<dedw->nrow; i++) { for(size_t j=0; j<dedw->ncol; j++) { incMatrixElement(dedw, i, j, getMatrixElement(workers[wi].dedw, i, j)); } } } for(size_t i=0; i<dedw->nrow; i++) { for(size_t j=0; j<dedw->ncol; j++) { double dedw_acc = getMatrixElement(dedw, i, j); setMatrixElement(dedw, i, j, dedw_acc/target->size); } } free(threads); free(workers); return dedw; }