From 2662cd51a32cf8292ccce555f64880f460108d2d Mon Sep 17 00:00:00 2001
From: AlexeyAB <alexeyab84@gmail.com>
Date: Tue, 28 Mar 2017 10:57:27 +0000
Subject: [PATCH] Fixed sequence of freeing memory.

---
 src/matrix.c |  121 ++++++++++++++++++++++++++++++++-------
 1 files changed, 98 insertions(+), 23 deletions(-)

diff --git a/src/matrix.c b/src/matrix.c
index 562a364..ee14979 100644
--- a/src/matrix.c
+++ b/src/matrix.c
@@ -13,14 +13,76 @@
     free(m.vals);
 }
 
+float matrix_topk_accuracy(matrix truth, matrix guess, int k)
+{
+    int *indexes = calloc(k, sizeof(int));
+    int n = truth.cols;
+    int i,j;
+    int correct = 0;
+    for(i = 0; i < truth.rows; ++i){
+        top_k(guess.vals[i], n, k, indexes);
+        for(j = 0; j < k; ++j){
+            int class = indexes[j];
+            if(truth.vals[i][class]){
+                ++correct;
+                break;
+            }
+        }
+    }
+    free(indexes);
+    return (float)correct/truth.rows;
+}
+
+void scale_matrix(matrix m, float scale)
+{
+    int i,j;
+    for(i = 0; i < m.rows; ++i){
+        for(j = 0; j < m.cols; ++j){
+            m.vals[i][j] *= scale;
+        }
+    }
+}
+
+matrix resize_matrix(matrix m, int size)
+{
+    int i;
+    if (m.rows == size) return m;
+    if (m.rows < size) {
+        m.vals = realloc(m.vals, size*sizeof(float*));
+        for (i = m.rows; i < size; ++i) {
+            m.vals[i] = calloc(m.cols, sizeof(float));
+        }
+    } else if (m.rows > size) {
+        for (i = size; i < m.rows; ++i) {
+            free(m.vals[i]);
+        }
+        m.vals = realloc(m.vals, size*sizeof(float*));
+    }
+    m.rows = size;
+    return m;
+}
+
+void matrix_add_matrix(matrix from, matrix to)
+{
+    assert(from.rows == to.rows && from.cols == to.cols);
+    int i,j;
+    for(i = 0; i < from.rows; ++i){
+        for(j = 0; j < from.cols; ++j){
+            to.vals[i][j] += from.vals[i][j];
+        }
+    }
+}
+
 matrix make_matrix(int rows, int cols)
 {
+    int i;
     matrix m;
     m.rows = rows;
     m.cols = cols;
-    m.vals = calloc(m.rows, sizeof(double *));
-    int i;
-    for(i = 0; i < m.rows; ++i) m.vals[i] = calloc(m.cols, sizeof(double));
+    m.vals = calloc(m.rows, sizeof(float *));
+    for(i = 0; i < m.rows; ++i){
+        m.vals[i] = calloc(m.cols, sizeof(float));
+    }
     return m;
 }
 
@@ -30,7 +92,7 @@
     matrix h;
     h.rows = n;
     h.cols = m->cols;
-    h.vals = calloc(h.rows, sizeof(double *));
+    h.vals = calloc(h.rows, sizeof(float *));
     for(i = 0; i < n; ++i){
         int index = rand()%m->rows;
         h.vals[i] = m->vals[index];
@@ -39,9 +101,9 @@
     return h;
 }
 
-double *pop_column(matrix *m, int c)
+float *pop_column(matrix *m, int c)
 {
-    double *col = calloc(m->rows, sizeof(double));
+    float *col = calloc(m->rows, sizeof(float));
     int i, j;
     for(i = 0; i < m->rows; ++i){
         col[i] = m->vals[i][c];
@@ -55,30 +117,43 @@
 
 matrix csv_to_matrix(char *filename)
 {
-	FILE *fp = fopen(filename, "r");
-	if(!fp) file_error(filename);
+    FILE *fp = fopen(filename, "r");
+    if(!fp) file_error(filename);
 
     matrix m;
     m.cols = -1;
 
-	char *line;
+    char *line;
 
-	int n = 0;
-	int size = 1024;
-	m.vals = calloc(size, sizeof(double*));
-	while((line = fgetl(fp))){
+    int n = 0;
+    int size = 1024;
+    m.vals = calloc(size, sizeof(float*));
+    while((line = fgetl(fp))){
         if(m.cols == -1) m.cols = count_fields(line);
-		if(n == size){
-			size *= 2;
-			m.vals = realloc(m.vals, size*sizeof(double*));
-		}
-		m.vals[n] = parse_fields(line, m.cols);
-		free(line);
-		++n;
-	}
-	m.vals = realloc(m.vals, n*sizeof(double*));
+        if(n == size){
+            size *= 2;
+            m.vals = realloc(m.vals, size*sizeof(float*));
+        }
+        m.vals[n] = parse_fields(line, m.cols);
+        free(line);
+        ++n;
+    }
+    m.vals = realloc(m.vals, n*sizeof(float*));
     m.rows = n;
-	return m;
+    return m;
+}
+
+void matrix_to_csv(matrix m)
+{
+    int i, j;
+
+    for(i = 0; i < m.rows; ++i){
+        for(j = 0; j < m.cols; ++j){
+            if(j > 0) printf(",");
+            printf("%.17g", m.vals[i][j]);
+        }
+        printf("\n");
+    }
 }
 
 void print_matrix(matrix m)

--
Gitblit v1.10.0