1

Тема: Ділення матриць (С++)

Мені потрібно додати,відняти,перемножити і поділити 2 матриці. У мене є клас у якому  перевантажуються ці  оператори.Я ледве розібрався з множенням і не знаю чи на 100% воно працює правильно, а от з діленням матриць я взагалі повний 0. Допоможіть його написати. Please

#include<iostream>
#include<string.h>
#include<iomanip>
#include<ctime>
#include<conio.h>
using namespace std;
const int n = 4;
class matrix
{
    int arr[n][n];
public:
    int& at(int a, int b) { return arr[a][b]; }

    matrix()
    {
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                arr[i][j] = 0;
            }
        }
    }
    matrix operator+ (matrix& m1)
    {
        matrix result1;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                result1.arr[i][j] = this->at(i, j) + m1.arr[i][j];
            }
        }
        return result1;
    }
    matrix operator- (matrix& m2)
    {
        matrix result2;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                result2.arr[i][j] = this->at(i, j) - m2.arr[i][j];
            }
        }
        return result2;
    }
    matrix operator* (matrix& m3)
    {
        matrix result3;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                result3.arr[i][j] = 0;
                for (int k = 0; k < n; k++)
                {
                    result3.arr[i][j] += this->at(i, k)* m3.arr[k][j];
                }
            }
        }
        return result3;
    }
    matrix operator/ (matrix& m4)
    {
        matrix result4;
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++)
            {
                //????????????????????
            }
        }
    }
    void rand()
    {
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                arr[i][j] = ::rand() % 10;
            }
        }
    }
    bool operator==(matrix& m5)
    {
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (this->arr[i][j] != m5.arr[i][j]) return false;
            }
        }
        return true;
    }
    void print(matrix &m6)
    {
        for (int i = 0; i < n; i++)
        {
            cout << endl;
            for (int j = 0; j < n; j++)
            {
                cout << setw(5) << m6.arr[i][j];
            }
        }
    }
};
void main()
{
    matrix a, b, c;
    b.rand();
    c.rand();
    if((b==c) ==0)
    {
        cout << "\nMatrix 2 is not equal to matrix 1";
    }
    else
    {
        cout << "\nMatrix 2 is Matrix 1";
    }
    cout << "\n\tArray 1";
    a.print(a);
    cout << "\n\tArray 2";
    b.print(b);
    cout << "\n\tArray 3";
    c.print(c);

    a = b + c;
    cout << "\n\tArray1 = Arr2 + Arr3";
    a.print(a);
    cout << "\n\tArray1 = Arr2 - Arr3";
    a = b - c;
    a.print(a);
    cout << "\n\tArray1 = Arr2 * Arr3";
    a = b * c;
    a.print(a);
    cout << "\n\tArray1 = Arr2 / Arr3";
    a = b / c;
    a.print(a);
    _getch();
}

2

Re: Ділення матриць (С++)

Я ледве розібрався з множенням і не знаю чи на 100% воно працює правильно,

Хто вам заважає написати тест з рандомними числами?

а от з діленням матриць я взагалі повний 0.

Ви розумієте як то робиться математично?

3

Re: Ділення матриць (С++)

Визначається детермінант. Ділення замінюється множенням на обернену матрицю.

Подякували: leofun011

4

Re: Ділення матриць (С++)

Mirek7098 написав:

Визначається детермінант. Ділення замінюється множенням на обернену матрицю.

нічо не пойняв, можете пояснити на прикладі?

Подякували: 0xDADA11C71

5 Востаннє редагувалося leofun01 (03.12.2017 15:08:20)

Re: Ділення матриць (С++)

Спочатку вам сюди: 1, 2.
А потім і на формули можна глянути: 3.

upd: І не забудьте дописати { конструктори, оператори } { копіювання, переміщення }, щоб не дивуватися чому на виході неочікувані значення. (cc, co, mc, mo)

Подякували: LoganRoss, Mirek70982

6

Re: Ділення матриць (С++)

Я ще хотів би запитати? Як розділити цей код між header file і cpp. файлом. Я просто ніколи не писав у хедері.

7

Re: Ділення матриць (С++)

Проголошення класу - в .h, тіла функцій - в .cpp.
І для матриць не визначена операція ділення, бо операція множення для них не є транзитивною (тобто якщо a*b=c, то для a = c op1 b і b = c op2 a операції op1 і op2 різні). Є зворотна матриця (A-1), на яку можна множити - як зліва, так і справа.

Подякували: leofun01, Mirek70982