• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Stworzenie dynamicznego sposobu na mnożenie dwóch macierzy

VPS Starter Arubacloud
0 głosów
1,197 wizyt
pytanie zadane 11 stycznia 2018 w C i C++ przez must Bywalec (2,980 p.)

Cześć, potrzebuje znaleźć sposób na mnożnienie dwóch macierzy o tym samym wymiarze 3x3, 4x4 etc.

Napisałem coś takiego: 

for(i=0; i<rowlength; i++)
    {
        for(j=0; j<rowlength; j++)
        {
            tab2[i][j] = tab[i][0]*tab1[0][j]+tab[i][1]*tab1[1][j]+tab[i][2]*tab1[2][j];
        }


    }

Tutaj mam stworzony sposób na liczenie macierzy, ale tylko 3x3 gdyż jak widzicie tutaj 

tab[i][2]*tab1[2][j]

Maksymalna liczba to jest 2. 

Żeby troche rozjasnić, dla 4x4 będzie:

for(i=0; i<rowlength; i++)
    {
        for(j=0; j<rowlength; j++)
        {
            tab2[i][j] = tab[i][0]*tab1[0][j]+tab[i][1]*tab1[1][j]+tab[i][2]*tab1[2][j]+tab[i][3]*tab1[3][j];
        }


    }

Dla 5x5:

for(i=0; i<rowlength; i++)
    {
        for(j=0; j<rowlength; j++)
        {
            tab2[i][j] = tab[i][0]*tab1[0][j]+tab[i][1]*tab1[1][j]+tab[i][2]*tab1[2][j]+tab[i][3]*tab1[3][j]+tab[i][4]*tab1[4][j];
        }


    }

Pewnie potrzeubje jakos stworzyć nową zmienną, ale jak to zrobić zeby było okej?

2 odpowiedzi

+1 głos
odpowiedź 11 stycznia 2018 przez Tomasz90 Nałogowiec (25,140 p.)
wybrane 11 stycznia 2018 przez must
 
Najlepsza

Popatrz na rysunek:

Macierze A, B, C mają rozmiar n x n. Mnożysz wiersz macierzy A przez kolumnę macierzy B. W wyniku czego otrzymujesz element macierzy C. Algorytm więc przedstawia się następująco:

for(i = 0; i < n; ++i)
    for(j = 0; j < n; ++j)
        for(k = 0; k < n; ++k)
             C[i][j] += A[i][k] * B[k][j];
1
komentarz 11 stycznia 2018 przez Tomasz90 Nałogowiec (25,140 p.)
No ja wiem po co są wymiary macierzy podawane tylko stwierdzam, że to powinno być zdefiniowane w pliku a nie podawane z klawiatury. Przecież możesz się pomylić i potem złe wyniki otrzymasz.

Ten przykład co podałeś to było mnożenie wektorów. Tak samo jak macierz pomnożysz z wektorem to też wyjdzie wektor.
komentarz 11 stycznia 2018 przez must Bywalec (2,980 p.)
Mimo to dalej wychodzą źle wyniki :/. Widzisz gdzieś jeszcze błąd? Bo teraz warunki się odnoszą i do wierszy i do kolumn, a nie tylko do wierszy.
komentarz 11 stycznia 2018 przez must Bywalec (2,980 p.)
Dobra, już widzę błąd. Ale dzięki za pomoc :)!
1
komentarz 11 stycznia 2018 przez Tomasz90 Nałogowiec (25,140 p.)
ta pętla co ma licznik k ma zły warunek ta druga macierz nie musi być przecież kwadratowa więc col2length nie może tam być tylko to colLength albo row2Length bo one oznaczają u Ciebie ten sam wymiar
komentarz 11 stycznia 2018 przez must Bywalec (2,980 p.)

Tak dokładnie, musiałem tam użyć 

row2length

 

0 głosów
odpowiedź 13 stycznia 2018 przez must Bywalec (2,980 p.)

Wie ktoś może jeszcze tę rzecz. Mam osobno funkcje 

Save

Teraz za pomocą funkcji parametru main, chce podawać przy włączaniu programu w konsoli nazwe pliku wejsciowego i wyjsciowego tzn.: 

