Matrisin tersinin alınması (Mantrix Inverse)

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:

95 COMMENTS

  1. 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. 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. C’yi bilmediğim için bunu soruyorum. File/New/Project dedikten sonra hangisini seçeceğiz?

  4. 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. 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. 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. 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. 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. meraba ben ödevimde 4×4 matrisin tersini bulmak ama turbo pascalda yardımcı olursanız sevinirimm

  10. 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?

  11. 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..

  12. 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?

  13. 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?

  14. 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

  15. 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

  16. 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.

  17. 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

  18. 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

  19. 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/

  20. 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.

  21. 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

  22. 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

  23. 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

  24. 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

  25. 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..

  26. 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

  27. 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…

  28. 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

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

  30. 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?

  31. 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

  32. 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.

  33. (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

  34. 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

  35. 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.

  36. Ş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

  37. ş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

  38. 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

  39. 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 ?

  40. 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

  41. 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

  42. 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();
    
  43. 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

  44. 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

  45. 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

  46. 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

  47. 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

  48. “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?

  49. 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..

  50. 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

  51. 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.

  52. 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

  53. 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.

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

  55. 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.

  56. 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

  57. 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

  58. 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..

  59. 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

  60. 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.

  61. 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;
    }
    
  62. 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

  63. 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

  64. 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.

  65. 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.

  66. Hocam iyi günler
    Matrisin tersini alma olayını Visual Basic kodlarıyla da yayınlayabilir misiniz 🙁

  67. 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

merve için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir