Mnożenie Macierzy c++

0

Witam mam kawałek kodu:

Macierz Macierz::operator*(const Macierz& B) const
{
    int s;
    double tab_tmp[Wiersze()][Kolumny()];
    Macierz c(Wiersze(), Kolumny());
    for(int i=0;i<Wiersze();i++)
        for(int j=0;j<Kolumny();j++){
             s = 0;
    for(int k=0;k<2;k++) //TODO
        s=s+Pobierz(i,k) * B.Pobierz(k,j);
    tab_tmp[i][j]=s;
    c.Ustaw(tab_tmp[i][j],i,j);
        }
    return c;
} 

Który jest odpowiedzialny za mnożenie macierzy i tu rodzi się mój problem bo o ile w przypadku dodawania macierze A i B muszą być takie same to tu jest np konfiguracja 3x2 * 2x3 i nie wiem jak zrobić żeby wynikiem była macierz 3x3 chciałem dodać takie coś:

Macierz C[A.Wiersze()][B.Kolumny()];

ale przy mnożeniu

 C= A * B 

wywala błąd incompatible types in assignment of 'Macierz' to 'Macierz [(((sizetype)<anonymous>) + 1)][(((sizetype)<anonymous>) + 1)]' jeśli nie podam wielkości macierzy tylko automatycznie stworzy w przypadku Macierz C = A * B

 działa tak jak opisałem wcześniej czyli tworzy macierz wielkości macierzy A.
0

W C++ nie możesz mieć tablicy o dynamicznej wielkości, musi ona być znana w czasie kompilacji.

Zamiast tego możesz użyć std::vector i array_view lub po prostu wektora wektorów.

Tak przy okazji:

Macierz C[a][b]

To tablica macierzy, a nie macierz o wielkości a,b. Wielkość macierzy powinieneś ustalać w konstruktorze lub zaszywać w typie.

0
  1. Pokaż jak przydzielasz pamięć dla macierzy powinno być tak: double *mem=new double[Y*X];
  2. Zacznij od sprawdzenia czy A.Kolumny()=B.Wiersze() jak nie to wyjątek;
  3. To: Macierz C(A.Wiersze(),B.Kolumny()); jest poprawne;
  4. Zaś pętle już nie są poprawne, powinno być: C.Wiersze() C.Kolumny() B.Wiersze()
  5. Pozbądź się tego ustaw zamień go na double &at(size_t y,size_t x)
0

Moje ustaw wygląda w ten sposób

void Macierz::Ustaw(double wartosc,int i, int j){
    tab[i][j]=wartosc;
} 

Używam go do przypisywania wartości.

for(int k=0;k<2;k++) //TODO

w tej linijce jest błąd miało być

for(int k=0;k<(kolumny macierzy A);k++) 

Ale nie wiem jak to zapisać bo pobieram A.Wiersze i B.Kolumny do tego i nie mam dostępu do A.Kolumny.

A jeszcze do kodu dołączam

double Macierz::Pobierz(int x, int y ) const
{
    return tab[x][y];
}

bo wcześniej zapomniałem

2

Pisano z palca, ale nie powinno być dużo błędów:

class Matrix
  {
   private:
   size_t Y,X;
   double *mem;
   public:
   Matrix(size_t Y=1,size_t X=1):Y(Y),X(X),mem(new double[Y*X]) {}
   Matrix(const Matrix &m):Y(m.Y),X(m.X),mem(new double[Y*X]) { memcpy(mem,m.mem,Y*X*sizeof(double)); }
   Matrix &operator=(const Matrix &m) { Matrix tmp(m); swap(tmp); return *this; }
   void swap(Matrix &m) { ::swap(Y,m.Y); ::swap(X,m.X); ::swap(mem,m.mem); }
   const double &at(size_t y,size_t x)const { return mem[y*X+x]; }
   double &at(size_t y,size_t x) { return mem[y*X+x]; }
   const double *operator[](size_t y)const { return mem+y*X; }
   double *operator[](size_t y) { return mem+y*X; }
   size_t rows()const { return Y; }
   size_t cols()const { return X; }
   ~Matrix() { delete[] mem; }
  };

Zauważ że at() możesz używać również po lewej stronie, np: Matrix m(10,10); m.at(9,9)=999; oraz nawiasy kwadratowe: Matrix m(10,10); m[9][9]=999;

0

Chyba nie rozumiem tego kodu :/

0
Matrix(const Matrix &m):Y(m.Y),X(m.X),mem(new double[Y*X])
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1