#include #include #include #include #include #include void print_matrix(const uint64_t row_length, const uint64_t column_length, const uint64_t matrix[row_length][column_length]) { for (uint64_t column_index=0; column_index < column_length; column_index++) { for (uint64_t row_index=0; row_index < row_length; row_index++) { printf("%lu ", matrix[row_index][column_index]); } puts(""); } } int gemm_basic(const uint64_t row_length1, const uint64_t column_length1, const uint64_t matrix1[row_length1][column_length1], const uint64_t row_length2, const uint64_t column_length2, const uint64_t matrix2[row_length2][column_length2], uint64_t output_matrix[row_length1][column_length2]) { if (row_length1 != column_length2) { return 1; } uint64_t sum; for (uint64_t i = 0; i < row_length1; i++) { for (uint64_t j = 0; j < column_length2; j++) { sum = 0; for (uint64_t k = 0; k < row_length1; k++) { sum += matrix1[i][k] * matrix2[k][j]; } output_matrix[i][j] = sum; } } return 0; } int read_csv(const char *file_name, const uint64_t row_length, const uint64_t column_length, uint64_t output_matrix[row_length][column_length]) { FILE *file_ptr; uint64_t bufsize = row_length*2+1; // have to account for delimiters char buffer[bufsize]; char *value, *file_line; uint64_t row_index = 0, column_index = 0; file_ptr = fopen(file_name, "r"); if (file_ptr == NULL) { puts("Unable to open csv"); return 1; } while ((file_line = fgets(buffer, bufsize, file_ptr)) != NULL) { // This shit is just needed and I dont know why file_line[strcspn(file_line, "\n")] = 0; value = strtok(file_line, ";,"); // for some reason there are two NULLs at the end of a line // and I dont wanna increment the column_index if (value == NULL) { continue; } while (value != NULL) { output_matrix[row_index++][column_index] = strtoul(value, NULL, 0); value = strtok(NULL, ";,"); } row_index = 0; column_index++; } fclose(file_ptr); return 0; }