From d4375c31e8ea82684a90a7bdb441a64ef5c5cc37 Mon Sep 17 00:00:00 2001 From: hallerni98888 Date: Tue, 11 Nov 2025 14:09:06 +0100 Subject: [PATCH] changes? --- imageInput.c | 189 +++++++++++++++++++------------------ matrix.c | 252 ++++++++++++++++++++++++------------------------- matrix.h | 52 +++++----- runMatrixTests | Bin 0 -> 63496 bytes 4 files changed, 247 insertions(+), 246 deletions(-) create mode 100755 runMatrixTests diff --git a/imageInput.c b/imageInput.c index 1274e3a..6df604d 100644 --- a/imageInput.c +++ b/imageInput.c @@ -1,95 +1,96 @@ -#include -#include -#include -#include "imageInput.h" - -#define BUFFER_SIZE 100 -#define FILE_HEADER_STRING "__info2_image_file_format__" - -// TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei - -// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen -GrayScaleImageSeries *readImages(const char *path) -{ - // GrayScaleImageSeries *series = NULL; - - // return series; - - FILE *file = fopen(path, "rb"); - if (file == NULL) { - return NULL; // Datei existiert nicht oder konnte nicht geöffnet werden - } - - // Überprüfe den Dateitag - char fileTag[25]; - fread(fileTag, sizeof(fileTag[0]), 24, file); - fileTag[24] = '\0'; // Null-Terminierung des Strings - - if (strcmp(fileTag, "__info2_image_file_format__") != 0) { - fclose(file); - return NULL; // Ungültiges Dateiformat - } - - // Lese die Metadaten: Anzahl der Bilder, Breite und Höhe - unsigned short numberOfImages, width, height; - fread(&numberOfImages, sizeof(numberOfImages), 1, file); - fread(&width, sizeof(width), 1, file); - fread(&height, sizeof(height), 1, file); - - // Speicher für die Bildserie und die Bilddaten allozieren - GrayScaleImageSeries *series = (GrayScaleImageSeries *)malloc(sizeof(GrayScaleImageSeries)); - if (series == NULL) { - fclose(file); - return NULL; // Speicher konnte nicht allokiert werden - } - - series->count = numberOfImages; - series->images = (GrayScaleImage *)malloc(numberOfImages * sizeof(GrayScaleImage)); - series->labels = (unsigned char *)malloc(numberOfImages * sizeof(unsigned char)); - - if (series->images == NULL || series->labels == NULL) { - free(series); - fclose(file); - return NULL; // Speicher konnte nicht allokiert werden - } - - // Lese die Bilddaten und die Labels - for (int i = 0; i < numberOfImages; i++) { - series->images[i].width = width; - series->images[i].height = height; - series->images[i].buffer = (GrayScalePixelType *)malloc(width * height * sizeof(GrayScalePixelType)); - - if (series->images[i].buffer == NULL) { - // Fehlerbehandlung: Speicher freigeben, wenn Allocation fehlschlägt - for (int j = 0; j < i; j++) { - free(series->images[j].buffer); - } - free(series->images); - free(series->labels); - free(series); - fclose(file); - return NULL; - } - - // Lese die Pixel-Daten und das Label - fread(series->images[i].buffer, sizeof(GrayScalePixelType), width * height, file); - fread(&series->labels[i], sizeof(unsigned char), 1, file); - } - - fclose(file); - return series; -} - -// TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt -void clearSeries(GrayScaleImageSeries *series) -{ - if (series == NULL) return; - - for (int i = 0; i < series->count; i++) { - free(series->images[i].buffer); // Speicher für das Bild freigeben - } - - free(series->images); // Speicher für die Bild-Array freigeben - free(series->labels); // Speicher für die Labels freigeben - free(series); +#include +#include +#include +#include "imageInput.h" + +#define BUFFER_SIZE 100 +#define FILE_HEADER_STRING "__info2_image_file_format__" + +// TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei + +// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen +GrayScaleImageSeries *readImages(const char *path) +{ + // GrayScaleImageSeries *series = NULL; + + // return series; + + FILE *file = fopen(path, "rb"); + if (file == NULL) { + return NULL; // Datei existiert nicht oder konnte nicht geöffnet werden + } + + // Überprüfe den Dateitag + char fileTag[25]; + fread(fileTag, sizeof(fileTag[0]), 24, file); + fileTag[24] = '\0'; // Null-Terminierung des Strings + + if (strcmp(fileTag, "__info2_image_file_format__") != 0) { + fclose(file); + return NULL; // Ungültiges Dateiformat + } + + // Lese die Metadaten: Anzahl der Bilder, Breite und Höhe + unsigned short numberOfImages, width, height; + fread(&numberOfImages, sizeof(numberOfImages), 1, file); + fread(&width, sizeof(width), 1, file); + fread(&height, sizeof(height), 1, file); + + // Speicher für die Bildserie und die Bilddaten allozieren + GrayScaleImageSeries *series = (GrayScaleImageSeries *)malloc(sizeof(GrayScaleImageSeries)); + if (series == NULL) { + fclose(file); + return NULL; // Speicher konnte nicht allokiert werden + } + + series->count = numberOfImages; + series->images = (GrayScaleImage *)malloc(numberOfImages * sizeof(GrayScaleImage)); + series->labels = (unsigned char *)malloc(numberOfImages * sizeof(unsigned char)); + + if (series->images == NULL || series->labels == NULL) { + free(series); + fclose(file); + return NULL; // Speicher konnte nicht allokiert werden + } + + // Lese die Bilddaten und die Labels + for (int i = 0; i < numberOfImages; i++) { + series->images[i].width = width; + series->images[i].height = height; + series->images[i].buffer = (GrayScalePixelType *)malloc(width * height * sizeof(GrayScalePixelType)); + + if (series->images[i].buffer == NULL) { + // Fehlerbehandlung: Speicher freigeben, wenn Allocation fehlschlägt + for (int j = 0; j < i; j++) + { + free(series->images[j].buffer); + } + free(series->images); + free(series->labels); + free(series); + fclose(file); + return NULL; + } + + // Lese die Pixel-Daten und das Label + fread(series->images[i].buffer, sizeof(GrayScalePixelType), width * height, file); + fread(&series->labels[i], sizeof(unsigned char), 1, file); + } + + fclose(file); + return series; +} + +// TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt +void clearSeries(GrayScaleImageSeries *series) +{ + if (series == NULL) return; + + for (int i = 0; i < series->count; i++) { + free(series->images[i].buffer); // Speicher für das Bild freigeben + } + + free(series->images); // Speicher für die Bild-Array freigeben + free(series->labels); // Speicher für die Labels freigeben + free(series); } \ No newline at end of file diff --git a/matrix.c b/matrix.c index 4783a81..7512d1d 100644 --- a/matrix.c +++ b/matrix.c @@ -1,127 +1,127 @@ -#include -#include -#include "matrix.h" - -// TODO Matrix-Funktionen implementieren - -Matrix createMatrix(unsigned int rows, unsigned int cols) -{ - Matrix m = {0, 0, NULL}; - - if (rows > 0 && cols > 0) - { - m.rows = rows; - m.cols = cols; - m.buffer = malloc(rows * cols * sizeof(int)); - } - - return m; -} - -void clearMatrix(Matrix *matrix) -{ - - if (matrix == NULL) - { - return; - } - - // Speicher freigeben, falls vorhanden - free(matrix->buffer); - matrix->buffer = NULL; - - // Metadaten zurücksetzen - matrix->rows = 0; - matrix->cols = 0; -} - -void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx) -{ - matrix.buffer[rowIdx * matrix.cols + colIdx] = value; // setzte Matrix auf den Wert value am Punkt (row col) -} - -MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx) -{ - MatrixType value = 0; - - if (rowIdx < matrix.rows && colIdx < matrix.cols) - { - value = matrix.buffer[rowIdx * matrix.cols + colIdx]; // hole Wert value am Punkt (row col) - } - - return value; -} - -Matrix add(const Matrix matrix1, const Matrix matrix2) -{ - Matrix result = {0}; - - if (matrix1.rows != matrix2.rows || matrix1.cols != matrix2.cols) - { - return result; - } - - result.rows = matrix1.rows; - result.cols = matrix1.cols; - result.buffer = malloc(result.rows * result.cols * sizeof(MatrixType)); - - // wenn buffer nicht allokiert werden kann dann zurücksetzen und abbrechen - if (result.buffer == NULL) - { - result.rows = result.cols = 0; - - return result; - } - - // Matritzenaddition - for (unsigned int i = 0; i < result.rows; i++) - { - for (unsigned int j = 0; j < result.cols; j++) - { - result.buffer[i * result.cols + j] = matrix1.buffer[i * matrix1.cols + j] + matrix2.buffer[i * matrix2.cols + j]; - } - } - return result; -} - -Matrix multiply(const Matrix matrix1, const Matrix matrix2) -{ - Matrix result = {0}; - - if (matrix1.cols != matrix2.rows) - { - return result; - } - - result.rows = matrix1.rows; - result.cols = matrix2.cols; - result.buffer = malloc(result.rows * result.cols * sizeof(MatrixType)); - - // wenn buffer nicht allokiert werden kann dann zurücksetzen und abbrechen - if (result.buffer == NULL) - { - result.rows = result.cols = 0; - - return result; - } - - // Matritzenmultiplikation - - for (int r = 0; r < result.rows; r++) // Zeile in Ergebnis - { - for (int m = 0; m < result.cols; m++) // Spalte in Ergebnis - { - MatrixType sum = 0; - - for (int n = 0; n < matrix1.cols; n++) - { - sum += matrix1.buffer[r * matrix1.cols + n] * - matrix2.buffer[n * matrix2.cols + m]; - } - - result.buffer[r * result.cols + m] = sum; - } - } - - return result; +#include +#include +#include "matrix.h" + +// TODO Matrix-Funktionen implementieren + +Matrix createMatrix(unsigned int rows, unsigned int cols) +{ + Matrix m = {0, 0, NULL}; + + if (rows > 0 && cols > 0) + { + m.rows = rows; + m.cols = cols; + m.buffer = malloc(rows * cols * sizeof(int)); + } + + return m; +} + +void clearMatrix(Matrix *matrix) +{ + + if (matrix == NULL) + { + return; + } + + // Speicher freigeben, falls vorhanden + free(matrix->buffer); + matrix->buffer = NULL; + + // Metadaten zurücksetzen + matrix->rows = 0; + matrix->cols = 0; +} + +void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx) +{ + matrix.buffer[rowIdx * matrix.cols + colIdx] = value; // setzte Matrix auf den Wert value am Punkt (row col) +} + +MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx) +{ + MatrixType value = 0; + + if (rowIdx < matrix.rows && colIdx < matrix.cols) + { + value = matrix.buffer[rowIdx * matrix.cols + colIdx]; // hole Wert value am Punkt (row col) + } + + return value; +} + +Matrix add(const Matrix matrix1, const Matrix matrix2) +{ + Matrix result = {0}; + + if (matrix1.rows != matrix2.rows || matrix1.cols != matrix2.cols) + { + return result; + } + + result.rows = matrix1.rows; + result.cols = matrix1.cols; + result.buffer = malloc(result.rows * result.cols * sizeof(MatrixType)); + + // wenn buffer nicht allokiert werden kann dann zurücksetzen und abbrechen + if (result.buffer == NULL) + { + result.rows = result.cols = 0; + + return result; + } + + // Matritzenaddition + for (unsigned int i = 0; i < result.rows; i++) + { + for (unsigned int j = 0; j < result.cols; j++) + { + result.buffer[i * result.cols + j] = matrix1.buffer[i * matrix1.cols + j] + matrix2.buffer[i * matrix2.cols + j]; + } + } + return result; +} + +Matrix multiply(const Matrix matrix1, const Matrix matrix2) +{ + Matrix result = {0}; + + if (matrix1.cols != matrix2.rows) + { + return result; + } + + result.rows = matrix1.rows; + result.cols = matrix2.cols; + result.buffer = malloc(result.rows * result.cols * sizeof(MatrixType)); + + // wenn buffer nicht allokiert werden kann dann zurücksetzen und abbrechen + if (result.buffer == NULL) + { + result.rows = result.cols = 0; + + return result; + } + + // Matritzenmultiplikation + + for (int r = 0; r < result.rows; r++) // Zeile in Ergebnis + { + for (int m = 0; m < result.cols; m++) // Spalte in Ergebnis + { + MatrixType sum = 0; + + for (int n = 0; n < matrix1.cols; n++) + { + sum += matrix1.buffer[r * matrix1.cols + n] * + matrix2.buffer[n * matrix2.cols + m]; + } + + result.buffer[r * result.cols + m] = sum; + } + } + + return result; } \ No newline at end of file diff --git a/matrix.h b/matrix.h index fb042ea..a27c11a 100644 --- a/matrix.h +++ b/matrix.h @@ -1,26 +1,26 @@ -#ifndef MATRIX_H -#define MATRIX_H - -#define UNDEFINED_MATRIX_VALUE 0 - -typedef float MatrixType; - -// TODO Matrixtyp definieren - -typedef struct -{ - unsigned int rows; // Anzahl der Zeilen - unsigned int cols; // Anzahl der Spalten - MatrixType *buffer; // Zeiger auf die Matrixdaten -} Matrix; - - -Matrix createMatrix(unsigned int rows, unsigned int cols); -void clearMatrix(Matrix *matrix); -void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx); -MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx); -Matrix add(const Matrix matrix1, const Matrix matrix2); -Matrix multiply(const Matrix matrix1, const Matrix matrix2); - - -#endif +#ifndef MATRIX_H +#define MATRIX_H + +#define UNDEFINED_MATRIX_VALUE 0 + +typedef float MatrixType; + +// TODO Matrixtyp definieren + +typedef struct +{ + unsigned int rows; // Anzahl der Zeilen + unsigned int cols; // Anzahl der Spalten + MatrixType *buffer; // Zeiger auf die Matrixdaten +} Matrix; + + +Matrix createMatrix(unsigned int rows, unsigned int cols); +void clearMatrix(Matrix *matrix); +void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx); +MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx); +Matrix add(const Matrix matrix1, const Matrix matrix2); +Matrix multiply(const Matrix matrix1, const Matrix matrix2); + + +#endif diff --git a/runMatrixTests b/runMatrixTests new file mode 100755 index 0000000000000000000000000000000000000000..4f7fb50429e62ae705d19f36c92bcd2f90026e7b GIT binary patch literal 63496 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 literal 0 HcmV?d00001