./program1 macierz.txt wynik.txt

Jednakże jak przesłać teraz 

 char* argv[]

do funkcji save by działało wszystko poprawnie? bo jak dałem jako argument to nie działało.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{   
    if(argc < 3)
    {
        printf("Za malo argumentow");
        return 0;
    }
    int rowlength,collength,row2length,col2length;
    int row=0,col=0;

    FILE* file;
    file = fopen(argv[1], "r");

    printf("Input number of rows for the first array!");
    scanf("%d",&rowlength);
    printf("Input number of columns for the first array!");
    scanf("%d",&collength);
    printf("Input number of rows for the second array!");
    scanf("%d",&row2length);
    printf("Input number of columns for the second array!");
    scanf("%d",&col2length);



    int tab[rowlength][collength],tab1[row2length][col2length];

    printf("Elements in the text file:\n\n");

    while( fscanf( file, "%d,", &tab[row][col] ) != EOF )  //WCZYTYWANIE WARTOŚCI Z PLIKU TXT DO 2 TABLIC
    {

        printf("%d ", tab[row][col]);

        col++;

        if(col==collength && row==rowlength-1)
        {
            printf("\n\n");
            row=0;
            col=0;

            while( fscanf( file, "%d,", &tab1[row][col] ) != EOF )
            {

                printf("%d ", tab1[row][col]);
                col++;

                if(col==col2length)

                {

                    printf("\n");
                    col=0;
                    row++;

                }
            }
        }
        if(col==collength)
        {

            printf("\n");
            col=0;
            row++;

        }
    }
    printf("\n");

    fclose(file);

    Multiplication(rowlength,collength,row2length,col2length,tab, tab1);

    return 0;
}

int Multiplication(int rowlength, int collength, int row2length, int col2length, int tab[rowlength][collength],int tab1[row2length][col2length]) // MNOŻENIE MACIERZY
{
    int i,j,k;
    int tab2[rowlength][col2length];
    printf("Result of multiplication:\n\n");

    for(i=0; i<rowlength; i++)
    {
        for(j=0; j<col2length; j++)
        {
            tab2[i][j] = 0;
            for(k=0; k<row2length; k++)
            {

                tab2[i][j] += tab[i][k] * tab1[k][j];

            }
        }
    }

    for(i=0; i<row2length; i++)
    {
        for(j=0; j<col2length; j++)
        {

            printf("%d ", tab2[i][j]);

        }
        printf("\n");
    }
    Save(row2length, col2length, tab2);
}
void Save(int row2length, int col2length, int tab2[row2length][col2length]) // ZAPISYWANIE MACIERZY WYNIKOWEJ DO PLIKU
{
    int i,j;
    FILE* file2;
    file2 = fopen(argv[2], "w");
    if(file2==NULL) printf("Can't open the file!");

    else
    {
        fprintf(file2,"The result: n");

        for(i=0; i<row2length; i++)
        {
            for(j=0; j<col2length; j++)
            {

                fprintf(file2,"%d ", tab2[i][j]);

            }

            fprintf(file2,"\n");
        }

        fclose(file2);

    }
}

 

komentarz 13 stycznia 2018 przez Tomasz90 Nałogowiec (25,140 p.)
jako argument funkcji powinno być tak jak w main czyli char* argv[] lub char** argv

Do funkcji przesylasz jako save(argv)
komentarz 13 stycznia 2018 przez must Bywalec (2,980 p.)

A co z wywołaniem funkcji? 

Save(row2length, col2length, tab2, ....?..);

bo wpisuje tam to argv i nie dziala

1
komentarz 13 stycznia 2018 przez Tomasz90 Nałogowiec (25,140 p.)
#include <stdio.h>

void foo(char** arg) {
    printf("%s", arg[1]);
}

int main(int argc, char*argv[]) {
    char* arr[] = { "myprog", "hello", "world", NULL };
    argv = arr;
    foo(argv);
}

coś takiego i działa

komentarz 13 stycznia 2018 przez must Bywalec (2,980 p.)

