Matris sorusu

Bu konuyu okuyanlar

kryhn

Öğrenci
Katılım
26 Nisan 2017
Mesajlar
12
Reaksiyon puanı
1
Puanları
3
Yaş
25
Bir matris class'ı tanımlayınız. Bu class içerisine matrisin elemanlarını atayacağınız bir
contructor tanımlayınız.
Ayrıca bu matrisin tersini geri döndüren bir fonksiyon yazınız. Dönen matrisin türü de
tanımladığınız class olmalı.
Yine kendisine parametre olarak gönderilen bir matris nesnesi ile ait olduğu
nesnenin değerleri arasına matris çarpımı ve toplamı yapan iki fonksiyon yazınız.
Bu fonksiyonların da geri döndürdükleri değerlerin türü de matris olmalıdır.
Böyle bir ödevim var yardım edebilirmisiniz? Hoca diyor ben istediğim satır ve sutunu girdiğimde bile calısacak matris tersi alan bir kod istiyorum diyor odev sırasında hani normal girilen matrisin satır ve sutun degerlerini alan bir kod yapıyorum fkat contructor ne onu zerre anlamadım.
 

laplaces256

Öğrenci
Katılım
15 Haziran 2018
Mesajlar
3
Reaksiyon puanı
0
Puanları
1
Yaş
42
//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();

}
 
Son düzenleme:
Üst