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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нахождение обратной марицы 
:(
    Опции темы
http1
Дата 26.12.2013, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нужна помощь, уже сломал мозг, требуется ввод матрицы клавиатуры, затем она должна считать обратную, затем умножить обратную на исходную и получить единичную, помогите убрать так называемые "читы" - нужно когда на главной диагонале 0 убрать его (проблема когда 0 в самом конце), и посчитать нормально единичную матрицу, я тупо вывожу ее
Код


#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(double**,int );

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


}

double** minor(int z,int x,int n,double **a)
{
    double **C=new double*[n-1];
    for(int i=0;i<n-1;i++)
    {
  C[i]=new 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;
}

double det(int n,double **a)
{
    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 (double **a,int n)
    {int ii=0,d, i, j, g, q;
cout << endl;
double gg;
        for (int i = 0; i< n-1; i++)
        {
    
  
        if ( a[i][ii]==0)
    for(d = 0; d < n*2; d++)
    {
    g = a[i][d];
    a[i][d]=a[i+1][d];
    a[i+1][d] = g;
    }
    ii++;
  }
       

    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 (double **a, int n)
{
    cout << "Обратная матрица:"<< endl;
    int i, j;
    int s = (79 - (n - 1)) / n;
    for (i = 0; i < n; i++)
    {
  for (j = n; j < n*2; j++)
  {
    if(a[i][j]>=0)
    cout<<" "<< scientific << setprecision(6) << a[i][j];
  else
    cout<< scientific << setprecision(6) << a[i][j];
    
    
  }
cout << endl;
    }
    cout << endl;

}


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



  for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            b[i][j]= a[i][j]; // Каждый элемент случайному числу от 0 до 9
     
        }
       
    }



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

    zapolnenie3 (a, n);

    k = det (n , a);
    minor (0, i , n, a);
    if (k==0)
  {
  exit(0);
    }
    ggg (a, n);
     vivod(a,n);
    system("pause");
}


Это сообщение отредактировал(а) http1 - 26.12.2013, 10:26
PM MAIL   Вверх
akizelokro
Дата 27.12.2013, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Для double операцию // ..= new double (..)
писать не надо, я в этих вещах пурист

чё, пошла пора зачётов, и тут наплыв? (я вообще программирование в вузе не изучал практически = хе!)


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
disputant
Дата 28.12.2013, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Гм, считать определитель матрицы через разложение по минорам, как O(n!)...

Может, опуститесь с горних высей чистой математики до численной и примените что-то типа Гаусса?
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.0629 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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