C'de matrisler

Matella
30-12-2010, 16:54   |  #1  
OP Taze Üye
Teşekkür Sayısı: 0
7 mesaj
Kayıt Tarihi:Kayıt: Ara 2010

1.Dışardan girilen bir matrisin esas köşegeni üzerinde bulunan elemanların kareleri toplamını bulan c prog yazınız
2.Dışarıdan girilen bir matrisin üst bölgesinde kalan elemanlardan pozitif ve çift olanların sayısını bulun
3.Dışarıdan girilen bir matrisin bir ortogonal matris olup olmadığını bulan c prograamını yazınız.
4.Dışarıdan girilen bir matrisin bir involid matris olup olmadığını bulan programı yazınız.(A^2=I)
5.Dışarıdan girilen bir matrisin bir simetrik matris olup olmadığını bulan programı yazınız.
Yardım ederseniz sevnirim...

muh34
31-12-2010, 15:02   |  #2  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

Sorularınız bir matris uzerinde yapılacak farklı işlemleri yansıttıgı icin ayrı ayrı olarak cevaplandıracagım.
 
1.Ilk olarak bir matrisin esas köşegenlerini,yani asal köşegenlerini bulmak istedigimizde,matrisin ilgili indislerinin eşitliği bulunan noktalara bakmamız gerecektir.Ornegin asagıdaki 3-3 bir matrisi goz onune alırsak,
 
M11 M12 M13
M21 M22 M23
M31 M32 M33
 
Yukarıda verilen matrisin asal köşegenleri sırasıyla M11,M22 ve M33 olacaktır.Soruda bizden istenen ise,bu sayıların karelerinin toplamıdır.O halde C dilinde yazacagımız kod asagıdaki gibi olabilir.
 
 #include <stdio.h>
#define boy 2
int main()  {
    int matrix[boy][boy]={
                          {1,2},
                          {2,4}
                          };          
    int i,sum=0;
    for(i=0;i<boy;i++)
    sum+=matrix * matrix;
    printf("Asal Kosegenlerin Toplami:%d",sum);
    getchar();
    return 0;
}
Başarılar
 
 
 
 
 
 

Son Düzenleme: muh34 ~ 31 Aralık 2010 15:03
muh34
31-12-2010, 15:15   |  #3  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

2. Matrisin 'Üst' bölgesi diye adlandırılan soruda,matrisin asal köşegenlerinin üst bölmesinde bulunan elemanları sorulmaktadır.Yine 3-3 bir matris uzerinde sorumuzu orneklendirelim.
 
M11 M12 M13
M21 M22 M23
M31 M32 M33
Şeklindeki bir matris ele aldıgımızda,asal köşegenlerin M11,M22 ve M33 oldugunu hatırlanacaktır.Dolayısıyla bu köşegen üzerinde kalan elamanlar M12,M13 ve M23 olacaktır.Soruda ise,bu degerlerin pozitif ve cift olması istenmektedir.Bir sayı 0'dan buyuk oldugu takdirde pozitif olarak adlandırılırken,sayı 2'ye kalansız bolunurse aynı zamanda cift bir sayı olma ozelligi kazanmaktadır.O halde yukarıdaki algoritmanın C dilindeki karsılıgı asagıdaki gibi olabilir.
 
#include <stdio.h>
#define boy 3
int main()  {
 
    int matrix[boy][boy]={
                          {1,2,3},
                          {2,4,4},
                          {6,7,8}
                          };
                         
    int i,j,count=0;
    for(i=0;i<boy;i++)
    for(j=i+1;j<boy;j++)
    if(matrix[j] > 0 && matrix[j]%2==0)
    count++;
    printf("Toplam Sayi:%d",count);
    getchar();
    return 0;
    }
Yukarıda beklenen cıktı 2 olacaktır.(M[0][1]=2 ve M[1][2]=4 degerleri icin).
Başarılar

Son Düzenleme: muh34 ~ 31 Aralık 2010 15:18
muh34
01-01-2011, 14:46   |  #4  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

3. Bir matrisin transpozesi ile carpımı birim matrisi veriyorsa,ilgili matris ortogonal bir matris olarak adlandırılmaktadır.3-3 bir matris icin denklem takımlarını inceleyecek olursak,

M11 M12 M13       *        M11 M21 M31       =       1  0  0
M21 M22 M23                 M12 M22 M32                0  1  0 
M31 M32 M33                 M13 M23 M33
 0  0  1

Yukarıdaki formülasyonu elde ederiz.O halde yapmamız gereken ilk iş,matrisin transpozesini almak olacaktır.Daha sonra aynı köke ait bu iki matrisi çarparak sonucun birim matrise endekslenebileceğini test etmemiz gerekecektir.Anlatılan bu algoritmanın C dilindeki karşılığı aşağıdaki gibi olabilir.

#include <stdio.h>
#define row 2
#define field 2

int birimMatris(int sonucMatris[][field]) {

int flag=1,i,j;
for(i=0;i<row;i++) {
for(j=0;j<field;j++) {
if(i==j && sonucMatris[j]!=1) 
flag=0;
else if(i!=j && sonucMatris[j]!=0) 
flag=0;
}
if(!flag)
break;
}
if(flag)
printf("Matris ortogonal bir matristir\n");
else
printf("Matris ortogonal bir matris degildir\n");
}
void tranzpozAl(int tranzpozMatris[][field],int ilkMatris[][field]) {

int i,j;
for(i=0;i<row;i++)
for(j=0;j<field;j++)
tranzpozMatris[j]=ilkMatris[j]; // transpose alinir
}

void matrisCarp(int resultMatrix[][field],int ilkMatris[][field],int transpozMatris[][field]) {
int i,j,k;
for(i=0;i<row;i++)
for(j=0;j<field;j++)
for(k=0;k<2;k++) 
resultMatrix[j]+=ilkMatris*transpozMatris[j]; // iki matris carpilir
}

int main()  {

int sonucMatris[row][field]={0,0};
int ilkMatris[row][field]={{1,0},{0,-1}};
int transpozMatris[field][row];
tranzpozAl(transpozMatris,ilkMatris);
matrisCarp(sonucMatris,ilkMatris,transpozMatris);
birimMatris(sonucMatris);
getchar();
return 0;
}
Yukarıdaki programda dikkat edilirse uygulanan her işlem ayrı bir fonksiyon baslıgında yer almaktadır.Bilgisayar biliminde bir cok problemin matris yoluyla cozuldugunden dolayı,görev akışının bagımsız parcalardan bir araya gelmesini anlamak daha kolay olacagının kanaatindeyim. 

Başarılar

muh34
01-01-2011, 14:55   |  #5  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

4. Sizinde belirtmiş oldugunuz uzere,bir matrisin karesi birim matrise eşit ise ilgili matris bir invalid matris olarak nitelendirilmektedir.Bu soru icin yapılması gereken ilk iş matrisi kendisiyle çarpmak olacaktır.Daha sonra cıkan sonucu birim matrise endeksleyerek,sonucun birim matris cinsinden tanımını yapmak olacaktır.Algoritmanın C dilindeki karsılıgı ise,

#include <stdio.h>
#define row 2
#define field 2

int birimMatris(int sonucMatris[][field]) {

int flag=1,i,j;
for(i=0;i<row;i++) {
for(j=0;j<field;j++) {
if(i==j && sonucMatris[j]!=1) 
flag=0;
else if(i!=j && sonucMatris[j]!=0) 
flag=0;
}
if(!flag)
break;
}
if(flag)
printf("Matris invalid bir matristir\n");
else
printf("Matris invalid bir matris degildir\n");
}

void matrisCarp(int resultMatrix[][field],int ilkMatris[][field],int ikinciMatris[][field]) {
int i,j,k;
for(i=0;i<row;i++)
for(j=0;j<field;j++)
for(k=0;k<2;k++) 
resultMatrix[j]+=ilkMatris*ikinciMatris[j]; // iki matris carpilir
}

int main() {

int sonucMatris[row][field]={0,0};
int ilkMatris[row][field]={{1,0},{0,1}};
matrisCarp(sonucMatris,ilkMatris,ilkMatris);
birimMatris(sonucMatris);
getchar();
return 0;
}
Şeklinde olabilir.

Başarılar

muh34
01-01-2011, 15:08   |  #6  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

5. Son olarak bir matrisin simetrik bir matris olabilmesi demek,asal kosegenlerinin ust eksen ve alt eksendeki elemanların birbirlerine eşit olması demektir.Bu kuralı asagıdaki matrisimizde inceleyecek olursak,

M11 M12 M13
Yandaki gibi 3-3 bir matriste asal kosegenler M11,M22 ve M33 olacaktır.Bu kosegen
M21 M22 M23    eksenindeki ust elemanlar ise M12,M13 ve M23 ucgenidir.Ote yandan alt elemanlar 
M31 M32 M33    ise,M21,M31 ve M32 olacaktır.O halde atılması gereken tek adım bu elemanların birbiri arasındaki eşitliği test etmektir.Bu eşitlik ise simetrik anlayışı esasını uygularak gercekleşecektir.Bu yuzden literatürdeki matris simetrik matris adını almaktadır.Asal koşegenlerin alt ve ust elemanlarından hangileri simetriktir sorusunun cevabını verecek olursak sırasıyla,M12-M21  ,  M13-M31  ,  M23-M32 indislerinde bulunan eleman ciftleri olacaktır.Dikkat edilirse,bir matris icerisinde bulunan i-j'inci herhangi bir elemanın simetriği,j-i'inci eleman olmaktadır.Yani burada ters indis ozelligi rahatlıkla gorulmektedir.Sonuc olarak yukarıda anlatılan adımları koda dokecek olursak,algoritmanın C dilindeki karsılıgı asagıdaki gibi olacaktır.

