Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обратная матрица

17K
01 мая 2006 года
kompanavt
1 / / 01.05.2006
Люди, хелп. очень нада!
Необходимо вычислить обратную матрицу. Саму прогу я уже написал, осталось только сделать сохранение в текстовый файл и вывод на печать, ну никак не могу разобраться, С++ начал изучать совсем недавно, ну очень надо, помогите...
Вот текст проги:
Код:
#include<iostream.h>
#include<conio.h>
#include<assert.h>
#include<stdlib.h>
#include<math.h>

class matrix{
public:
float **p;
struct st_size{
int gor;
int vert;}size;

static int matrix_count;


friend ostream &operator<<(ostream &,const matrix &);
friend istream &operator>>(istream &,matrix &);
int  operator==(const matrix &);

matrix(int n=3,int m=3);
matrix(const matrix&);
~matrix();

st_size getsize() const;
static int getmatrix_count();


matrix minor(int);              //opredelenie glavn. minorov
matrix obratnaia(const matrix&);  //naxogdenie obratnoi matrix
};


int  matrix::matrix_count=0;

matrix::matrix(int n,int m){
++matrix_count;
size.gor=n;
size.vert=m;
p=new float*[size.gor];
assert(p!=0);
for(int i=0;i<size.gor;i++)
p=new float[size.vert];
for(int i=0;i<size.gor;i++)
for(int j=0;j<size.vert;j++)
p[j]=0;}


matrix::matrix(const matrix &mass){
++matrix_count;
size=mass.size;
p=new float*[size.gor];
assert(p!=0);
for(int i=0;i<size.gor;i++)
p=new float[size.vert];
for(int i=0;i<size.gor;i++)
for(int j=0;j<size.vert;j++)
p[j]=mass.p[j];}

matrix::~matrix(){--matrix_count;
delete [size]*p;}

matrix::st_size getsize(const size);

int matrix::getmatrix_count(){
return matrix_count;}

istream &operator>>(istream &inp,matrix &mass)
{for(int i=0;i<mass.size.gor;i++)
 for(int j=0;j<mass.size.vert;j++)
 inp>>mass.p[j];
 return inp;}

ostream &operator<<(ostream &out,const matrix &mass)
{for(int i=0;i<mass.size.gor;i++){out<<"\n";
 for(int j=0;j<mass.size.vert;j++)
 out<<mass.p[j]<<" ";}
 return out;}

int matrix::operator==(const matrix &m)
{if((size.gor!=m.size.gor)||(size.vert!=m.size.vert))return 0;
 for(int i=0;i<size.gor;i++)
 for(int j=0;j<size.vert;j++)
 if(p[j]!=m.p[j])return 0;
 return 1;}








matrix matrix::minor(int i)  //opredelenie glavn. minorov
{
 matrix B(i,i);

 for(int j=0;j<i;j++)
for(int k=0;k<i;k++)
B.p[j][k]=p[j][k];
return B;}

matrix matrix::obratnaia(const matrix &F)   //naxogdenie obratnoi matrix
{
 // LU-razlogenie
 matrix B(size.gor,size.gor),C(size.gor,size.gor),Z(1,1);//Z-nulevaia matrix, vozvrachaemaia pri ochibke
 float res1=0,res2=0;

for(int i=0;i<size.gor;i++)
for(int j=0;j<size.gor;j++){
if(i==j)C.p[j]=1;
if(i>=j){
for(int k=0;k<=j-1;k++)res1=res1+B.p[k]*C.p[k][j];
B.p[j]=p[j]-res1;res1=0;}
else {
for(int k=0;k<=i-1;k++)res2=res2+B.p[k]*C.p[k][j];
if(B.p==0){cout<<"Error:minor =0\n";return Z;}
else {C.p[j]=(1/B.p)*(p[j]-res2);res2=0;}}}

 // reshenie By=f
 matrix Y(size.gor,1);
 float res3=0;

for(int i=0;i<size.gor;i++){
for(int j=0;j<=i-1;j++)res3=res3+B.p[j]*Y.p[j][0];
if(B.p==0){cout<<"Error:minor =0\n";return Z;}
else Y.p[0]=(F.p[0]-res3)/B.p;res3=0; }

 // reshenie Cx=y
 matrix X(size.gor,1);
 float res4=0;

for(int i=size.gor-1;i>=0;i--){
for(int j=i+1;j<size.gor;j++)res4=res4+C.p[j]*X.p[j][0];
X.p[0]=(1/C.p)*(Y.p[0]-res4);res4=0;}

return X;}

void DisplayMenu()
{
std::cout<<"---Programma dlya vichislenia obratnoj matrix---"<<endl;
std::cout<<"1. Vvesti matrix"<<endl;
std::cout<<"2. Exit"<<endl;
}

int GetSelection()
{
int sel;
std::cout<<"Set variant:\n";
std::cin >> sel;
return sel;
}

void NextMenu()
{
textcolor(YELLOW);
cprintf("Matrix calculation complete: \n\r");
cprintf("1. Vivesti rezultati na ekran\n\r");
cprintf("2. Sohranit' rezultat v fail (v lokal'noj dirrektorii)\n\r");
cprintf("3. Vivesti rezul'tati na pechat'\n\r");
}

int main(){

DisplayMenu();
int sel;
sel=GetSelection();
switch (sel)
{
case 1:break;
case 2:return 0;
default: std::cout<<"\aNekorrektnij vibor!";getch();return 0;
}
int a=0;
cout<<"vvedite razmernost matrix A\n";
cin>>a;
matrix A(a,a);
cout<<"vvedite matrix A\n";
cin>>A;

NextMenu();
int sel2;
sel2=GetSelection();
switch (sel2)
{
case 1:break;
case 2:/*WriteOfFile();break;*/
case 3:
default: cprintf("\aNekorrektnij vibor!");getch();return 0;
}

matrix Q(1,1);
bool z=false;

for(int k=1;k<=a;k++){

z=false;
cout<<"Glavnij minor:\n";
cout<<A.minor(k)<<'\n';

   matrix E(k,k);  //edinichnaia matrix
   for(int i=0;i<k;i++)
   for(int j=0;j<k;j++)
   if(i==j)E.p[j]=1;

  matrix F(k,1);  //stolbec edinichnoi matrix
matrix O(k,k);  //obratnaia matrix


   for(int j=0;j<k;j++){

       for(int i=0;i<k;i++)
       F.p[0]=E.p[j]; //formirovanie F

        for(int i=0;i<k;i++){
        if(((A.minor(k)).obratnaia(F))==Q)z=true;
        if (z==true)break;
        O.p[j]=((A.minor(k)).obratnaia(F)).p[0];

                          }   if (z==true)break;
        }if (z==true)break;
        cout<<"Obratnaya matrix:\n";
        cout<<O<<'\n';}
while(!getch());
return 0;
}

и в виде срр файла.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог