Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Нахождение обратной матрицы методом Гаусса и рассширенной матрицы

Ответить
Настройки темы
C/C++ - [решено] Нахождение обратной матрицы методом Гаусса и рассширенной матрицы

Аватара для D.Y.

Новый участник


Сообщения: 28
Благодарности: 5

Профиль | Отправить PM | Цитировать


Мне срочняк надо прогу нахождения обратной матрицы методом гаусса и при помощи расширенной матрицы я написал но она требует доработки а сдавать в среду
если у кого есть напишите пожалуйста заранее благодарен (иначе сессия продлится до сентября)
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:29, 22-06-2008

 

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Нахождение обратной матрицы методом расширенной матрицы
Код: Выделить весь код
//Нахождение обратной матрицы методом расширенной матрицы
#include <vcl.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#pragma hdrstop
#pragma argsused

const int dim1=20;
const int dim2=40;
float**a,**a1;
int n;
//vvod matrici
void MatrIn()
{
   int i,
       j;

   for(i = 0; i < n; i++){
     for(j = 0; j < n; j++){
        cout<<"vvedite cherez probel elementi metrici[ "<<i<<" ][ "<<j<<" ] = ";
        cin>>a[i][j];
      }
    }
}
//obraschenie matrici
void invMatr(float e)
{
   int i,
       j,
       k,
       n1;
    float f,
          f1;
    float matr[20][40];
    n1 = 2 * n;

    for(int i = 0; i < n; i++)
      for(j = 0; j < n1; j++)
         if(j < n)
           matr[i][j] = a[i][j];
         else if(j == (n + 1))
           matr[i][j] = 1;
         else
           matr[i][j] = 0;

    for(int i=0;i<n;i++){
       k = i;
       f1 = matr[i][j];
       while(fabs(f1) < e){
          if(k < n){
            k++;
            f1 = matr[k][i];
           }
          else{
            cout<<"matrica virojdena";
            getch();
           }
       for(j = i; j < n1; j++){
         f = matr[k][j];
         matr[k][j] = matr[i][j];
         matr[i][j] = f / f1;
       }

       for(k = 0; k < n; k++)
         if(k != i)
           for(j = n1 - 1; j >= i; j--)
              matr[k][j] = matr[k][j] - matr[i][j] * matr[k][j];
     }

       for(i = 0; i < n; i++)
          for(j = 0; j < n; j++)
            a[i][j] = matr[i][j + n];
  }
}
//vivod obratnoy matrici
void MatrOut()
{
   int i,
       j;

   for(i = 0; i < n; i++)
      for(j = 0; j < n; j++)
         cout<<a1[i][j]<<" ";
}
//glavnaya proga
void main()
{
   int e;

   cout<<"vvedite razm matrici: ";
   cin>>n;

   a = new float* [n];

   MatrIn();

   a1 = new float* [n];

   for(int i = 0; i < n; i++)
      a1[i] = new float[n];

   cout<<"vvedite tochnost' vichisleniya: ";
   cin>>e;
   invMatr(e);
   cout<<"obratnaya matrica: ";
   MatrOut();
   getch();
}
//--------------------------------------------------------------------------

Код: Выделить весь код
Вопрос, что делает эта строка кода:
a=new float*[n];  // эта строка
MatrIn();
a1=new float*[n];  // И эта строка
А так же, что это? Указатель на указатель?
Код: Выделить весь код
float **a,**a1;
Ошибка появляется после ввода данных, на этапе
Код: Выделить весь код
a=new float*[n];  // эта строка
А так всё комплируется и до этой строки работает.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 15:39, 22-06-2008 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для D.Y.

Новый участник


Сообщения: 28
Благодарности: 5

Профиль | Отправить PM | Цитировать


Вопрос, что делает эта строка кода:
a=new float*[n]; // эта строка
MatrIn();
a1=new float*[n]; // И эта строка
это создается новая матрица типу float

Отправлено: 16:04, 22-06-2008 | #12


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


D.Y.,
Цитата D.Y.:
это создается новая матрица типу float »
Динамическое выделение
Код: Выделить весь код
float *array = new float[size];

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 17:32, 22-06-2008 | #13


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


D.Y., Тогда, что делает эта строка в главной функции main()?
Код: Выделить весь код
 for(int i = 0; i < n; i++)
      a1[i] = new int[n];
