Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Умножение матриц, матрицы 
:(
    Опции темы
http1
Дата 29.12.2013, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.11.2013

Репутация: нет
Всего: нет



Код



#include <iostream>
#include <math.h>
#include <conio.h>
#include <fstream>
#include <stdio.h>
#include <iomanip>
#include <windows.h>
#include <iostream>
using namespace std;
int det(long double**, int);

void zapolnenie1(long double **a, int n)
{
    cout << "Исходная матрица:" << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            a[i][j] = rand() % 30; // Каждый элемент случайному числу от 0 до 9
            cout << a[i][j] << " "; // Вывести элементы на консольку
        }
        cout << endl; // Двумерный массив. Строка кончилась, переводим строку и на консоли
    }
}
void zapolnenie2(long double **a, int n)
{
    cout << "Исходная матрица:" << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << "a[" << i << "][" << j << "]: ";
            cin >> a[i][j]; // Каждый элемент случайному числу от 0 до 9
        }
        cout << endl; // Двумерный массив. Строка кончилась, переводим строку и на консоли
    }
}
void zapolnenie3(long double **a, int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = n; j < n * 2; j++)
        {
            if (i == j - n)
                a[i][j] = 1; // Каждый элемент случайному числу от 0 до 9
            else
                a[i][j] = 0;
        }
        cout << endl; // Двумерный массив. Строка кончилась, переводим строку и на консоли
    }

}
long double** minor(int z, int x, int n, long double **a)
{
    long double **C = new long double*[n - 1];
    for (int i = 0; i < n - 1; i++)
    {
        C[i] = new long double[n - 1];
    }
    for (int h = 0, i = 0; i < n - 1; i++, h++)
    {
        if (i == z)
            h++;
        for (int k = 0, j = 0; j < n - 1; j++, k++)
        {
            if (k == x)
                k++;
            C[i][j] = a[h][k];
        }
    }
    return C;
}
long double det(int n, long double **a)
{
    long double sum = 0;
    if (n != 2)
    for (int i = 0; i < n; i++)
        sum += pow((-1), (i + 2))*a[0][i] * det(n - 1, minor(0, i, n, a));
    else
        sum = a[0][0] * a[n - 1][n - 1] - a[n - 1][0] * a[0][n - 1];
    return sum;
}
void ggg(long double **a, int n)
{
    int ii = 0, d, i, j, g, q, r;
    cout << endl;
    long double gg;
    for (int i = 0; i < n - 1; i++)
    {


        if (a[i][ii] == 0)
        for (d = 0; d < n * 2; d++)
        {
            g = (int)a[i][d];
            a[i][d] = a[i + 1][d];
            a[i + 1][d] = g;
        }
        ii++;
    }


    if (a[n - 1][n - 1] == 0)
    {
        for (r = 0; r < n; r++)
        if (a[r][r] != 0 && a[r][n - 1] != 0)
            break;
        for (d = 0; d < n * 2; d++)
        {
            g = (int)a[d][r];
            a[d][r] = a[d][n - 1];
            a[d][n - 1] = g;
        }
    }





    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (i == j)
            {
                gg = a[i][j];
                for (q = j; q < n * 2; q++)
                {
                    a[i][q] = a[i][q] / gg;
                }


                if (i != n - 1)
                {
                    for (d = i + 1; d < n; d++)
                    {
                        gg = a[d][j];
                        for (g = j; g < n * 2; g++)
                        {

                            a[d][g] = a[d][g] - a[i][g] * gg;
                        }

                    }
                }

            }

        }
    }
    
    for (int f = n; f < n; f++)
        a[n - 1][f] = a[n - 1][f] / a[n - 1][n - 1];
    a[n - 1][n - 1] = 1;
    for (i = n - 1; i >= 0; i--)
    {
        for (j = n - 1; j >= 0; j--)
        {
            if (i == j)
            {



                if (i != 0)
                {
                    for (d = i - 1; d >= 0; d--)
                    {
                        gg = a[d][j];
                        for (g = 2 * n - 1; g > i - 1; g--)
                        {
                            a[d][g] = a[d][g] - a[i][g] * gg;
                        }

                    }
                }

            }
        }
    }

}
void vivod(long double **a, int n)
{
    cout << "Обратная матрица:" << endl;
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = n; j < n * 2; j++)
        {
            cout << a[i][j] << "\t";
        }
        cout << endl;
    }
    cout << endl;
}

int mnozim(int n, long double **a, long double **b){
    long double **D = new long double *[n];
    for (int i = 0; i < n; i++)
    {
        D[i] = new long double[n];
    }

    cout << endl << "Умножаем матрицы:" << endl;
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            D[i][j] = 0;
            for (int r = 0; r < n; r++)
            {
                D[i][j] += b[i][r] * a[r][j];
                if (r == n - 1)
                {
                    cout << b[i][r] * a[r][j] << " = ";
                }
                else
                {
                    cout << b[i][r] * a[r][j] << " + ";
                }
            }
            cout << D[i][j] << "\t";
        }
        cout << endl;
    }

    cout << endl << "Конечный результат:" << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << D[i][j] << "\t";
        }
        cout << endl;
    }
    return 0;
}
int main()
{
    srand((unsigned int)time(NULL)); // Инициализируем генератор случайных чисел. 
    setlocale(0, "rus");
    int n = 0, h, i = 0, k;
    cout << "Введи размер матрицы" << endl;
    cin >> n; // Считываем с клавиатуры n
    long double **a = new long double*[n]; // Создаем массив указателей
    for (int i = 0; i < n; i++)
    {
        a[i] = new long double[2 * n]; // Создаем элементы
    }

    long double **b = new long double*[n]; // Создаем массив указателей
    for (int i = 0; i < n; i++)
    {
        b[i] = new long double[n]; // Создаем элементы
    }

    cout << "Нажми: 1 - случайное заполнение числами, 2 - ввод матрицы с клавиатуры" << endl;
    cin >> h;

    if (h == 1)
        zapolnenie1(a, n);
    if (h == 2)
        zapolnenie2(a, n);

    cout << endl << "Исходная матрица:" << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            b[i][j] = a[i][j];
            cout << b[i][j] << "\t";
        }
        cout << endl;
    }

    zapolnenie3(a, n);
    k = (int)det(n, a);
    minor(0, i, n, a);
    if (k == 0)
    {
        exit(0);
    }
    ggg(a, n);
    vivod(a, n);

    for (i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            a[i][j] = a[i][j + n];
        }
    }

    i = mnozim(n, a, b);

    system("pause");
}



Ребят, срочно нужна помощь, почему после нахождения обратной матрицы и проверки (должна получиться 1 выводит не 0 а непонятные значения) 
PM MAIL   Вверх
feodorv
Дата 29.12.2013, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(http1 @  29.12.2013,  01:07 Найти цитируемый пост)
почему после нахождения обратной матрицы и проверки (должна получиться 1 выводит не 0 а непонятные значения)

Какие именно непонятные значения?


Как минимум в коде присутствует цикл, который не исполняется:
Цитата(http1 @  29.12.2013,  01:07 Найти цитируемый пост)
    for (int f = n; f < n; f++)



Далее разбираться не имеет смысла...



Это сообщение отредактировал(а) feodorv - 29.12.2013, 21:44


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.