diff --git a/CMakeLists.txt b/CMakeLists.txt index f1b596c..847c636 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,3 +4,4 @@ project(c_net C) set(CMAKE_C_STANDARD 11) add_executable(c_net main.c matrix.c image.c) +target_link_libraries(c_net m) diff --git a/image.c b/image.c index 9b138fb..ceb5d19 100644 --- a/image.c +++ b/image.c @@ -59,11 +59,22 @@ void img_print (Image* img) { //print the image matrix_print(img->pixel_values); - - //print the label of the image - printf("%d", img->image_label); + //print the number of the image + printf("Number it is supposed to be: %d\n", img->image_label); } -void img_free (Image* img) { - +void img_free (Img* img) { + //frees the matrix of image (deep free) + matrix_free(img->pixel_values); + //frees the rest of img + free(img); +} + +void images_free (Img** images, int quantity){ + //frees every single image + for(int i=0;i #include +#include +#define MAX_BYTES 100 // operational functions Matrix* matrix_create(int rows, int columns) { @@ -244,6 +246,49 @@ Matrix* transpose(Matrix* matrix) { } +//file operations +void matrix_save(Matrix* matrix, char* file_string){ + FILE *fptr = fopen(file_string, "w+"); + if(!fptr){ + printf("Unable to get handle for \"%s\"", file_string); + exit(1); + } + fprintf(fptr, "%d\n", matrix->rows); + fprintf(fptr, "%d\n", matrix->columns); + + for(int i = 0; i < matrix->rows; i++){ + for(int j = 0; j < matrix->columns; j++){ + fprintf(fptr, "%.10f\n", matrix->numbers[i][j]); + } + } + printf("saved matrix to %s", file_string); + fclose(fptr); +} + +Matrix* matrix_load(char* file_string){ + FILE *fptr = fopen(file_string, "r"); + if(!fptr){ + printf("Could not open \"%s\"", file_string); + exit(1); + } + char buffer[MAX_BYTES]; + + fgets(buffer, MAX_BYTES, fptr); + int rows = (int)strtol(buffer, NULL, 10); + fgets(buffer, MAX_BYTES, fptr); + int cols = (int)strtol(buffer, NULL, 10); + + Matrix *matrix = matrix_create(rows, cols); + + for(int i = 0; i < rows; i++){ + for(int j = 0; j < cols; j++){ + fgets(buffer, MAX_BYTES, fptr); + matrix->numbers[i][j] = strtod(buffer, NULL); + } + } + return matrix; +} + Matrix* matrix_flatten(Matrix* matrix, int axis) { // Axis = 0 -> Column Vector, Axis = 1 -> Row Vector @@ -256,7 +301,7 @@ Matrix* matrix_flatten(Matrix* matrix, int axis) { else if (axis == 1) { result_matrix = matrix_create(1, matrix -> rows * matrix -> columns); } else { - printf("ERROR: Argument must be 1 or 0 (matrix_flatten"); + printf("ERROR: Argument must be 1 or 0 (matrix_flatten)"); exit(EXIT_FAILURE); } for (int i = 0; i < matrix->rows; i++) { @@ -267,3 +312,39 @@ Matrix* matrix_flatten(Matrix* matrix, int axis) { } return result_matrix; } + +int matrix_argmax(Matrix* matrix) { + // Expects a Mx1 matrix + if (matrix->columns != 1){ + printf("ERROR: Matrix is not Mx1 (matrix_argmax)"); + exit(EXIT_FAILURE); + } + double max_value = 0; + int max_index = 0; + for (int i = 0; i < matrix->rows; i++) { + if (matrix->numbers[i][0] > max_value) { + max_value = matrix->numbers[i][0]; + max_index = i; + } + } + return max_index; +} + +void matrix_randomize(Matrix* matrix, int n) { + //make a min and max + int min = -1.0 / sqrt(n); + int max = 1.0 / sqrt(n); + //calculate difference + double difference = max - min; + //move decimal + int scale = 10000; + int scaled_difference = (int)(difference * scale); + //calculate final random int and move decimal back + double random_result = min + (1.0 * (rand() % scaled_difference) / scale ); + + for (int i = 0; i < matrix->rows; i++) { + for (int j = 0; j < matrix->columns; j++) { + matrix->numbers[i][j] = random_result; + } + } +} \ No newline at end of file diff --git a/neuronal_network.cpp b/neuronal_network.cpp new file mode 100644 index 0000000..dcd02e5 --- /dev/null +++ b/neuronal_network.cpp @@ -0,0 +1,3 @@ +// +// Created by danie on 19.09.2023. +// diff --git a/neuronal_network.h b/neuronal_network.h new file mode 100644 index 0000000..c0d14c8 --- /dev/null +++ b/neuronal_network.h @@ -0,0 +1,7 @@ +#pragma once + +typedef struct { + Matrix* input; + Matrix* output; + +} Neuronal_Network; \ No newline at end of file