Mnożenie Macierzy c++

Mnożenie Macierzy c++
PN
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 10 lat
  • Postów:19
0

Witam mam kawałek kodu:

Kopiuj
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ś:

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

ale przy mnożeniu

Kopiuj
 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

Kopiuj
 działa tak jak opisałem wcześniej czyli tworzy macierz wielkości macierzy A.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Szczecin
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:

Kopiuj
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.


edytowany 1x, ostatnio: kq
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
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)

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
kq
Jeśli 3 jest poprawne to typ został źle nazwany, powinno być Komórka, a nie Macierz.
_13th_Dragon
Racja, bezmyślnie skopiowałem z postu wyżej, miałem na myśli że wymiary poprawne.
PN
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 10 lat
  • Postów:19
0

Moje ustaw wygląda w ten sposób

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

Używam go do przypisywania wartości.

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

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

Kopiuj
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

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

bo wcześniej zapomniałem

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
2

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

Kopiuj
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;


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
PN
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 10 lat
  • Postów:19
0

Chyba nie rozumiem tego kodu :/

_13th_Dragon
No to mów której części nie rozumiesz to ci wyjaśnię.
PN
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 10 lat
  • Postów:19
0
Kopiuj
Matrix(const Matrix &m):Y(m.Y),X(m.X),mem(new double[Y*X])
 
edytowany 1x, ostatnio: programer_new

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.