Mnożenie macierzy zapisanych w jednowymiarowej tablicy.

0

Jest jakiś algorytm, sposób na to? Mam tak zadaną macierz i nie mogę nic wymyślić, próbowałam przepisywać do dwóch pomocniczych macierzy dwuwymiarowych ale z jakiegoś powodu to też nie działa.

class Macierz{
	int *wsk;
	int rozmiar;

public:
Macierz operator * (Macierz b){
        Macierz pom;
        int pomarray1[rozmiar][rozmiar],pomarray2[rozmiar][rozmiar],x=0,z=0;
        if (rozmiar==b.rozmiar){
            pom.rozmiar = rozmiar;
            for (int i=0;i<rozmiar;i++){
                for (int j=0;j<rozmiar;j++){
                    pomarray1[i][j] = wsk[x];
                    pomarray2[i][j] = b.wsk[x];
                    x++;
                }
            }
            cout << pomarray1 << pomarray2 <<endl;
            for (int k=0;k<rozmiar;k++){
                for (int l=0;l<rozmiar;l++){
                    pom.wsk[z]=0;
                    for (int m=0;m<rozmiar;m++){
                        pom.wsk[z] += pomarray1[k][m]*pomarray2[m][l];
                    }
                    z++;
                }
            }


        }
        return pom;
    }
};

Kod się kompiluje ale gdzieś jest błąd bo nie działa tak jak powinien, doszłam do tego że jest on w przepisywaniu tablicy jednowymiarowej do dwuwymiarowej. Niżej przepisanie tablicy[9] do tablicy [3][3], ktoś wie czemu nie działa?


#include <iostream>
#include <stdio.h>

using namespace std;

int main(){
    int tab1[9];
    int tab2[3][3];
    int x,m;

    for (int i=0;i<9;i++){
        scanf("%d",&tab1[i]);
    }
    for (int j=0;j<9;j++){
        cout << tab1[j] <<endl;
    }

    for (int k=0;k<3;k++){
        for (m=0;m<3;m++){
            tab2[k][m] = tab1[x];
            x = x+1;
        }
    }
    for (int l=0;l<3;l++){
        for (int n=0;n<3;n++){
            cout << tab2[l][n] << endl;
        }
    }
    return 0;

}



0
    int x,m;

x i m są niezainicjalizowane. Ich odczyt to UB, najczęściej będzie to wyglądało jak by miały "losowe" wartości.

0

Tak, racja, dziękuję. Poprawiłam to i sprowadziłam ten pomocniczy program do takiej samej formy jak ten operator, są dwie tablice dwuwymiarowe i trzy jednowymiarowe, na nich wszystko działa jak powinno:

#include <iostream>
#include <stdio.h>

using namespace std;

int main(){
    int tab1[9];
    int tab2[3][3];
    int tab4[3][3];
    int tab3[9];
    int tabwynik[9];
    int x=0,m,k,index=0;

    for (int i=0;i<9;i++){
        scanf("%d",&tab1[i]);
    }
     for (int p=0;p<9;p++){
        scanf("%d",&tab3[p]);
    }
    for (int j=0;j<9;j++){
        cout << tab1[j] <<endl;
    }
    for (int o=0;o<9;o++){
        cout << tab3[o] <<endl;
    }

    for (k=0;k<3;k++){
        for (m=0;m<3;m++){
            tab2[k][m] = tab1[x];
            tab4[k][m] = tab3[x];
            x++;
         }
    }
    for (int l=0;l<3;l++){
        for (int n=0;n<3;n++){
            cout << tab2[l][n] <<" "<< tab4[l][n] <<endl;
        }
    }

    for (int q=0;q<3;q++){
        for (int r=0;r<3;r++){
            tabwynik[index] = 0;
            for (int g=0;g<3;g++){
                tabwynik[index] = tabwynik[index] + (tab2[q][g]*tab4[g][r]);
            }
            index++;
        }

    }
    for (int ff=0;ff<9;ff++){
        cout << tabwynik[ff] <<endl;
    }
    return 0;

}

Jednak jak przełożyłam to na operator to bez zmian, doszłam do tego że coś psuje się w pętli która robi to mnożenie, kod się kompiluje tylko na tym momencie wiesza wszystko. Może mieć to związek z tym że w klasie nie ma jako takiej tablicy jak tutaj tylko jest wskaźnik?

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