#include <stdio.h>
#define boy 3

int main() {

    int matrix[boy][boy]={
                          {1,2,3},
                          {2,4,5},
                          {3,5,8}
                          };           
    int i,j,flag=0;
    for(i=0;i<boy;i++) 
    for(j=0;j<boy;j++) 
    if(matrix[j]!=matrix[j]) {
    flag=1;
    break;
}
if(!flag) 
printf("Matris Simetriktir\n");
else
printf("Matris Simetrik Degildir\n");
    getchar();
    return 0;
}

Başarılar

Matella
01-01-2011, 20:19   |  #7  
OP Taze Üye
Teşekkür Sayısı: 0
7 mesaj
Kayıt Tarihi:Kayıt: Ara 2010

Teşekkür ederim özellikle açıklamalar için.

Matella
12-01-2011, 02:10   |  #8  
OP Taze Üye
Teşekkür Sayısı: 0
7 mesaj
Kayıt Tarihi:Kayıt: Ara 2010

ben şuan bunları ezberledim fakat  {1,2,3} {2,4,5} vs..die tabir ettiğinz şeyi anlayamadım bundan dolayı esnek bi örnekte tıkanıp kalıorum bilgilendirirseniz sevinirim.

muh34
12-01-2011, 12:28   |  #9  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

{1,2,3},{2,4,5} gibi ifadeler matrise ilk degerini veren satirlardir.Bir diziye ilk deger atamalari {} operatorleri ile yapılmaktadır.Dolayısıyla yukarıdaki atamalardan sonra dizinin elemanları M11=1 M12=2 M13=3 M21=2 .. seklinde yapılandırılacaktır.2 boyutlu matrise eleman yuklenmesi yukarıdaki yöntemden farklı olarak,kullanıcıdan degerler alınarak da gercekleştirilebilir.Bunun icinde asagıdaki gibi kod satırları yazılabilir.

int i,j;
for(i=0;i<boy;i++)
for(j=0;j<boy;j++) {
printf("%d.%d elemani giriniz:",i,j);
scanf("%d",&matrix[j]);
}

Bu durumda da kullanıcı klavyeden degerler girerek ilgili matrise elemanlari input fonksiyonu ile yuklemiş olacaktır.

Başarılar

Matella
12-01-2011, 17:40   |  #10  
OP Taze Üye
Teşekkür Sayısı: 0
7 mesaj
Kayıt Tarihi:Kayıt: Ara 2010

tmm teşekrler şimdi daha iyi anladım

Cihan67
12-03-2013, 15:58   |  #11  
Taze Üye
Teşekkür Sayısı: 0
2 mesaj
Kayıt Tarihi:Kayıt: Mar 2013

Benim Bir matrisin çarpmaya göre tersini bulan program yazmam lazım yardımcı olursanız çok sevinirim. Benim için çok önemli bir olay.

Artxzta
05-03-2015, 01:02   |  #12  
Taze Üye
Teşekkür Sayısı: 0
6 mesaj
Kayıt Tarihi:Kayıt: Mar 2015

Dışarıdan girme kısmını halledeceğini düşünüyorum kod burda:

[ Tüm kodu seç ] [ Yeni Pencerede Göster ]
#include <stdio.h> #include <math.h> void main() {   int matris[3][3] =   {     { 1, 2, 3 },     { 4, 5, 6 },     { 7, 8, 9 }   };   int i, toplam;   double n;   for (i = 0, n = sqrt(sizeof(matris) / sizeof(int)), toplam = 0; i < n; i++)   {     toplam += matris[i][i];   }   printf("%d", toplam);   getchar();   getchar(); }

sefa akhan
10-12-2015, 14:44   |  #13  
Taze Üye
Teşekkür Sayısı: 0
1 mesaj
Kayıt Tarihi:Kayıt: Ara 2015

Benımde bı sorum vardı ama ılgılenebılecek varsa cok memnun olurum.


kullanıcının degerlerını rasgele olarak 1 2 3 4 sayılarından 4er tane gırerek olusturulan 4x4luk matrısın, satırlara sıra ıle 1. satıra 4 tane 1 , 2. satıra 4 tane 2, 3. satıra 4 tane 3 ve 4. satıra 4 tane 4 seklınde yazan programı yapabılecek var mı ??(swaplama yontemı denılen yontemle yapılması gereklı)