Oki działa. 

Mógłbyś mi powiedzieć co byś poprawił, procz tego zliczania? Nie mam czasu na zrobienie tego i ogarnianie wskaznikow, za duzo kolokwiow w przyszlym tygodniu jest :P

 

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{

    if(argc < 3)
    {
        printf("Za malo argumentow");
        return 0;
    }
    int rowlength,collength,row2length,col2length;
    int row=0,col=0;

    FILE* file;
    file = fopen(argv[1], "r");

    printf("Input number of rows for the first array!");
    scanf("%d",&rowlength);
    printf("Input number of columns for the first array!");
    scanf("%d",&collength);
    printf("Input number of rows for the second array!");
    scanf("%d",&row2length);
    printf("Input number of columns for the second array!");
    scanf("%d",&col2length);



    int tab[rowlength][collength],tab1[row2length][col2length];

    printf("Elements in the text file:\n\n");

    while( fscanf( file, "%d,", &tab[row][col] ) != EOF )  //WCZYTYWANIE WARTOŚCI Z PLIKU TXT DO 2 TABLIC
    {

        printf("%d ", tab[row][col]);

        col++;

        if(col==collength && row==rowlength-1)
        {
            printf("\n\n");
            row=0;
            col=0;

            while( fscanf( file, "%d,", &tab1[row][col] ) != EOF )
            {

                printf("%d ", tab1[row][col]);
                col++;

                if(col==col2length)

                {

                    printf("\n");
                    col=0;
                    row++;

                }
            }
        }
        if(col==collength)
        {

            printf("\n");
            col=0;
            row++;

        }
    }
    printf("\n");

    fclose(file);

    Multiplication(rowlength,collength,row2length,col2length,tab, tab1,argv);

    return 0;
}

int Multiplication(int rowlength, int collength, int row2length, int col2length, int tab[rowlength][collength],int tab1[row2length][col2length],char* argv[]) // MNOŻENIE MACIERZY
{
    int i,j,k;
    int tab2[rowlength][col2length];
    printf("Result of multiplication:\n\n");

    for(i=0; i<rowlength; i++)
    {
        for(j=0; j<col2length; j++)
        {
            tab2[i][j] = 0;
            for(k=0; k<row2length; k++)
            {

                tab2[i][j] += tab[i][k] * tab1[k][j];

            }
        }
    }

    for(i=0; i<row2length; i++)
    {
        for(j=0; j<col2length; j++)
        {

            printf("%d ", tab2[i][j]);

        }
        printf("\n");
    }
    Save(row2length, col2length, tab2, argv);
}
void Save(int row2length, int col2length, int tab2[row2length][col2length], char* argv[]) // ZAPISYWANIE MACIERZY WYNIKOWEJ DO PLIKU
{
    int i,j;
    FILE* file2;
    file2 = fopen(argv[2], "w");
    if(file2==NULL) printf("Can't open the file!");

    else
    {
        fprintf(file2,"The result: \n");

        for(i=0; i<row2length; i++)
        {
            for(j=0; j<col2length; j++)
            {

                fprintf(file2,"%d ", tab2[i][j]);

            }

            fprintf(file2,"\n");
        }

        fclose(file2);

    }
}

 

1
komentarz 13 stycznia 2018 przez Tomasz90 Nałogowiec (25,140 p.)
Wypisywanie z funkcji mnożącej macierze bym wrzucił do osobnej funkcji. Tak samo wczytywanie i dodatkowo je uprościł bo na moje oko jest przekombinowane troche. Niektóre nazwy zmiennych bym zmienił ale pewnie na studiach i tak na to nie patrzą.
komentarz 13 stycznia 2018 przez must Bywalec (2,980 p.)
Okej, poprawię.

Tak mój prowadzący nawet, który jest świeżo po magistrze daje nazwy typu "n,k" etc. i mam mu ochotę.... :)
komentarz 14 stycznia 2018 przez must Bywalec (2,980 p.)

Wywaliłem czytanie wartości do funkcji. Tylko mam teraz taki problem, że funkcja Multiplication czyta 2 tablice, które znajdują się w funkcji ReaderValues. Jak je przesłać do tej funkcji?

