Yazan : Şadi Evren ŞEKER

Bir matrisin tersini almak çarpma işlemine göre tersini almak anlamındadır. Örneğin A ve B matrislerinin çarpımından C matrisi çıkıyorsa; C matrisi ile A matrisinin tersi B matrisini vermelidir. Bunu bir nevi bölme olarak düşünmek de mümkündür.

2 boyutlu bir matrisin tersini bulmak içn öncelike determinantı hesaplanır ardından aşağıda gösterildiği üzere elemanları yer değiştirilir:

Yukarda, ilk satırda verilen A matrisinin determinantı hesaplanmış ( |A| ) ve gösterilen yerdeğiştirmiş matris ile skalar (scalar) çarpım yapılmıştır.

Sonuçta elde edilen matris, orjinal A matrisinin tersidir.

Matris 3×3 boyutlarında olsaydı bu hesaplama aşağıdaki şekilde yapılmalıydı:

Görüldüğü üzere matrisin boyutunun değişmesi halinde ters alma işlemi de değişmektedir. Yukarıdaki mantık ile örneğin 4×4’lük bir matris’in tersi alınırken önce 3×3 alt matrislerinin yazılması ardından her bir alt matrisin determinantının yukarıdakine benzer şekilde yerleştirilmesi gerekir.

4×4’lük matrisin tersinin alınması (Utku Bey’in isteği üzerine yazıyorum)

matris tersi alınırken, matrisin boyutunun önemi olunmaksızın determinant alınarak işlem yapılır. Örneğin matris boyutu nxn ise bu matriste (n-1)x(n-1) boyutlarındaki alt matrislerin determinantlarının yer değiştirmiş halleri hesaplanır ve 1/|A| değeri ile skalar çarpım yapılır.

Örneğin matrisimiz aşağıdaki şekilde 4×4 boyutlarında bir matris olsun

Yukarıdaki bu matrisin tersini almak için öncelikle determinantını hesaplayalım:

Ters alma işlemi için determinant sıfırdan farklı olmalıdır. Ardından matrisin tersini alalım:

Buradaki kapalı şekilde yazılan b değerleri ters alma işleminden sonra yapılan yer değiştirmeyi göstermektedir. Yani örneğin b11 değeri, 1. satır ve 1. sütundaki değerleri kapanmış halde matrisin determinantının alınması ile bulunur.

Benzer şekilde b23 değeri için, orjinal matriste bulunan 2. satır ve 3. sütundaki sayılar dışında kalan sayılardan (ki bu sayılar 3×3 boyutlarında bir matris oluşturur) elde edilen determinant değeridir.

Buradaki b değerleri, matrisin verilen satır ve sütun için kofaktörüdür (cofactor).

Bu değerleri açık şekilde yazacak olursak:

şeklinde sayıları sıralayabiliriz.

Yukarıdaki ters alma işlemi kısaca olay iki parçadan oluşuyor, birinci aşamada determinant almanız gerekiyor (nxn boyutundaki bir matris determinantı bilgisayar kullanarak en kolay leibniz yöntemi ile alınır)

ikinci adımda b terimlerini hesaplamanız gerekiyor. Bu terimlerin hesabı için hangi koordinat hesaplanacaksa, o koordinatın satır ve sütunu kapatılıp geri kalan elemanlar bir sarmal şeklinde çarpılır. Bu durumu linkteki örnekten açıkça görebilirsiniz. Örneğin b21 için 2. satır ve 1. sütun kapatılıp kalan elemanlar bir sarmal şeklinde çarpılıp toplanmıştır. Burada mod işlemi ile sarmallık sağlanabilir.

Gauss Jordan Yöntemi

Gelen bir soru üzerine, Gauss Jordan yöntemini adım adım anlatan yeni bir bölüm ekliyorum. Öncelikle yukarıdaki kodda, Gauss Jordan metodunu kullanıyoruz. Bu metotta amaç bir matrisin tersini almak için tersi olan matris ile çarpımını, birim matrise dönüştürmektir.

A x A-1 = I

işlemine göre şayet A matrisinin tersi isteniyorsa

A x B = I , şeklinde yazdığımız B matrisi, A matrisinin tersidir ve

I = A x B , şeklinde yazılabilir.

Buradaki B matrisini elde ederken aslında birim matris üzerinde işlem yapılarak A matrisinin tersi alınmış olur.

Örneğin aşağıdaki matrisi ele alalım:

101

021

111

Bu matrisin tersini alırken öncelikle yanına bir çizgi çekip birim matrisi yazıyoruz:

101|100

021|010

111|001

Buradaki amacımız sol ve sağ tarafta aynı işlemleri yaparak sol tarafta birim matrisi elde etmektir. Böylelikle sağ tarafta matrisin tersi oluşacaktır. Bu satırlar üzerinde yapılan işlemlerre yalın satır işlemleri (elementary row operations) ismi verilir. Bu işlemler aşağıdaki şekilde sıralanabilir:

  • bir satırın bir sabit ile çarpılması
  • Bir satırın diğer bir satır ile yer değiştirmesi
  • Bir satırın diğer bir satırdan çıkarılması

Elbette yukarıdaki bu işlemler, çizginin iki tarafına da uygulanacaktır. Buradaki işlemler aslında bir matriste bir denklemin tutulması durumunda denklemler üzerine yapılan işlemlere benzetilebilir. Örneğin 3 bilinmeyenli 3 denklem ele alınırsa bir denklemin diğer denklemin çözümünde kullanılırken yapılan işlemler gibidir.

Şimdi matrisin tersini alma işlemi ile devam edelim. Amacımız ilk sütunu birim matrise benzetmek. İlk sütunda 3. satırda bulunan 1 tek farklı sayıdır. Dolayısıyla 3. satırın ilk terimini 0 yapabilmek için ilk satırı, 3. satırdan çıkarabiliriz.

101|100

021|010

010|-101

yukarıdaki işlem sonucunda görüldüğü üzere çizginin solundaki ilk satır 3. satırdan ve çizginin sağındaki ilk satır yine çizginin sağındaki 3. satırdan çıkarılmıştır.

çizginin solunda elde edilen 3. satır aslında birim matrisin ikinci satırıdır. O halde 3. satır ile 2. satırı yer değiştirirsek matrisin sol tarafından birim matrise daha çok yaklaşılmış olunur.

101|100

010|-101

021|010

Yine 3. satırı birim matrise benzetmek için bu sefer 2. satırın 2 mislini, 3. satırdan çıkarmak yeterlidir.

101|100

010|-101

001|21-2

Yukarıda görüldüğü üzere çizginin iki yanında da ikinci satır 2 ile çarpılmış ve 3. satırdan çıkarılmıştır.

Sırada ilk satırı birim matrise benzetmek var. Bu işlem için ilk satırdan 3. satırı çıkarmak yeterlidir:

100|-1-12

010|-101

001|21-2

Görüldüğü üzere çizginin sol tarafından birim matri elde edildi. Bu durumda matrisin sağ tarafında elde ettiğimiz matris, ilk matrisin tersidir.

1-12

-101

21-2

sonucunu bulmuş oluruz.

Programlama

Matrisin tersinin alınması işleminin bilgisayarlar marifetiyle yapılması için algoritmik bir yaklaşıma ihtiyaç vardır. Bu bağlamda matrisin boyu ve içeriğinden bağımsız olarka matrisin tersini almak için aşağıdaki yaklaşımı kullanabiliriz.

Bir matrisin tersi, matrisin kendisi ile çarpıldığına birim matrisi veren matristir. Birim matris (identity matrix) ise diyagonu 1 ve diğer elemanları 0 olan matristir.

Öyleyse bir matrisi gerekli işlemleri yaparak birim matrise dönüştürürsek ve bu işlemler sırasında her elemana yapılan değişimi tutarsak sonuçta elde ettiğimiz bu değişim matrisi, orjinal matrisimizin tersi olacaktır.

Aşağıda bu işlemleri adım adım yapan C kodunu yazıp açıklamaya çalışalım.

İlk adımda matris boyutunu ve içeriğini dolduralım.

Kodun ilk kısmında görüldüğü üzere 4×4 boyutlarında bir matris tanımlanmış ve bu matrisin içeriği ekrana bastırılmıştır. Yukarıdaki tanım itibariyle matrisimizin içeriği aşağıdaki şekildedir:

Şimdi bu matrisin tersini alma işlemi sırasında kullanacağımız birim matrisi döngüler ile oluşturabiliriz:

Yukarıdaki kod, köşegeninde (diagon) 1 olan ve diğer elemanları 0 olan bir matris inşa etmektedir. Bu işlem için matrisin satır ve sütun koordinatlarını tutan i ve j döngü değişkenlerinin eşit olması durumu 1, diğer durumlar 0 olarak döngülerde kodlanmıştır.

Şu anda, tersi alınması istenen matris a dizisinde, birim matris ise b dizisinde tutulmaktadır. Yapılaması gereken, a matrisini b matrisine dönüştürmektir.

Yukarıda görüldüğü üzere kodun 24-27. satırları arasında matrisin diyagonu olan değerleri 1 yapacak değerler bulunmaktadır. Bir sayının kendisine bölümü 1’dir. Dolayısıyla matrisin tersi olan sonuç matrisimizdeki, ki şu an itibariyle birim matristir, diyagon değerleri, orjinal matrisin diyagon değerlerine bölünmüştür.

Ardından diyagon olmayan değerler için dönene ve 28. satırda başlayan ikinci döngü ile diyagonda olmayan elemanlardan, diyagondaki elemanla çarpımları çıkarılmaktadır. (kodun 32. satırındaki k değişkeni o satırdaki diyagon değerini vermektedir. Bu değer orjinal matristeki değer ile çarpılıp yine aynı satır ve sütundaki değerden çıkarılmaktadır)

Bu işlem hem orjinal matris hem de sonuç matrisinde bire bir yapılır ve sonuçta sonuç matrisimiz b değişkeni içinde oluşur. Bu değeri bastırmak için aşağıdaki şekilde bir döngü yazılması yeterlidir.

Kodumuzun çalışan hali aşağıda verilmiştir:

