Çok Boyutlu Diziler - Matrisler
Verileri satır ve sütunlardan oluşan tablolar halinde saklayan yapıdır
Matris Nedir?
Matris, verilerin satır ve sütunlardan oluşan iki boyutlu bir tablo yapısında saklandığı veri yapısıdır. Tek boyutlu diziler verileri yan yana bir sıra halinde tutarken, matrisler verileri bir ızgara (grid) üzerinde organize eder. Matematikteki matris kavramıyla doğrudan ilişkilidir ve programlamada çok boyutlu dizi (multi-dimensional array) olarak adlandırılır.
Bunu bir elektronik tabloya (Excel) benzetebilirsiniz: her hücrenin bir satır numarası ve bir sütun numarası vardır. "3. satır, 2. sütun" dediğinizde tam olarak hangi hücreden bahsettiğiniz bellidir. İşte matris de bellekte tam olarak bu mantıkla çalışır.
Temel Kavramlar ve Terminoloji
Satır (Row) ve Sütun (Column)
Matristeki yatay sıralara satır, dikey sıralara sütun denir. Bir matrisin boyutu her zaman "satır × sütun" (m × n) şeklinde ifade edilir. Örneğin 3×4'lük bir matris 3 satır ve 4 sütundan oluşur, toplamda 12 eleman içerir. Satır sayısı her zaman önce yazılır; bu evrensel bir kural olduğu için karıştırmamaya dikkat etmek gerekir.
Kare Matris (Square Matrix)
Satır ve sütun sayısı eşit olan matrislere kare matris denir. Örneğin 3×3, 4×4, n×n boyutundaki matrisler kare matristir. Kare matrislerin köşegen (diagonal) elemanları, determinant hesabı ve birim matris gibi özel kavramları vardır. Bu özellikler özellikle lineer cebir ve bilgisayar grafiği uygulamalarında çok önemlidir.
Köşegen (Diagonal) Nedir?
Kare bir matriste sol üst köşeden sağ alt köşeye uzanan elemanlara ana köşegen (main diagonal) denir. Bu elemanların ortak özelliği satır ve sütun indekslerinin eşit olmasıdır: matris[i][i].
Birim Matris (Identity Matrix)
Köşegen elemanları 1, diğer tüm elemanları 0 olan kare matrise birim matris denir. Birim matris, çarpma işleminde etkisiz elemandır: herhangi bir matrisi birim matris ile çarptığınızda sonuç yine kendisidir. Matematikte sayılar için 1'in oynadığı rolü, matrisler dünyasında birim matris üstlenir.
Matris Bellekte Nasıl Saklanır?
İşte matrislerle ilgili en kritik nokta burası: bilgisayarın belleği tek boyutludur. RAM'de "satır" veya "sütun" diye bir kavram yoktur; bellek ardışık byte'lardan oluşan düz bir şerittir. Peki iki boyutlu bir yapı tek boyutlu bir bellekte nasıl saklanır? Bunun iki yöntemi vardır.
Row-Major Order (Satır Öncelikli)
C, C++, Java, Python (NumPy) gibi diller bu yöntemi kullanır. Matrisin satırları bellekte birbiri ardına dizilir. Yani önce 0. satırın tüm elemanları, ardından 1. satırın tüm elemanları şeklinde devam eder.
Column-Major Order (Sütun Öncelikli)
Fortran, MATLAB ve R gibi diller bu yöntemi kullanır. Matrisin sütunları bellekte birbiri ardına dizilir. C dilinde çalıştığımız için biz row-major order ile ilgileneceğiz, ancak bu farkı bilmek önemlidir çünkü farklı diller arasında veri aktarırken veya performans optimizasyonu yaparken bu bilgiye ihtiyaç duyarsınız.
Adres Hesaplama Formülü (Row-Major)
Bir matristeki herhangi bir elemanın bellek adresini şu formülle hesaplayabilirsiniz:
Matris Oluşturma
C dilinde iki boyutlu dizi tanımlamanın birkaç farklı yolu vardır:
int m[][4] = {{1,2,3,4}, {5,6,7,8}}; ✅ Geçerli
int m[2][] = {{1,2,3,4}, {5,6,7,8}}; ❌ Derleme hatası
Satır ve Sütun Erişimi
Matristeki herhangi bir elemana matris[satır][sütun] şeklinde erişilir. İlk indeks satırı, ikinci indeks sütunu belirtir. Tek boyutlu dizilerde olduğu gibi indeksler 0'dan başlar.
Matris Dolaşma (Traverse)
Matristeki tüm elemanları ziyaret etmek için iç içe iki döngü kullanılır. Dıştaki döngü satırlar, içteki döngü sütunlar üzerinde ilerler. Bu yapı matris işlemlerinin neredeyse tamamının temelini oluşturur.
Satır Satır mı, Sütun Sütun mu?
Bu soru basit gibi görünse de performans açısından büyük öneme sahiptir. C dilinde matrisler row-major order ile saklandığı için satır satır dolaşmak (row-wise traversal) bellekteki ardışık adresleri takip eder ve CPU cache'ini verimli kullanır. Sütun sütun dolaşmak ise (column-wise traversal) her adımda belleğin farklı bölgelerine atlar ve cache miss'lere neden olur.
Matris Toplama
İki matrisin toplanabilmesi için boyutlarının aynı olması gerekir. Toplama işleminde karşılıklı elemanlar bire bir toplanır: A matrisinin [i][j] elemanı ile B matrisinin [i][j] elemanı toplanarak C matrisinin [i][j] elemanı elde edilir.
Matris Çarpma
Matris çarpma, toplama kadar basit değildir. İki matrisin çarpılabilmesi için birinci matrisin sütun sayısı ile ikinci matrisin satır sayısının eşit olması gerekir. A matrisi m×n ve B matrisi n×p boyutundaysa, sonuç C matrisi m×p boyutunda olur.
Çarpma işleminde C[i][j] değeri, A'nın i. satırı ile B'nin j. sütununun karşılıklı elemanlarının çarpılıp toplanmasıyla elde edilir. Bu işleme "dot product" (iç çarpım) denir.
Transpose Alma
Bir matrisin transpozu, satır ve sütunlarının yer değiştirilmesiyle elde edilir. Yani orijinal matrisin [i][j] elemanı, transpoze matrisin [j][i] elemanı olur. Bir m×n matrisin transpozu n×m boyutundadır.
Transpose işlemi lineer cebirde çok sık kullanılır. Örneğin bir veri tablosunun satır ve sütunlarını değiştirmek, kovaryans matrisi hesaplamak veya bir denklem sistemini çözmek için transpose'a ihtiyaç duyarsınız.
Matrisi Fonksiyona Geçirme
C dilinde iki boyutlu diziyi fonksiyona geçirmek, tek boyutlu diziye göre biraz daha karmaşıktır. Fonksiyon parametresinde sütun sayısını belirtmek zorunludur. Bu kısıtlama, derleyicinin adres hesaplamasını yapabilmesi için gereklidir.
Matrisler Nerelerde Kullanılır?
Görüntü İşleme
Dijital bir görüntü aslında bir piksel matrisidir. Siyah-beyaz bir görüntü tek bir 2D matris iken, renkli bir görüntü 3 ayrı matristen (Red, Green, Blue kanalları) oluşur. Bulanıklaştırma, keskinleştirme, kenar algılama gibi filtreler matrislerin birbirleriyle çarpılmasıyla gerçekleştirilir.
Bilgisayar Grafikleri ve Oyun Geliştirme
3D oyunlarda bir nesneyi döndürmek, taşımak veya ölçeklemek için 4×4 dönüşüm matrisleri kullanılır. Kameranın bakış açısı, ışık hesaplamaları ve perspektif projeksiyonu tamamen matris çarpımlarıyla yapılır. GPU'ların temel işi, saniyede milyarlarca matris çarpımı gerçekleştirmektir.
Yapay Zeka ve Derin Öğrenme
Sinir ağlarının her katmanı aslında bir matris çarpımıdır. Girdi verisi bir matris olarak temsil edilir, ağırlıklar başka bir matristir ve bunların çarpımı bir sonraki katmanın çıktısını verir. Modern derin öğrenme tamamen matris aritmetiği üzerine kuruludur.
Graflar ve Ağ Yapıları
Bir grafın düğümleri arasındaki bağlantılar komşuluk matrisi (adjacency matrix) ile temsil edilebilir. N düğümlü bir graf için N×N'lik bir matris oluşturulur. Eğer i. düğüm ile j. düğüm arasında bağlantı varsa matris[i][j] = 1, yoksa 0 olur. Bu konu müfredatın graf bölümünde detaylı ele alınacaktır.
Elektronik Tablo ve Veritabanları
Excel, Google Sheets gibi araçlar verilerini matris yapısında saklar. SQL'deki tablolar da kavramsal olarak bir matristir: her satır bir kayıt, her sütun bir alandır.
Zaman Karmaşıklığı Özeti
| İşlem | Karmaşıklık | Açıklama |
|---|---|---|
Erişim m[i][j] | O(1) | Adres formülü ile doğrudan erişim |
| Traverse | O(m × n) | Her eleman bir kez ziyaret edilir |
| Matris Toplama | O(m × n) | Karşılıklı elemanlar toplanır |
| Matris Çarpma | O(m × n × p) | Üçlü iç içe döngü gerektirir |
| Transpose | O(m × n) | Her eleman bir kez kopyalanır |
| Satır/Sütun Arama | O(n) / O(m) | Tek satır veya sütun taranır |
| Eleman Arama | O(m × n) | Tüm matris taranır |
Sık Yapılan Hatalar
1. Satır ve Sütun İndeksini Karıştırmak
Matris işlemlerinde en sık yapılan hata, m[i][j] ile m[j][i]'yi karıştırmaktır. Özellikle çarpma ve transpose işlemlerinde bu hata çok yaygındır. Kodunuzda i'yi her zaman satır, j'yi her zaman sütun olarak kullanmayı alışkanlık haline getirin.
2. Çarpma İçin Boyut Uyumunu Kontrol Etmemek
A(m×n) ile B(n×p) çarpılabilir ama A(m×n) ile B(m×p) çarpılamaz. A'nın sütun sayısının B'nin satır sayısına eşit olması şarttır. Bu kontrolü yapmadan çarpma işlemine girişmek bellekte geçersiz bölgelere erişmeye neden olur.
3. Çarpma Sonuç Matrisini Sıfırlamamak
Matris çarpmada sonuç matrisinin her elemanı kümülatif toplama ile hesaplanır. Eğer başlangıçta C matrisini sıfırlamazsanız, içindeki çöp değerlerin üzerine toplama yapılır ve yanlış sonuçlar elde edersiniz.
Tek Boyutlu Dizi vs Matris Karşılaştırma
| Özellik | Tek Boyutlu Dizi | Matris (2D Dizi) |
|---|---|---|
| Erişim | arr[i] | m[i][j] |
| Bellek | Ardışık blok | Ardışık blok (row-major) |
| Traverse | Tek döngü — O(n) | İç içe döngü — O(m×n) |
| Boyut bilgisi | 1 parametre (n) | 2 parametre (satır, sütun) |
| Kullanım alanı | Listeler, diziler, tamponlar | Tablolar, görüntüler, graflar |
| Fonksiyona geçirme | Boyut bilgisi opsiyonel | Sütun sayısı zorunlu |
Sonuç
Matrisler, tek boyutlu dizilerin iki boyuta genişletilmiş halidir ve yazılımın pek çok alanında karşımıza çıkar. Bellekte nasıl saklandığını anlamak, özellikle performans gerektiren uygulamalarda doğru kararlar vermenizi sağlar. Row-major ve column-major kavramları, cache locality bilgisi ve adres hesaplama formülü, bir matrisin sadece "satır ve sütunlardan oluşan tablo" olmadığını gösterir.
Matris toplama ve çarpma gibi temel operasyonlar, ileride karşılaşacağınız yapay zeka, bilgisayar grafikleri ve graf algoritmaları konularının altyapısını oluşturur. Bu temeli sağlam attıysanız, bir sonraki konumuz olan bağlı listelere (linked list) geçmeye hazırsınız. Bağlı listeler, dizilerin en büyük zayıflığı olan sabit boyut ve ekleme/silme maliyetini çözmek için tasarlanmış yapılardır.