21 : Matrisler

Diziler tek boyutlu olabildiği gibi birden çok boyutlu da olabilir. Her bir dizi elemanı başka bir diziyi saklıyor gibi düşünülebilir. Tek boyutlu diziler [] ile tanımlanırken iki boyutlu diziler [][] ile tanımlanır. Örnek olarak iki matrisin çarpımı örneği verilebilir.

matrix.c
#include <stdio.h>
void carpim(int mat1[4][3], int mat2[3]);
int main()
{
    int i = 0, j = 0;
    int matrix1[4][3] = {{1,  1,  1},
                         {2,  2,  2},
                         {1,  1,  1},
                         {2,  2,  2}};

    int matrix2[3] = {2, 3, 4};

    printf("Matris 1 : \n");
    for (i = 0; i < 4; i++)
    {
     for(j = 0; j < 3; j++)
        {
           printf("%d  ", matrix1[i][j]);
        }
        printf("\n");
    }
    printf("Matris 2 : \n");
    for (i = 0; i < 3; i++)
    {
        printf("%d \n",matrix2[i]);
    }
    printf("\n");
    carpim(matrix1, matrix2);
}

void carpim(int mat1[4][3], int mat2[3])
{
    int i = 0; 
    int j = 0;
    printf("Carpim Sonucu: \n");
    for (i = 0; i < 4; i++)
    {
        int temp = 0;
     for(j = 0; j < 3; j++)
        {
           temp += mat1[i][j] * mat2[j];
        }
        printf("%d  \n", temp );
    }
}

matrix1' i tanımlarken bir dizinin her elemanı başka bir dizi gibi tanımlıyoruz. Daha önce içiçe döngüleri görmüştük. İçiçe döngüler ile çok boyutlu diziler birbiri ile alakalı konular. Çok boyutlu matrisler içinde dolaşmak için içiçe döngüler kullanılır. İçiçe döngülerde dıştaki döngü ilk indis, içteki döngü ikinci indis şeklinde tanımlanabilir. Böylece sırayla her eleman ile işlem yapılabilir. Hangi döngünün hangi indisi tutacağı matristeki gezintinin yatay mı dikey mi olacağını belirler.
Bu matrisleri fonksiyona parametre olarak geçiriyoruz. Eleman sayısını belirtmemiz gerekiyor. Çünkü derleyici ona göre bir bellek ayıracak. Burada ben 4x3 bir matris kullandığım için bu sayıları verdim ancak belli olmasaydı maksimum olacağını düşündüğüm bir sayı vermem gerekirdi. Tabii maksimum 10 olacak bir iş için de 100000 gibi bir sayı vermek doğru değil çünkü belleği doğru kullanmamış oluyoruz bu şekilde.

Bir matris çarpımı yaparken elemanlar toplanır ve sonuca yazılır. Ben bu toplam sonucunu temp değişkenine yazıyorum. temp değişkeni her yeni eleman için sıfırlanacak. Döngü içinde tanımladığım için otomatik olarak her dönüşte sıfırlanmış oluyor. += işleci sonucu da toplama kadar demektir. Yani a+=b ile a = a+ b aynı şeydir. Burada temp ilk değeri sıfır olsa da burada 3 çarpımın toplamı bizim sonucumuzu vereceği için her çarpımı kendinden öncekilerle toplamış oluyoruz.

Döngülerin bazı yerlerinde printf("\n"); kullandım. Bu tamamen matris görüntüsü ile ilgili. Bu satırı eklemezsek iki boyutlu matris tek boyutlu matris gibi ardarda yazılır. İşlem olarak aynı şeyleri yapmak gerekir ancak konsolda tek boyutmuş gibi görürüz.

Yorumlar

Bu blogdaki popüler yayınlar

31 : Fonksiyonda Struct Kullanımı

Structure - 29 : Yapılar ile Öğrenci Bilgileri Tutma

23 : İki Karakter Dizisini Birleştirme