У меня просто у самого знаний нехватает.

Эти строки не используются в программе
Код: Выделить весь код
const int dim1=20;
const int dim2=40;
В общем, ошибка где-то здесь:
Код: Выделить весь код
...
   a1 = new float* [n];

   for(int i = 0; i < n; i++)
      a1[i] = new float[n];
...

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 18:01, 22-06-2008 | #14


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


D.Y., в первом посте неплохо бы было указать сразу тему с другого форума есть рабочая прога(содрана с книги) не могу понять под какую среду писалась так сказать доложить о проделанных попытках по преодолении сложности, здесь бы дублей по догадкам не было.
А книга именно так называется, может всё же полное название Языки Си С++ для решения инженерных и экономических задач?

Цитата D.Y.:
if (j!=i)
a[k][i]-=b[j]*c[k];}
for (i=0;i<n;i++){ »
Выделенная скобка закрывает функцию int InvMatrG(int n, float(*a)[dim], float e,float d) всё что дальше в кодовом космосе находится.

Последний раз редактировалось Admiral, 22-06-2008 в 22:49.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:36, 22-06-2008 | #15


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Admiral,
оффтоп
Цитата Admiral:
бы было указать сразу тему с другого форума »
А как вы его нашли там?

D.Y.,
оффтоп
Цитата D.Y.:
D.Y., так поставь себе задачу: выбрось этот жуткий, кривой код и напиши свой, красивый и работающий
и
Цитата D.Y.:
Придется так и сделать но я хотел не напрягаясь содрать
Не обессудьте, но таки придётся написать самому. Хоть бы сказали, что вам его подправили здесь на OSZone, а то: "я подправил." Всё-таки первое впечатление
Цитата Drongo:
В общем, я точно уверен, что вы не писали эту программу »
правильное.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Последний раз редактировалось Drongo, 23-06-2008 в 11:49.


Отправлено: 23:22, 22-06-2008 | #16


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Drongo, уточнял книгу и главу в которой сабж и вышел на ту тему.
http://www.google.com/search?hl=ru&c...1%83%D0%BA&lr=
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:59, 23-06-2008 | #17


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Код: Выделить весь код
...
void MatrIn()
{
   int i,
       j;

   for(i = 0; i < n; i++){
     for(j = 0; j < n; j++){
        cout<<"vvedite cherez probel elementi metrici[ "<<i<<" ][ "<<j<<" ] = ";
        cin>>a[i][j];
      }
    }
}
...
Как я понял в первом куске кода выполняется присвоение массиву размером n * n если n равна 2, то получается 4, в то время, как в куске кода ниже, память выделяется только под n = 2
Код: Выделить весь код
...
cin>>n;

   a = new float* [n];

   MatrIn();

   a1 = new float* [n];

   for(int i = 0; i < n; i++)
      a1[i] = new float[n];
...
Хотя если честно я не знаю, проверил этот способ, но всё равно ошибка.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Последний раз редактировалось Drongo, 23-06-2008 в 12:49.


Отправлено: 11:47, 23-06-2008 | #18


Аватара для D.Y.

Новый участник


Сообщения: 28
Благодарности: 5

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
а не моглибы вы прокомментировать(что в какой строке делается) программу я взял у паренька но он кудато пропал и я не пойму что в ней творится особенно в конце
было задание решение СЛАУ методом Крамера
#include <iostream.h>  
#include <stdio.h> 
#include <math.h> 
double DET (unsigned int columns);
bool PROVCOL(unsigned int num, char colNum);
unsigned int Column1(unsigned int num, char colNum);
unsigned int Column0(unsigned int num, char colNum);
double **Matrix;
int n;
main()
{
     int i, j; 
     double mainDET; 
     cout<<"Vvedite kolichestvo uravneniy "<<endl;
     cin>>n;
     while (n > 10 || n < 1)
     {
          cout<<"Vu ne mogete vvesti bol'she 10 ili men'she 1 uravneniya, vvedite esche raz ";
          cin>>n;
     }
     
     Matrix = (double**) new double[n];
     for (i=0; i<= n-1; i++)
     {Matrix[i] = new double[n+1];}
     for (i = 0; i <= n-1; i++)
               for (j = 0; j <= n; j++)
               {
                    cout<<"Vvedite element matricu s koordinatami ("<<i<<","<<j<<") ";
                    cin>>Matrix[i][j];
               }
     cout<<"Vasha matrica:\n";
     for (i = 0; i <= n-1; i++)
     {for (j = 0; j <= n; j++)
          cout<<Matrix[i][j]<<"\t";
          cout<<endl;
     }
     mainDET = DET(pow(2,n));
     if (mainDET == 0)
     {
		 cout<<"Net resheniy!\n";
     }
     else
     {
      printf ("Korni sistemu:\n");
               for (i=0; i <= n-1; i++)
               printf ("%.3f ", -pow(-1,n+i)*DET(pow(2,i))/mainDET);
          printf ("\n");
     }
	 cout<<"Detrmenant sistemu raven: "<<mainDET<<endl;
     for (i = 0; i <= (n-1); i++) 
     delete Matrix[i];
     delete Matrix;
     cout<<"Vuchisleniya zakonchenu. Spasibo chto vubrali nas!\n";
     return 0;
}


double DET (unsigned int columns)
{double det = 0;
    int i, numCols = 0, lastFalse, cntr = 0;
     for (i=0; i<=n; i++) 
     {
	  if (PROVCOL(columns, i)) 
      numCols++;
      else lastFalse = i;
     }
    if ((n - numCols) == 0) det = Matrix[n-1][lastFalse];
     else
         for (i = 0; i <= n; i++)
               if (!PROVCOL(columns, i))
               {
					columns = Column1(columns, i);
                    det += pow(-1,(cntr))*Matrix[numCols-1][i]*DET(columns);
                    columns = Column0(columns, i);
                    cntr++;
               }
     return det;
}
bool PROVCOL(unsigned int num, char colNum)
{
     _asm
     {
          xor eax, eax; 
          xor ebx, ebx; 
          mov bl, colNum; 
          bt num, ebx; 
          jnc none; 
          inc eax; 
          none:
     }
}
unsigned int Column1(unsigned int num, char colNum)
{
     _asm
     {
          xor eax, eax; 
          mov al, colNum; 
          bts num, eax; 
     }
     return num; 
}
unsigned int Column0(unsigned int num, char colNum)
{
     _asm
     {
          xor eax, eax; 
          mov al, colNum; 
          btr num, eax; 
     }
     return num; 
}

Отправлено: 15:09, 23-06-2008 | #19


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


D.Y.,
в этих строках

Код: Выделить весь код
bool PROVCOL(unsigned int num, char colNum)
{
     _asm
     {
          xor eax, eax; 
          xor ebx, ebx; 
          mov bl, colNum; 
          bt num, ebx; 
          jnc none; 
          inc eax; 
          none:
     }
}
unsigned int Column1(unsigned int num, char colNum)
{
     _asm
     {
          xor eax, eax; 
          mov al, colNum; 
          bts num, eax; 
     }
     return num; 
}
unsigned int Column0(unsigned int num, char colNum)
{
     _asm
     {
          xor eax, eax; 
          mov al, colNum; 
          btr num, eax; 
     }
     return num;
Ассемблерная вставка _asm

В остальном, чужой код комментировать трудно. Простой ещё можно, а тут, поможет только автор.
Вот тут добавь строку cin>>i; иначе будет программа закрываться после выполнения
Код: Выделить весь код
...
 delete Matrix;
     cout<<"Vuchisleniya zakonchenu. Spasibo chto vubrali nas!\n";
     cin>>i;
     return 0;
...

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 16:56, 23-06-2008 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Нахождение обратной матрицы методом Гаусса и рассширенной матрицы

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Delphi - [решено] Получить адрес битовой матрицы Tcanvas hackroute Программирование и базы данных 1 09-11-2009 22:50
C/C++ - Нахождение чётных элементов в столбцах матрицы ShadowMas Программирование и базы данных 9 04-04-2009 10:21
C/C++ | Матрицы Kuron Программирование и базы данных 2 21-01-2007 10:09
c++.NET выравнивание матрицы bezumes Программирование и базы данных 4 22-04-2006 01:20
Формирование матрицы Sergey Po Программирование и базы данных 3 28-04-2004 04:47




 
Переход