Operator+ overloading, 2D Vector

OP #7459226
Lesenswert?

Hallo,

ich habe ein Problem mit dem operator overloading. ich habe 2 Matrizen die ich in der main() addieren möchte,

Matrix x; Matrix y; Matrix result;

// eingabe wird über cin>> gehandelt... x.a[2][2] = {{2, 2}, {2, 2}} y.a[2][2] = {{1, 2}, {3, 4}}

result=x+y; // result soll {{3,4},{5,6}} ausgeben

1
class Matrix{    
2
    public:
3
        std::vector<std::vector<int>>  a;
4
        Matrix operator+(const Matrix& f_object)
5
        {
6
            Matrix result;
7
            int i = 0;
8

9
            for(int y = 0; y<a.size(); y++)
10
            {
11
                for(int z = 0; z<a[y].size(); z++)
12
                {
13
                    cout<<"a[y][z]: "<<a[y][z]<<endl;//dieser Kommentar wird noch angezeigt
14
                    result.a[y][z]=(a[y][z] + f_object.a[y][z]); // hier kommt der Absturz
15
                    cout << "f_object.a["<<y<<"]"<<"["<<i<<"]: "<< f_object.a[y][i] << endl; // dieser Kommentar nicht mehr
16
                }
17
            }
18
            return result;
19
        }
20
};

habe ich was übersehen,

#7459235
Lesenswert?

Wie stellst Du sicher, dass a und f_object.a die selbe Dimension haben? Du nimmst die Größe der ersten Dimension von f_object.a und die Größe der zweiten Dimension von a als Iterationsgrenzen für beide Arrays. Was passiert, wenn die erste Dimension von a aber kleiner ist als von f_object.a...

OP #7459250
Lesenswert?

Andreas M. schrieb:

Wie stellst Du sicher, dass a und f_object.a die selbe Dimension haben? Du nimmst die Größe der ersten Dimension von f_object.a und die Größe der zweiten Dimension von a als Iterationsgrenzen für beide Arrays. Was passiert, wenn die erste Dimension von a aber kleiner ist als von f_object.a...

hast natürlich recht, habe jetzt überall a als Referenz genommen. die Grössen der Matrizen sind fest definiert, daher checke ich zur Zeit nicht ob die Grösse gleich ist.

also so funktioniert es, ich verstehe aber nicht ganz warum der 2D Array Ansatz nicht tut;

1
        Matrix operator+(const Matrix& f_object)
2
        {
3
            Matrix result;
4
            int i = 0;
5

6
            for(int y = 0; y<a.size(); y++)
7
            {
8
               std::vector<int> temp;
9
                for(int z = 0; z<a[y].size(); z++)
10
                {
11
                //    result.a[y][z]=(a[y][z] + f_object.a[y][z]);
12
                     temp.push_back(a[y][z] + f_object.a[y][z]);
13
                }
14

15
               result.a.push_back(temp);
16
            }
17
            return result;
18
        }
#7459348
Lesenswert?

Wilhelm M. schrieb:

Denn ein Matrix<42, 43, std::string> macht ggf. wenig Sinn.

Stimmt natürlich. Würde aber Kompilieren :)

1
    Matrix<3, 3, std::string> matrixA({ {"1", "2", "3"}, {"4", "5", "6"}, {"7", "8", "9"} });
2
    Matrix<3, 3, std::string> matrixB({ {"9", "8", "7"}, {"6", "5", "4"}, {"3", "2", "1"} });
3

4
    Matrix<3, 3, std::string> matrixC = matrixA + matrixB;
5

6
    std::cout << "Matrix A:\n" << matrixA;
7
    std::cout << "Matrix B:\n" << matrixB;
8
    std::cout << "Matrix C (A + B):\n" << matrixC;

-->

1
Matrix A:
2
1 2 3 
3
4 5 6 
4
7 8 9 
5
Matrix B:
6
9 8 7 
7
6 5 4 
8
3 2 1 
9
Matrix C (A + B):
10
19 28 37 
11
46 55 64 
12
73 82 91

🤡

#7459352
Lesenswert?

Michael S. schrieb:

PS. danke fürs Template

Hier noch eine Ergänzung für die Klasse:

1
    Matrix<cols, rows, T> transpose() const {
2
        Matrix<cols, rows, T> result;
3

4
        for (size_t i = 0; i < rows; i++) {
5
            for (size_t j = 0; j < cols; j++) {
6
                result[j][i] = data[i][j];
7
            }
8
        }
9

10
        return result;
11
    }

Für den Lern-Effekt, wie dir der Compiler mit Templates da hilft Fehler schon zur Compile-Zeit zu vermeiden. Für Nicht-Quadratische Matrizen gibt transpose einen anderen Datentyp zurück...

#7459431
Lesenswert?

Rolf M. schrieb:

Wilhelm M. schrieb:

Εrnst B. schrieb:

Und der Matrix()-Konstruktor hat dann nix mehr zu tun.

Falls Du den cctor meinst: nein.

Ich weiß nicht, was das sein soll,

die übliche Bezeichnung für copy-constructor

aber er meint offenbar den default-Konstruktor Matrix() (wie er ja auch schreibt), der in der aktuellen Version dafür sorgt, dass die Vektoren ihren Speicher allokieren.

... den ich dann irgendwie übersehen hatte ...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren