Matrix.hpp 3.52 KB
Newer Older
Mario Bajer's avatar
Mario Bajer committed
1
/** @file Matrix.hpp
2
 *  @brief Enthält die Klasse Matrix und alle ihre Funktionen.
Mario Bajer's avatar
Mario Bajer committed
3
4
5
6
7
8
 *
 *  @author Mario Bajer
 *  @version 2.1
 *  @date 28.05.2020
 * */

9

10
11
#ifndef MATRIX_HPP
#define MATRIX_HPP
Mario Bajer's avatar
cleanup    
Mario Bajer committed
12

13
#include "includes.hpp"
Mario Bajer's avatar
Mario Bajer committed
14
#include <bitset>
Mario Bajer's avatar
cleanup    
Mario Bajer committed
15
16
17

using namespace std;
using namespace cgicc;
18
using json = nlohmann::json;
Mario Bajer's avatar
cleanup    
Mario Bajer committed
19

Mario Bajer's avatar
Mario Bajer committed
20
21
22
/** @class Matrix
 *  @brief Klasse Matrix
 * */
23
class Matrix{
Mario Bajer's avatar
cleanup    
Mario Bajer committed
24
public:
Mario Bajer's avatar
Mario Bajer committed
25
26
27
28
29
    /** @brief Konstruktor für die Matrix Klasse
    *
    *  Initialisiert eine Matrix und speichert diese im Filesystem.
    *  @param x - Spaltenanzahl
    *  @param y - Zeilenanzahl
30
    *  @return liefert eine über x und y definierte Matrix zurück.
Mario Bajer's avatar
Mario Bajer committed
31
32
33
    * */
    Matrix(int x, int y);

34
    /** @brief Ausgeben der Matrix
Mario Bajer's avatar
Mario Bajer committed
35
36
37
38
39
40
41
    *
    *  @param std::ostream& - Ausgabestream für die Matrix
    * */
    void print(std::ostream& a_r0s);

    /** @brief Füllt eine Matrix mit gleichverteilten Zufallswerten
    * */
Mario Bajer's avatar
Mario Bajer committed
42
    void fillRND();
Mario Bajer's avatar
Mario Bajer committed
43

44
    /** @brief Generiert für eine Matrix eine ID auf Basis eines Files (config.json) welches einen Counter gespeichert hat
Mario Bajer's avatar
Mario Bajer committed
45
46
47
    * */
    int generateID();

48
    /** @brief Speichert die Matrix im lokalen Filesystem unter Json/
Mario Bajer's avatar
Mario Bajer committed
49
50
51
    * */
    int saveMatrix();

52
    /** @brief Liest Daten und Metadaten einer Matrix aus einem File und füllt das Matrix-Objekt (Dimension, ID, Matrixelemente)
Mario Bajer's avatar
Mario Bajer committed
53
54
    * */
    void getmatrixfromfile( const string& path);
55

Mario Bajer's avatar
Mario Bajer committed
56
57
    /** @brief Setzt ein Bit an stelle (y,x) auf 1
    * */
Mario Bajer's avatar
Mario Bajer committed
58
    void set(std::size_t x, std::size_t y);
Mario Bajer's avatar
cleanup    
Mario Bajer committed
59

Mario Bajer's avatar
Mario Bajer committed
60
61
    /** @brief Setzt ein Bit an stelle (y,x) auf 0
    * */
Mario Bajer's avatar
Mario Bajer committed
62
    void reset(std::size_t x, std::size_t y);
Mario Bajer's avatar
Mario Bajer committed
63

64
    /** @brief Prüft ob eine Addition möglich ist. (Dimensionen exakt gleich)
Mario Bajer's avatar
Mario Bajer committed
65
66
67
68
     *
     * */
    bool checkAddSub(const Matrix& b) const;

69
    /** @brief Prüft ob eine Multiplikation möglich ist. dimx von Matrix a muss gleich dimy von Matrix b sein.
Mario Bajer's avatar
Mario Bajer committed
70
71
72
73
74
     *
     *  @return bool checkMult - true wenn erlaubt, false falls nicht.
     * */
    bool checkMult(const Matrix& b);

75
    /** @brief Overload des () Operators
Mario Bajer's avatar
Mario Bajer committed
76
77
78
79
80
     *
     *  @param unsigned y - Zeile der Matrix
     *  @param unsigned x - Spalte der Matrix
     *  @return gibt den Wert der Matrix an der Stelle zurück
     * */
Mario Bajer's avatar
Mario Bajer committed
81
82
    inline bool operator()(unsigned x, unsigned y) const {
        std::size_t matrixPos = dimx*x + y;
Mario Bajer's avatar
Mario Bajer committed
83
84
85
86
        const std::size_t arrayPos = matrixPos / (sizeof(uint64_t)*8);
        const std::size_t bitPos = matrixPos % (sizeof(uint64_t)*8);
        const uint64_t pos = 1;
        return data[arrayPos] & (pos << bitPos);
Mario Bajer's avatar
cleanup    
Mario Bajer committed
87
88
    }

Mario Bajer's avatar
Mario Bajer committed
89
90
91
92
93
94
    /** @brief Addition zweier Matrizen durch Overload des + Operators
    *
    *   @param const Matrix& b const
    *   @return Gibt eine Matrix c, das Ergebnis der Addition zweier Matrizen zurück.
    * */
    Matrix operator+(const Matrix& b);
Mario Bajer's avatar
cleanup    
Mario Bajer committed
95

Mario Bajer's avatar
Mario Bajer committed
96
97
98
99
100
101
    /** @brief Subtraktion zweier Matrizen durch Overload des - Operators
    *
    *   @param const Matrix& b
    *   @return Gibt eine Matrix c, das Ergebnis der Subtraktion zweier Matrizen zurück.
    * */
    Matrix operator-(const Matrix& b);
102

Mario Bajer's avatar
Mario Bajer committed
103
104
105
106
107
108
    /** @brief Multiplikation zweier Matrizen durch Overload des * Operators
    *
    *   @param const Matrix& b
    *   @return Gibt eine Matrix c, das Ergebnis der Multiplikation zweier Matrizen zurück.
    * */
    Matrix operator*(const Matrix& b);
109

110
    /** @brief Multithreaded Multiplikation zweier Matrizen
Mario Bajer's avatar
Mario Bajer committed
111
    *
112
113
    *   @param Matrix a, Matrix b, std::size_t from, std::size_t to
    *   @return void
Mario Bajer's avatar
Mario Bajer committed
114
    * */
115
    void threadedmult(Matrix* a, Matrix* b, std::size_t from, std::size_t to);
Mario Bajer's avatar
Mario Bajer committed
116

Mario Bajer's avatar
cleanup    
Mario Bajer committed
117
private:
Mario Bajer's avatar
Mario Bajer committed
118
119
120
121
122
    int ID;
    int dimx;
    int dimy;
    int datasize;
    uint64_t *data;
Mario Bajer's avatar
cleanup    
Mario Bajer committed
123
124
};

125
#endif