Yorumlar

  1. utku sönmez

    iyi günler. acaba benim için 4×4 bir matrisinde tersini yazabilir misiniz buradaki gibi? Bir de 3x3lük matrisin tersini alırken alıcağımız determinantları neye göre yerleştiricez.
    teşekkürler.

  2. Şadi Evren ŞEKER Article Author

    elbette, yazının içerisine ekleme yapıyorum sanırım birazdan yayınlarım.

    umarım yardımcı olur

    başarılar

  3. Mehmet Türkoğlu

    C’yi bilmediğim için bunu soruyorum. File/New/Project dedikten sonra hangisini seçeceğiz?

  4. Şadi Evren ŞEKER Article Author

    Hangi editörü kullanıyorsunuz? C bir dildir ve pekçok farklı ortamda kodlanabilir. Aşağıda bazı C editörlerinin nasıl kullanıcağına dair daha önceden yayınladığım yazılara bağlantı veriyorum.

    Visual Studio 2010 ile C++ için
    http://www.bilgisayarkavramlari.com/2010/09/27/visual-c-2010/

    Dev-CPP Projelerini Visual Studio ile açmak için
    http://www.bilgisayarkavramlari.com/2010/05/01/dev-cpp-projelerinin-visual-studio-ile-acilmasi/

    Dev-CPP ve Visual Studio giriş için
    http://www.bilgisayarkavramlari.com/2008/10/06/c-ile-kodlama/

    Pardus üzerinde Dev-CPP çalıştırmak için
    http://www.bilgisayarkavramlari.com/2009/10/18/pardus-uzerinde-dev-cpp/

  5. Yunus Seçkin

    2×2 lik bir kare matrisin terisini bulan programı yazabilir misiniz hocam,,şu an dersteyim ve bunu vermeden çıkartmıyor hocamız:))yardımcı olursanız çok sevinirim..

  6. Şadi Evren ŞEKER Article Author

    yukarıdaki koda zaten istenilen boyuttaki matrisin tersini alabiliyor. Tek yapmanız gereken 4×4 boyutundaki matris yerine farklı bir matris yazıp 4 değerini bu yeni matrisin boyutu ile değiştirmeniz.

    başarılar

  7. merve

    merhaba.. benimde ödevim bu konu..oturup gauss jordan yöntemiyle kod yazmaya çalıştım ama sürekli access violation hatasını veriyo nerde yanlışş yapıyorum yardımcı olursanız sevinirim..:
    for(int i=0;i

  8. Şadi Evren ŞEKER Article Author

    kodunuzdaki değişkenlerde problem var büyük ihtimalle. örneğin sutun ve satir değişkenleri, matrisin boyutlarını tutan değişkenlerse, kodunuzdaki 2*sutun ibaresi hatalı olur. Sebebi matrisin dışında bir sutuna erişmeye çalışıyor olmanızdır.

    başarılar

  9. Arwen

    Yaaa bu çok açıklayıcı ve güzel olmuş ama bana fonksiyonlu ve Cofactor, determinant hesaplamalı lazım
    Uğarştı ama bi türlü işin içinden çıkamadım acaba yardımcı olabilir misiniz?

  10. Özge Erdoğdu

    Merhaba ödevim dolayısıyla ben bu programı c’de çalıştırmaya kalktım ancak açılmadı. c’de çalışması için ne yapmam lazım? Yardımcı olursanız çok sevinirim..

  11. burak

    merhaba benım porje odevım war konuları dev cpp ta matrıs tersı bulma ve dağılım fonksıyonunda ustel dagılım bu dersı gecmem buna baglı yardımcı olablrmısınız?

  12. Şadi Evren ŞEKER Article Author

    Burak Bey, nasıl bir yardıma ihtiyacınız olduğunu anlayamıyorum. Kodu yukarıda yazdık ve yayınladık zaten DEV-CPP ortamında çalışıyor bundan daha fazla ne yapılabilir ki?

  13. burak

    kusura bakmayın tekrardan rahatsız edıyorum daha once soledıgım gıbı matrıs tersı odevımdı.hocamız matrıs tersını ana menulu sekılde ıstıyor.

    #include
    #include
    #include
    #include

    void dagilimtablolarimenusu();
    void normaldagilimtablosumenusu();

    main()
    {
    dagilimtablolarimenusu();
    }

    void dagilimtablolarimenusu()
    {
    char c;
    system(“cls”);

    konum(5,20); printf(“==============================”);
    konum(6,20); printf(“= DAGILIM TABLOLARI MENUSU =”);
    konum(7,20); printf(“==============================”);
    konum(8,20); printf(“1) Poisson Dagilim”);
    konum(9,20); printf(“2) Normal Dagilim”);
    konum(10,20); printf(“3) F Dagilimi”);
    konum(11,20); printf(“4) T Dagilimi”);
    konum(12,20); printf(“5) Binom Dagilimi”);
    konum(13,20); printf(“6) Ustel Dagilim”);
    konum(14,20); printf(“7) Cikis”);
    konum(15,20); printf(“==============================”);

    c= ‘ ‘;
    while (c!=’7’)
    {
    konum(16,20); printf(“seciminiz:”);
    c= getch();
    switch(c)
    {
    case ‘1’ : printf(” bu ogrencinin konusu dahilinde degil”); break;
    case ‘2’ : printf(” bu ogrencinin konusu dahilinde degil”); break;
    case ‘3’ : printf(” bu ogrencinin konusu dahilinde degil”); break;
    case ‘4’ : normaldagilimtablosumenusu(); exit(0);
    case ‘5’ : printf(” bu ogrencinin konusu dahilinde degil”); break;
    case ‘6’ : printf(” bu ogrencinin konusu dahilinde degil”); break;
    }}
    }

    void normaldagilimtablosumenusu()
    {
    char c;
    system(“cls”);

    konum(5,20); printf(“=================================”);
    konum(6,20); printf(“= NORMAL DAGILIM TABLOSU MENUSU =”);
    konum(7,20); printf(“=================================”);
    konum(8,20); printf(“1) P(Xx)”);
    konum(10,20); printf(“3) P(a

  14. Şadi Evren ŞEKER Article Author

    Burak Bey;

    Yolladığınız ilk kodun, konu ile ilgisi yok. İkinci kodda bulunan case ‘1’ için yukarıdaki yazıda yayınlanan kodları yazmanız yeterli. İstediğiniz problemin çözümünü yapan kod zaten yayınlanmış durumda tek yapmanız gereken, yazıda yayınlanan bu kodu menu altına yerleştirmek.

    başarılar

  15. seher

    Merhabalar benim proje konumda dağılımlar.Yukarıdaki kodu yazdım fakat konum(5,20);printf(“===========================”);satırında hata veriyor yardımcı olursanız sevinirim.

  16. GOKHAN

    MERHABA 3 GUN SONRA TESLİM ETMEM GEREKEN ÖDEV ŞÖYLE:
    >>BOYUTU 10*10 ‘A KADAR DISARDAN GİRİLEN BİR KARE MATRİSİN TERSİNİ BULDURAN VE EKRANA YAZDIRAN CPP PROGRAMI YAZINIZ<< HOCAMIZ HANGİ YÖNTEMLE BULUNMASI GEREKTİĞİNİ BİZE BIRAKTI COK UGRAŞTIM ANCAK TAM OLARAK YAPAMADIM YARDIMCI OLABİLİRSENİZ COK SEVİNİRİM..TEŞEKKURLER

  17. merve

    merhaba.ödevim şu şekilde: dağılım tabloları anamenüsü oluşturuyorum ->
    Poisson Dagilim
    Normal Dagililim
    F Dagilimi
    T Dagilimi
    Binom Dagilimi
    Ustel Dagilim
    benim konum t dağılımı onu seçiyorum.t dağılım menüsü oluşturuyorum.
    “= t DAGILIM TABLOSU MENUSU =”);
    P(Xx)
    P(a

  18. Şadi Evren ŞEKER Article Author

    gelen sorular üzerine normal dağılım ve poisson dağılımını anlatan ve istediğiniz kodlamaları içeren yazıları siteye ekledim, diğer dağılımları benzer şekilde kodlayabeceğinizi düşünüyorum, umarım yardımcı olur.

    başarılar

    http://www.bilgisayarkavramlari.com/2011/06/08/poisson-dagilimi-poisson-distribution/
    http://www.bilgisayarkavramlari.com/2011/06/08/normal-dagilim-normal-distribution-gauss-distribution/

  19. adem

    merhaba bem bırsey sormak ıstıyorum.determınatı sıfır olan bır matrısın tersını alamıyoruz ama bunu sanal olarak tersını alabılıyoruz ya.onun nasıl olduguna daır bır fıkrım yok.4gun sonra sınavım var.yardımcı olabılır mısınız.sımdıden verecegınız cevap ıcın tesekur ederım.

  20. Şadi Evren ŞEKER Article Author

    sorunuz bir matrisin (masfuf) tersi olup olmaması ile ilgili. Bakın kare olmayan matrislerin, örneğin nxm boyutundaki bir matrisin (n≠m şartı ile) tersi yoktur. Sadece bazı özel durumlarda sol tersi (left inverse) veya sağ tersi (right inverse) olabilir, ancak bu bizim anladıımız ters değildir.
    Geriye sadece kare matrisler kalıyor. Bir kare matrisin tersinin olabilmesi için tekil masfuf (singular matrix) olmaması gerekir (bazı kaynaklarda dejenere (degenerate) (yeniden üretilmiş) tabiri de geçmektedir). Bir kare matrisin tekil olması ise ancak determinantının sıfır olması ile mümkündür. Yani determinantı sıfır olan matrisler singular matristri ve tersi yoktur.
    Peki biz determinantı sıfır olan bir matrisin tersini almaya çalışırsak ve yukarıda geçen yöntemleri denersek ne olur??
    Kofaktör yöntemi ile (cofactor) ters almaya çalışırsak 1/det(A) terimi ile karşılaşırız. Bildiğiniz üzere şayet det(A) = 0 durumu varsa, 1/0 belirsizdir.
    Şayet gauss jordan yöntemi ile ters almaya çalışırsanız ve yine det(A) = 0 durumu varsa, bu durumda satır sadeleştirmesi yapılamaz (diğer bir deyişle satırlar arası bağlantı yetersizdir), sonsuza kadar satır sadeleşmeye uğraşırsınız ama bir sonuca varamazsınız.

    Benim nacizane bilgim bu yönde, ama siz “sanal olarak tersini almak”‘tan bahsetmişsiniz, benim böyle bir bilgim yok, şayet daha fazla bilgi verir veya hangi kaynakta geçtiğini belirtirseniz çalışıp burada paylaşmaya gayret ederim.

    başarılar

  21. srcn

    Hocam 6×6 lık matrisin terisini alıyorum verdigiz algortmaya göre yalnız sonuçta soyle birsey cıkıyor
    -1.#ınd00 -1.#ınd00 -1.#ınd00 -1.#ınd00 -1.#ınd00 ….
    yardımcı olrsnız cok sevnrm

  22. srcn

    yok hocam hangi degeri girersem giriym bu degerleri veryr hep aynı sonuç çıkıyor,yukardakı 4×4 luk matrisn aynısın aldm 4 leri 6 yaptm

  23. Şadi Evren ŞEKER Article Author

    Anlamadım, 4×4’lük matrisin aynısını alıp 4’leri 6 yaparsanız zaten çalışmaz ki, 6×6 matrisin tersini alan kodu 4×4 matris üzerine uyguluyorsunuz demektir. Bir matrisin tersi olup olmadığını kontrol edin ya da en iyisi siz tersini almak istediğiniz matrisi buraya yazın ben bir deneyeyim belki bir yerde hata vardır.

    Başarılar

  24. srcn

    yk hocam matrisi 6×6 lık yaptım,bide hocam ilk indisi ben 1 den baslatmak ıstyrm kendisi normalde sıfırdan basltyr ya onun için s[7][7] yaptm tanmlarken..

  25. nur

    Hocam merhaba benım odevım 2*2 ve 3*3 tipindeki matrislerinin çarpma işlemine göre tersinin bulunması bana biraz acıklayabılırmısınız ödevim cok onemli

  26. yeşim

    benim ödevimi pazartesi gününe kadar hocaya vermem lazım ödevim şu şekilde 2×2 ve3x3 matrisinin tersi. araştırdım da net bir bilgi bulamadım yardımcı olursanız çok sevinirim şimdiden teşekkürler…

  27. Şadi Evren ŞEKER Article Author

    Yukarıdaki yazıda sorunuzun cevabı açık ve net bir şekilde zaten anlatılmış. Yazıda cofactor yöntemi ve gauss jordan yöntemi kullanılarak iki farklı şekilde nasıl alınacağı gösterilmiş ve kodu verilmiş, anlayamadığınız nokta neresi sorarsanız belki yardımcı olabiliriz.

    Başarılar

  28. Anonim

    turbo pascalda bir kare matrisin aynadan yansımasını weren program kodunu lütfen biri paylasabilir mi?

  29. onur

    Yalnız ufak bir sorun var. Matrisin 1×1 elemanı 0 olduğu zaman hata veriyor

    d = a[i][i]

    buradan, d 0 geldiği için.

    Bunu nasıl çözeriz?

  30. onur

    Kastettiğim o değildi hocam,

    1.satır 1.sütun elemanı 0 olan matrisin tersini alamıyor

    d = a[i][i] ataması yaptığımız için

    Bunu sormuştum

  31. Şadi Evren ŞEKER Article Author

    BU durumdaki bir matrisin tersi yoktur. Bakın matrisin tersinin olabilmesi için matrisin tam derece (full rank) özelliğinin bulunması gerekir. Bunun anlamı, bir matisteki satırlar arasında doğrusal bağlantı bulunmaması (linear independent) gerektiğidir. Aksi halde matrisin tersi alınamaz. Şayet diyagon üzerindeki herhangi bir değer 0 olursa, bu durumda matrisin tersi yoktur.
    Benzer durum aşağıdaki örnek matris için de geçerlidir

    1 2 3
    2 4 6
    

    Yukarıdaki matriste satırlar arasında x2 bağlantısı bulunduğu için (ikinci satır, ilk satırın iki mislidir) bu matrisin derecesi 1 olacak ve yine tam derece (full rank) olmadığı için tersi alınamayacaktır. Tam derece ile anlatılmak istenen bir matrisin satır sayısının, birbirinden doğrusal olarak bağımsız satır sayısına eşit olması durumudur. Örneğin yukarıda, aralarında doğrusal bağlantı bulunmayan tek satır olduğu için derecesi 1 olmuştur.

  32. yusuf

    (5*5 matrisin tersi derecesi ve transpozesini bulan proğram proje ödevim büyük bir oran da etkisi var C# dilinde yazılacak) ve çok sıkıştım yardımlarınızı bekliyorum hiç bir bilgim yok

  33. Şadi Evren ŞEKER Article Author

    ilgili kod zaten ilgili konu altında var. Transpoze yani matris ters yüz eden kodu aşağıdaki bağlantıda bulabilirsiniz:

    http://www.bilgisayarkavramlari.com/2008/12/29/matris-tersyuz-matrix-transpose/

    Burada 3×3 boyutunda bir matris için C dilinde kod verilmiş ancak C# diline çevirmeniz ve 5×5 için uyarlamanız oldukça kolay (döngüleri ve matris boyutlarını, kısacası kodda 3 gördüğünüz her yeri 5 yapmanız yeterli)

    Başarılar

  34. yusuf

    hocam teşekkür ederim..
    Bir sorum daha olacaktı yardımlarınıza ihtiyacım var ..

    5*5 matris in( transpoz, determinant, tersi, derecesi) ini C# dilinde yazınız bu benim proje ödevim.
    –> Derecesini bulduramadım yardımcı olabilirseniz çok sevinirim.

  35. Şadi Evren ŞEKER Article Author

    Şimdi bu derece kelimesi çok problemli bir kelime 🙂

    Birincisi bu dereceyi (degree) her disiplin kendisi için kullanır. Örneğin network çalışanlar için matris bir şekli (graph) ifade ettiği için ve matriste komşuluk matrisini (adjacency matrix) tuttukları için aslında kast ettikleri bir düğümün en fazla kaç komşusu olduğudur. Bunu en yüksek sayısal değeri bularak hesaplarsınız.

    Polinom matris kullananlar, her satırda bir polinom değeri tuttuğu için bu değerlerden en yüksek üste sahip olanını bulmak isterler (örneğin bir satırdaki en yüksek değer x3 ise bu durumda matrisin o satırının derecesi 3 ve bütün satırlar arasındaki en yüksek değer de üç ise matrisin derecesi 3 bulunur.

    Rasyonel sayı matrisi tutanlar, en yüksek paydayı bulmak isterler.

    Bu liste uzar gider. Ama şayet kast ettiğiniz ve Türkçede yine derece ile anlatılan matrix rank ise o basit.

    Tanım itibariyle doğrusal olarak bağımsız satır sayısı (linearly independent row) anlamına gelir. Bunun için kademe dönüşümü (echelon transformation) alınır (daha özel olarak satır kademe dönüşümü (row echelon transformation)) ve ardından sıfır olmayan satırlar sayılır.

    Aslında bu konuyu da anlatan bir yazı siteye eklesem iyi olur ama basit bir doğrusal cebir kitabını (linear algebra) açarsanız bu tip bilgileri bulabilirsiniz, daha detaylı açıklamayı en kısa sürede eklemeye çalışacağım.

    {EDIT}
    İlgili yazıları siteye ekledim:
    http://www.bilgisayarkavramlari.com/2012/04/16/matrisin-derecesi-matrix-rank/
    http://www.bilgisayarkavramlari.com/2012/04/16/row-echelon-matrix-satir-kademe-matrisi/
    {/EDIT}

    Başarılar

  36. yusuf

    şuan bende sizin gibi şaşırdım hocam

    — >5*5 bir matrisin derecesi =(5 – köşegen matris üzerindeki sıfırların sayısı) ,

    Hocamızın sadece bunu istiyor olabileceğini düşünmüyorum :-S

  37. Şadi Evren ŞEKER Article Author

    Eh bunu yapmak gayet basit değil mi:

    int d = 0;
    for(int i = 0;i
    

    satır ve sütünların eşit olduğu duruma bak (ki bu köşegendir) şayet 0 değilse d değişkenini bir arttır.

    Başarılar

  38. yusuf

    hocam 4*4 matrisin tersini bulma işlemi için verdiğiniz yukarıdaki komutları 5*5 matrisin tersini bulma işlemi için sadece döngü lerde gördüğüm 4 leri 5 yapmam yeterlimidir ?

  39. yusuf

    Hocam Çift boyutlu dizi kullanarak Textbox tan matris değerlerini almak istiyorum 2 – 3 gündür uğraşıyorum ama tek tek girerek yapabildim yardımcı olabilimisiniz C# ta
    teşekkür ederim

  40. yusuf

    ewet hocam determinant kodundan bahsediyorum. Hocam tersine de ugrasıyorum da sizin girdiginiz degerler ile aynı sonucu bulamıyorum. bununla da ilgili ne yapabiliriz. Tesekkur ederım

  41. yusuf

    Hocam Tersini bulma işlemi için sizin yazdığınız programı alttaki gibi yazdım.Değerleri formda 16 textbox ve bir button la oluşturup c# a uyarladım ama çıktıda bir sorun var..Sanırım 2.kısımdaki programı yani tersi alma kısmındaki kodları algılamıyo yaardımcı olursanız sevinirm.
    teşekkürler..

    çıktı :
    1000
    0100
    0010
    0001

                    float[,] dizi1 = new float[4, 4];
                    float[,] b = new float[4, 4];
    
                    dizi1[0, 0] = Convert.ToInt16(textBox1.Text);
                    dizi1[0, 1] = Convert.ToInt16(textBox2.Text);
                    dizi1[0, 2] = Convert.ToInt16(textBox3.Text);
                    dizi1[0, 3] = Convert.ToInt16(textBox4.Text);
                    
                    dizi1[1, 0] = Convert.ToInt16(textBox6.Text);
                    dizi1[1, 1] = Convert.ToInt16(textBox7.Text);
                    dizi1[1, 2] = Convert.ToInt16(textBox8.Text);
                    dizi1[1, 3] = Convert.ToInt16(textBox9.Text);
                    
                    dizi1[2, 0] = Convert.ToInt16(textBox11.Text);
                    dizi1[2, 1] = Convert.ToInt16(textBox12.Text);
                    dizi1[2, 2] = Convert.ToInt16(textBox13.Text);
                    dizi1[2, 3] = Convert.ToInt16(textBox14.Text);
                   
                    dizi1[3, 0] = Convert.ToInt16(textBox16.Text);
                    dizi1[3, 1] = Convert.ToInt16(textBox17.Text);
                    dizi1[3, 2] = Convert.ToInt16(textBox18.Text);
                    dizi1[3, 3] = Convert.ToInt16(textBox19.Text);
                
                    for (int i = 0; i < 4; i++)
                    {
                        for (int j = 0; j < 4; j++)
                        {
                            if (i == j)
                                b[i,j] = 1;
                            else
                                b[i,j] = 0;
                        }
                    }
    
                    float d, k;
                    for (int i = 0; i < 4; i++)
                    {
                        d = dizi1[i, i];
                        for (int j = 0; j < 4; j++)
                        {
                            dizi1[i, j] = dizi1[i, j] / d;
                            b[i, j] = b[i, j] / d;
                        }
                        for (int x = 0; x < 4; x++)
                        {
                            if (x != i)
                            {
                                k = dizi1[x, i];
                                for (int j = 0; j < 4; j++)
                                {
                                    dizi1[x, j] = dizi1[x, j] - (dizi1[i, j] * k);
                                    b[x, j] = b[x, j] - (b[i, j] * k);
                                }
                            }
    
                        }
                    }
                    textBox26.Text = dizi1[0, 0].ToString();
                    textBox27.Text = dizi1[0, 1].ToString();
                    textBox28.Text = dizi1[0, 2].ToString();
                    textBox29.Text = dizi1[0, 3].ToString();
    
                    textBox31.Text = dizi1[1, 0].ToString();
                    textBox32.Text = dizi1[1, 1].ToString();
                    textBox33.Text = dizi1[1, 2].ToString();
                    textBox34.Text = dizi1[1, 3].ToString();
    
                    textBox36.Text = dizi1[2, 0].ToString();
                    textBox37.Text = dizi1[2, 1].ToString();
                    textBox38.Text = dizi1[2, 2].ToString();
                    textBox39.Text = dizi1[2, 3].ToString();
    
                    textBox41.Text = dizi1[3, 0].ToString();
                    textBox42.Text = dizi1[3, 1].ToString();
                    textBox43.Text = dizi1[3, 2].ToString();
                    textBox44.Text = dizi1[3, 3].ToString();
    
  42. Huzeyfe

    4×4′lük matrisin tersinin alınması (Utku Bey’in isteği üzerine yazıyorum)

    Bölümde determinant alırken a12 ile başlayan sütünu yazarken galiba bir gözden kaçma olmuş. Eğer yanılıyorsam kusura bakmayın. İyi çalışmalar

  43. esra

    merhaba hocam NxN lık bır matrıste satır ve sutun yer degıstırmesını bulan program lazım yardımcı olursanız sevınırım

  44. cbasaranoglu Article Author

    esra hanım matrisin transpozunu alan ana kod hocamızın belirttiği gibi http://www.bilgisayarkavramlari.com/wp-content/uploads/matris_ters5.jpg ‘tir.
    öncelikle NxN matrisinde bu işlemi yapmanız için iki yöntem vardır.
    Birinci yöntem kullanıcıdan N değerlerini ve matrisin içerisini dolduran verileri alıp transpoze etmek.
    ikinci yöntem bütün değerleri Random fonksiyonu yardımı ile alıp transpoze etmek.
    bu iki yöntemi yukarıda ki ana fonksiyonuda programınıza dahil edip uygulayınız.Eğer bir çözüm yolu bulamazsanız sorununuzu tekrar yazarsınız.
    iyi çalışmalar

  45. Çağrı

    Hocam merhabalar kodda bir eksiklikmi var acaba aynı kodu yazdım sizinkiyle aynı sonucu alamadım ayrıca c matrisini hiç kullanmamışız burda tanımlama yapmışız ama

  46. Şevket ŞENOL

    Klavyeden girilen N değeri ile NxN lik bir matris oluşturulacaktır. Köşegeni (aii) 1 lerden, köşegenin altı
    (-1 ile -9 arası) rasgele sayılardan, köşegenin üstü ise (1 ile 9) arası rasgele sayılardan meydana
    gelmelidir

  47. Şadi Evren ŞEKER Article Author

    “Singüler matrisler ile ilgili veri” ile neyi kastediyorsunuz? Biraz daha açık yazarsanız yardımcı olmaya çalışayım. Yani singular matrix konusunu anlatan bir yazıya mı ihtiyacınız var? Basitçe determinantı 0 olan matrislere singular matrix denir ama sizin ihtiyacınız tam olarak nedir?

  48. abdulgafur çapadiş

    y.lisans öğrencisiyim ve ödev konum singüler matrislerin ters alma yöntemleri.. birkaç literatür çalışması yaptım hocam ama yeterli değil.. öncelikli ihtiyacım singüler matris nedir, nasıl ve nerelerde kullanılır gibi basit soruları cevaplayacak ders notları, makaleler vs. sonraki önceliğim ise bu matrisin ters alma yöntemleri ile ilgili veriler… elinizde var mı bilmiyorum hocam ama varsa paylaşımda bulunabilir misiniz..

  49. Şadi Evren ŞEKER Article Author

    Vakit bulabilirsem birşeyler yazıp yayınlamaya çalışırım, ne yazık ki hazır bir kaynak bilmiyorum. Çok kısaca yardımcı olmaya çalışayım. Singular matrisler tanım itibariyle tersi olmayan matrislerdir (det = 0 olduğu için) ancak bir singular matris non-singular hale çevrilebilir ve bundan sonra tersi alınabilir. Ayrıca matris tersinin daha genel tanımını müsvette ters (pseudo inverse) için aşağıdaki kaynak yararlı olabilir

    http://en.wikipedia.org/wiki/Moore%E2%80%93Penrose_pseudoinverse

    Burada da bahsedilen yöntemlerden birisi olan SVD (tekil değer ayrışımı – singular value decomposition) için aşağıda bağlantısını verdiğim bir yazı yayınlamıştım:

    http://www.bilgisayarkavramlari.com/2008/12/29/tekil-deger-ayrisimi-singular-value-decomposition/

    Basitçe bir matrisi çarpanlarına ayırma yöntemidir ve çarpanlarına ayrılan bir matrisin (SVD yönteminde bir matris, 3 ayrı matrisin çarpımı olarak yazılabilir) tersi (reciprocal) bu çarpanlar üzerinde işlem yapılarak bulunabilir.

    Ayrıca buna benzer çok sayıda yöntem bulunuyor ama dediğim gibi hepsinin toparlandığı bir kaynak ne yazık ki bilmiyorum, vakit bulabilirsem toparlayıp birşeyler yayınlamaya çalışacağım.

    Başarılar

  50. bulut238

    Selamun aleyküm rica etsem bir matrisin önce alt üçgen sonra üst üçgenini sıfırlama işlemini Gauss – Jordan yöntemiyle küçük bi örnek yapabilirmisiniz. C# dilinde ve lütfen console dan olmasın ilgilenirseniz sevinirim.

  51. alper

    Peki matris içerisinde kosegenler üzerinde sıfır değeri varsa d degeri de sıfır oluyor. Bölme işlemi geçersiz oluyor ? yani matris kosegeninde 0 değeri varsa sonuc uretmiyor

  52. YİĞİT

    Hocam iyi gunler.
    Konu olarak LU ayrıştırma yöntemiyle çok bilinmeyenli denklemlere çözüm arıyorum.
    fakat nasıl nerden başlayacağıma dair bile karar veremedi.
    başlamak açısından fikirlerinizi paylaşırsanız çok memnun olurum. teşekkur ederim.

  53. Anonim

    Konu olarak okudum fakat C d nasil yazilicagina dair hicbir fikrim yok malesef hocam.
    Nerden nasil baslanir tikandim kaldim resmen

  54. YİĞİT

    Hocam LU ayrıştırma yöntemiyle çok bilinmeyenli denklem çözümünü sormuştum size konuyu hatmettim fakat C bilgim yeterli olmadığı için C de yazmakta çok zorlanıyorum bana yardımcı olursanız çok sevinirim.
    teşekkür ederim.

  55. Mehmet Aydogmus

    Merhaba, yukarıda şöyle demişsiniz :

    “Geriye sadece kare matrisler kalıyor. Bir kare matrisin tersinin olabilmesi için tekil masfuf (singular matrix) olması gerekir (bazı kaynaklarda dejenere (degenerate) (yeniden üretilmiş) tabiri de geçmektedir). Bir kare matrisin tekil olması ise ancak determinantının sıfır olMAması ile mümkündür”

    http://mathworld.wolfram.com/SingularMatrix.html

    Bu tanımın yanlış olduğunu düşünüyorum. Matrisin tersinin olabilmesi için tekil matris olması değil olmaması gerekir. Tekil(Süngular) matrislerin tersi yoktur , matrisin tekil olması için de determinantının söylediğinizin aksine sıfır olması gerekir. Yukarıdaki tanım insanları yanlış yönlendirebilir diye belirtmek isitiyorum ..

    Saygılarımla, iyi günler

  56. emine

    arkadaşlar bir 5 e 5lik bir matris düşünün bunun her 2 köşegenini de çizince ortaya x harfi çıkıyor ya bu x harfinin üst dilimindeki sayilarla alt dilimindeki sayıların ayrıca sağdaki ve soldaki dilimin sayilarını simetrik olarak değiştiren programı yazmamda yardımcı olurmusunuz

  57. yakup

    n*n matrisinin inversinin alınması hoca bu ödevi verdi işin içinden çıkamadım yarın teslim etmem gerekiyor lütfen yardımcı olurmusunuz..

  58. kevser

    3 x3luk matriste dışardan belirlenen satır ve sutunlarin yeri değişecek ve degisenler farklı renkte çıktı verecek c# da bunu nasıl yazabilirim

  59. Büşra

    Kirchhoff ile yapılan bir soruyu matrisle çözmem gerekiyor ama 5×5 lik bir matrisin tersi alınması lazım yardıImci olabilir misiniz? Teşekkürler.

  60. matris 3x3

    Hocam dediğiniz kodu yazdım 3×3 ama çalışmadı kod şu şekilde bi bakabilrimsinz??

    #include 
    int main()
    {
    	float a[3][3]={{1,2,3,},{4,5,6},{7,8,9}};
    	float b[3][3]={{1,0,0},{0,1,0},{0,0,1}};
    	int i,j,x;
    	float d,k;
    	
    	for(i=0;i<3;i++)
    	{
    		d=a[i][i];
    		for(j=0;j<3;j++)
    		{
    			a[i][j]=a[i][j]/d;
    			b[i][j]=b[i][j]/d;
    		}
    		
    		for(x=0;x<3;x++)
    		{
    			if(x!=i)
    			{
    				k=a[x][i];
    				for(j=0;j<3;j++)
    				{
    					a[x][j]=a[x][j]-(a[i][j]*k);
    					b[x][j]=b[x][j]-(b[i][j]*k);
    				}
    			}
    		}		
    	}
    	for(i=0;i<3;i++)
    	{
    		for(j=0;j<3;j++)
    			printf("%f  ",b[i][j]);
    		printf("\n");
    	}
    	
    	
    	return 0;
    }
    
  61. melek

    Boyutu kullanıcı tarafından belirlenen bir matrisin echelon matris kuralı ile tersini alma nasıl olabilir en son sizin yaptığınız gibi C# dilinde yapıcam ama kullanıcı giricek boyutunu o zmn matris içindeki değerleri rassal fonksiyonunu mu kullanmam gerek

  62. matris ile matrisin tersini çarpma

    hocam bu tersini hesapladığımız matrisi mesela 2×2 tipinde bi matrisle nasıl çarpa biliriz? yani mesela ilk önce 2×2 tipinde matrisi tanımlattık daha sonra diğer matrisi tanımlattık ama başka matrisin tersi olarak en son bunları nasıl çarparız c programında. yardımcı olursanız çok sevinirim

  63. Bahar

    C++ da 4*4 metris determinantı yapmak istiyorum. Metrisin değerleri {0,2,1,0,0,3,1,1,-1,0,3,1,3,1,2,0} olacak şekilde olmalı.Teşekkürler.

  64. Furkan Ayık

    Merhaba ben bir c# projesi geliştiriyorum ve matris tersine ihtiyacım vardı. kodlarınızdan faydalanarak matris tersi alan fonksiyon yazdım ancak problem su ki dogru calısmıyor. Fonksiyonu test etmek için bir test fonksiyonu yazdım. Sonucun birim matris cıkması gerekiyor. Cıktı büyük ölcüde birim matrise yakın olsa da hatalı. Bit satırda tamamen -0.4 gbi degerler var (0 olması gerekiyor.) Bir satır 1 ile baslıyor (0 olması gerekiyor.) Ve köşegen üzerinde bir tane 0.9 degeri var.
    Sorunun ne oldugunu bilmiyorum. Bence kodlarınız mantıklı ancak dogru sonuc vermiyor. Tavsiyesi veya alternatif cözümü olan var mı?
    Not:Bu fonksiyonun amacı matlab’deki inv(Matris) fonksiyonunun c# modellemesini yapmak.

  65. matris3x3

    hocam yarın sınavım var 3×3 matrisin tersi nasıl nasıl yapılıyor bana yardımcı olursanız çok sevinirim

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir