//10 sene önce yazdığım bir kod
//her büyüklükteki matrisin inversini sorunsuz alır!!
//+ * = operator kullanımı
class matris
{
public:
int en;
int boy;
int top;
double *p;
matris();
matris(int _boy,int _en);
matris(double *_p,int _boy,int _en);
matris(double a0, double a1, double a2,
double a3, double a4, double a5,
double a6, double a7, double a8);
matris(double a0, double a1, double a2, double a3,
double a4, double a5, double a6, double a7,
double a8, double a9, double a10,double a11,
double a12,double a13,double a14,double a15);
matris(matris &m);
~matris();
matris& operator = (matris &m);
matris operator + (matris &m) ;
matris operator * (matris &m) ;
double* operator [] (int kk);
double al(int _boy,int _en){return p[_boy*en+_en];}
double &koy(int _boy,int _en){return p[_boy*en+_en];}
void degistir(int _boy,int _en);
void degistir(double *_p,int _boy,int _en);
void yaz_konsola();
void yaz_dosyaya(char *isim );
matris trn();
friend void matris_copy(matris *m1, matris *m2); //m2 yi m1 e kopyalar
friend void matris_topla(matris *m1, matris *m2, matris *m3); //m1=m2+m3
friend void matris_carp(matris *m1, matris *m2, matris *m3); //m1=m2*m3
friend void matris_ident(matris *m1, int say); //matrisi birim matris yapar
friend void matris_trn(matris *m1); //matrisi ters çevirir
friend matris matris_trn(matris &m1);/**/
friend void matris_inverse(matris *a, matris *m); //matrisin inversini alır
};
matris::matris()
{
en=0;
boy=0;
p=0;
top=0;
//printf("kur matris()\n");
}
matris::matris(int _boy,int _en)
{
en=_en;
boy=_boy;
top=_en*_boy;
p=new double[top];
for(int i=0;i<top;i++) p=0;
//printf("kur matris(int,int)\n");
}
matris::matris(matris &m)
{
boy=m.boy;
en =m.en;
top=m.top;
p=new double[top];
for(int i=0;i<top;i++) p=m.p;
//printf("kur matris(matris&)\n");
}
matris::~matris()
{
delete p;//[]
//printf("sil ~matris()\n");
}
matris::matris(double a0, double a1, double a2, double a3,
double a4, double a5, double a6, double a7,
double a8, double a9, double a10,double a11,
double a12,double a13,double a14,double a15)
{
en =4;
boy=4;
top=en*boy;
p = new double[top];
p[0]=a0; p[1]=a1; p[2]=a2; p[3]=a3;
p[4]=a4; p[5]=a5; p[6]=a6; p[7]=a7;
p[8]=a8; p[9]=a9; p[10]=a10; p[11]=a11;
p[12]=a12; p[13]=a13; p[14]=a14; p[15]=a15;
}
matris::matris(double a0, double a1, double a2,
double a3, double a4, double a5,
double a6, double a7, double a8){
en =3;
boy=3;
top=en*boy;
p = new double[top];
p[0]=a0; p[1]=a1; p[2]=a2;
p[3]=a3; p[4]=a4; p[5]=a5;
p[6]=a6; p[7]=a7; p[8]=a8;
}
matris::matris(double *_p,int _boy,int _en)
{
en=_en;
boy=_boy;
top=en*boy;
p=new double[top];
for(int i=0;i<top;i++) p=_p;
}
void matris::degistir(int _boy,int _en)
{
en=_en;
boy=_boy;
top=en*boy;
delete [] p;
p=new double[top];
for(int i=0;i<top;i++) p=0;
}
void matris::degistir(double *_p,int _boy,int _en)
{
en=_en;
boy=_boy;
top=en*boy;
delete [] p;
p=new double[top];
for(int i=0;i<top;i++) p=_p;
}
void matris::yaz_konsola()
{
printf("matris(%d,%d)\n",boy,en);
for(int j=0;j<boy;j++)
{
for(int i=0;i<en ;i++)
printf("%9.2g ",p[j*en+i]);
printf("\n");
}
printf("\n");
}
void matris::yaz_dosyaya(char *isim)
{
fprintf(dosya_temp,"%s matris(%d,%d)\n",isim,boy,en);
for(int j=0;j<boy;j++)
{
for(int i=0;i<en ;i++)
fprintf(dosya_temp,"%12.4g ",p[j*en+i]);
fprintf(dosya_temp,"\n");
}
fprintf(dosya_temp,"\n");
}
matris& matris::eek:perator = (matris &m)
{
degistir(m.boy,m.en);
memcpy( p, m.p, top*sizeof(double));
return *this;
}
matris matris::eek:perator + (matris &m)
{
matris a(boy,en);//yeni matris oluştur
for(int i=0;i<top;i++)
a.p=p+m.p;
/*
matris *pm=new matris(boy,en);
for(int i=0;i<top;i++)
pm->p=p+m.p;
*/
return a;//kopya döndür!!! ama silinecek!!!
}
matris matris::eek:perator * (matris &m)
{
int _say=en;
int topla=0;
int _boy=boy;
int _en=m.en;
matris a(_boy,_en);
for(int i=0; i<_boy; i++)
for(int j=0; j<_en; j++)
for(int k=0; k<_say; k++)
a.koy(i,j) += al(i,k) * m.al(k,j);
return a;//kopya döndür!!! ama silinecek!!!
}
double* matris::eek:perator [] (int kk)
{
return p + en * kk;// (&p[en*kk]);
}
matris matris::trn()
{
matris a(en,boy);
for(int i=0;i<boy;i++)
for(int j=0;j<en;j++)
a.koy(j,i)=al(i,j);//m1 i ters çevirip a ya koy
return a;
}
void matris_copy(matris *m1,matris *m2)
{
m1->degistir(m2->boy,m2->en);
memcpy(m1->p, m2->p, m2->top*sizeof(double));//m2 nin belleğini m1 e kopyala
}
void matris_topla(matris *m1,matris *m2,matris *m3)
{
m1->degistir(m2->boy,m2->en);
int top=m3->top;
for(int i=0;i<top;i++)
m1->p=m2->p+m3->p;
}
void matris_carp(matris *m1,matris *m2,matris *m3)
{
int say=m2->en;
int topla=0;
int boy=m2->boy;
int en=m3->en;
m1->degistir(boy,en);
for(int i=0; i<boy; i++)
for(int j=0; j<en; j++)
for(int k=0; k<say; k++)
m1->koy(i,j) += m2->al(i,k) * m3->al(k,j);
}
void matris_ident(matris *m1,int say)
{
m1->degistir(say,say);
for(int i=0;i<say;i++) m1->koy(i,i)=1;
}
void matris_trn(matris *m1)
{
matris *a=new matris(m1->en,m1->boy);;//en boy ters yeni a matrisi
for(int i=0;i<m1->boy;i++)
for(int j=0;j<m1->en;j++)
a->koy(j,i)=m1->al(i,j);//m1 i ters çevirip a ya koy
matris_copy(m1,a); //a yı m1 e kopyala
delete a;
}
matris matris_trn(matris &m1)
{
matris a(m1.en,m1.boy);
for(int i=0;i<m1.boy;i++)
for(int j=0;j<m1.en;j++)
a.koy(j,i)=m1.al(i,j);//m1 i ters çevirip a ya koy
return a;
}
void matris_inverse(matris *a,matris *m)//m matrisinin inversini a matrisine koy
{
int boy=m->boy;
int en=m->en;
matris_ident(a,boy);//a matrisini birim matris yapalım
for(int i=0;i<en;i++)//önce matrisin tüm sütunlarını dönelim
{
//printf(" %d \n",i);
for(int j=0;j<boy;j++)// i ninci sütunda birim satırı 1 yapalım
{
int k;
for(k=i;k<boy;k++)//dolu satırı bul i den itibaren
{
if(m->al(k,i)==0) continue;//sıfırsa atla i hangi en sütünundayız o
break;//sıfır değil demek bu bana lazım k dolu satırım
}
//matrisin satırını değiştir
for(int t=0;t<en;t++)//matrisin i==j satırlarını doluyla değişelim
{
double s=m->al(i,t); m->koy(i,t) = m->al(k,t); m->koy(k,t)=s; //m matrisi
s=a->al(i,t); a->koy(i,t) = a->al(k,t); a->koy(k,t)=s; //a matrisi
}
double kk=m->al(i,i);
for(int t=0;t<en;t++)
{
m->koy(i,t)=m->al(i,t)/kk;
a->koy(i,t)=a->al(i,t)/kk;
}//bu satırı bir yaptık şimdi diğerlerini sıfır yapalım
break;
}
for(int j=0;j<boy;j++)//diğer satırları 0 yap
{
if(m->al(j,i)==0) continue;//zaten sıfırmış gerek yok
if(j==i) continue; //bu satırı geç
double kk=m->al(j,i);
for(int t=0;t<en;t++)
{
m->koy(j,t)-=m->al(i,t)*kk;
a->koy(j,t)-=a->al(i,t)*kk;
}
}
}
}
void hesap_matris()
{
printf("<<<<<<<<<<hesap_matris()\n");
double pp[] = { 0,0,1,9,
5,0,9,0,
2,7,0,5,
0,3,0,6 };
matris mat_b(pp, 4, 4);
mat_b.yaz_konsola();
matris mat_c;
matris_inverse(&mat_c, &mat_b);
mat_b.yaz_konsola();
mat_c.yaz_konsola();
memcpy(mat_b.p, pp, 16 * sizeof(double));
//10*10 luk matris yapıp inversini al
matris mat_k;
matris_ident(&mat_k, 10);
for (int i = 0; i<100; i++)
mat_k.p = sin(double(i));
mat_k.yaz_konsola();
matris_inverse(&mat_c, &mat_k);
mat_c.yaz_konsola();
mat_k.yaz_konsola();
/**/
matris_inverse(&mat_k, &mat_c);
mat_k.yaz_konsola();
matris_inverse(&mat_c, &mat_k);
mat_c.yaz_konsola();
/**/
matris m(0,0,1,9,
5,0,9,0,
2,7,0,5,
0,3,0,6),m3;
m3=m*m+m;
m.yaz_konsola();
m3.yaz_konsola();
}