Cały czas mi się myli to z Java, bo tam tworzyłem sobie obiekty na których mogłem operować, a tutaj jakieś fiubździu :D

 

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{

    if(argc < 3)
    {
        printf("Za malo argumentow");
        return 0;
    }

    int rowlength,collength,row2length,col2length;
    int row=0,col=0;


    printf("Input number of rows for the first array!");
    scanf("%d",&rowlength);
    printf("Input number of columns for the first array!");
    scanf("%d",&collength);
    printf("Input number of rows for the second array!");
    scanf("%d",&row2length);
    printf("Input number of columns for the second array!");
    scanf("%d",&col2length);

    printf("Elements in the text file:\n\n");

    FILE* file = fopen(argv[1], "r");

    ReaderValues(file,rowlength,collength,row2length,col2length);

    fclose(file);

    Multiplication(rowlength,collength,row2length,col2length, tab, tab1,argv);

    return 0;
}


void ReaderValues(FILE* file, int rowlength, int collength, int row2length, int col2length)
{
    int tab[rowlength][collength],tab1[row2length][col2length];
    int row=0,col=0;
    while( fscanf( file, "%d,", &tab[row][col] ) != EOF )  //WCZYTYWANIE WARTOŚCI Z PLIKU TXT DO 2 TABLIC
    {

        printf("%d ", tab[row][col]);

        col++;

        if(col==collength && row==rowlength-1)
        {
            printf("\n\n");
            row=0;
            col=0;

            while( fscanf( file, "%d,", &tab1[row][col] ) != EOF )
            {

                printf("%d ", tab1[row][col]);
                col++;

                if(col==col2length)

                {
                    printf("\n");
                    col=0;
                    row++;
                }
            }
        }
        if(col==collength)
        {
            printf("\n");
            col=0;
            row++;
        }
    }
    printf("\n");
}

int Multiplication(int rowlength, int collength, int row2length, int col2length, int tab[rowlength][collength],int tab1[row2length][col2length],char* argv[]) // MNOŻENIE MACIERZY
{
    int i,j,k;
    int tab2[rowlength][col2length];
    printf("Result of multiplication:\n\n");

    for(i=0; i<rowlength; i++)
    {
        for(j=0; j<col2length; j++)
        {
            tab2[i][j] = 0;
            for(k=0; k<row2length; k++)
            {
                tab2[i][j] += tab[i][k] * tab1[k][j];
            }
        }
    }

    for(i=0; i<row2length; i++)
    {
        for(j=0; j<col2length; j++)
        {
            printf("%d ", tab2[i][j]);
        }
        printf("\n");
    }
    Save(row2length, col2length, tab2, argv);
}
void Save(int row2length, int col2length, int tab2[row2length][col2length], char* argv[]) // ZAPISYWANIE MACIERZY WYNIKOWEJ DO PLIKU
{
    int i,j;
    FILE* file2;
    file2 = fopen(argv[2], "w");
    if(file2==NULL) printf("Can't open the file!");

    else
    {
        fprintf(file2,"The result: \n");

        for(i=0; i<row2length; i++)
        {
            for(j=0; j<col2length; j++)
            {
                fprintf(file2,"%d ", tab2[i][j]);
            }

            fprintf(file2,"\n");
        }

        fclose(file2);

    }
}

 

komentarz 14 stycznia 2018 przez must Bywalec (2,980 p.)
jak cos to stworzylem juz nowe pytanie, bo tutaj sie polapac troche ciezko.

Podobne pytania

0 głosów
0 odpowiedzi 209 wizyt
pytanie zadane 27 maja 2023 w C i C++ przez natalia2002. Początkujący (400 p.)
0 głosów
1 odpowiedź 399 wizyt
pytanie zadane 7 czerwca 2018 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)
0 głosów
2 odpowiedzi 5,729 wizyt
pytanie zadane 19 marca 2018 w C i C++ przez Groshq Użytkownik (590 p.)

93,018 zapytań

141,984 odpowiedzi

321,282 komentarzy

62,364 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...