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 14:08:20)

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

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

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

Подякували: LoganRoss, Mirek7098, big-boss7773

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

8

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

leofun01 дякую за посилання.
Хочеться доповнити Ваш список ще кількома цікавими посиланнями:
Основні операції над матрицями + блок-схма: https://www.mathros.net.ua/oznachennja- … cjamy.html
Обернена матриця + блок-схема: https://www.mathros.net.ua/obernena-mat … aussa.html
Псевдообернена матриця + блок-схема: https://www.mathros.net.ua/psevdoobernena-matrycja.html
Можливо комусь стануть у пригоді. Всім успіху.

9

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

Mirek7098 написав:

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

Перш ніж подібне кодити розберіться як то працює за допомогою олівця та папірця.
Бо інакше то буде даремно витрачений Ваший час.
Для прикладу.
Коли не мається розуміння що (2+2)/5=0.8
То як можливо перевірити код який то рахує та повертає результат 10?