[C/C++] Perkalian Matriks Menggunakan Pointer

Tampilan program (dengan Turbo C++ 4.5)

Pada komputer, perkalian matriks dapat dilakukan dengan beberapa cara. Cara yang paling banyak digunakan adalah dengan menggunakan larik (array) dua dimensi, di mana indeks larik menunjukkan posisi elemen pada matriks. Di sini, kita akan mengenal cara alternatif untuk melakukan perkalian matriks, yaitu dengan memanfaatkan pointer pada bahasa C/C++.

#include <conio.h>
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>

void Masukan(int *q, int brs, int klm) {
    int i, j;
    for(i = 0; i < brs; i++) {
        for(j = 0; j < klm; j++) {
            cout << "Elemen [" << (i + 1) << "][" << (j + 1) << "]? ";
            scanf("%d", (q + i * klm + j));
        }
    }
}

void Tampilkan(int *q, int brs, int klm) {
    int i, j;
    for(i = 0; i < brs; i++) {
        cout << endl;
        for(j = 0; j < klm; j++) {
            cout << *(q + i * klm + j) << "\t";
        }
    }
    cout << endl;
}

void Kali(int *p, int *q, int *z, int bA, int kA, int bB, int kB) {
    int i, j, k;
    for(i = 0; i < bA; i++) {
        for(j = 0; j < kB; j++) {
            *(z + i * bB + j) = 0;
            for(k = 0; k < kA; k++) {
                *(z + i * bB + j) += *(p + i * kA + k) * (*(q + k * kB + j));
            }
        }
    }
}

int main() {
    int *a, *b, *c, brsA, klmA, brsB, klmB;
    clrscr();
    cout << "Jumlah Baris Matriks A? ";
    cin >> brsA;
    cout << "Jumlah Kolom Matriks A? ";
    cin >> klmA;
    cout << "Jumlah Baris Matriks B? ";
    cin >> brsB;
    cout << "Jumlah Kolom Matriks B? ";
    cin >> klmB;
    if(klmA != brsB) {
        cout << "Perkalian TIDAK Dapat Dilakukan." << endl;
        cout << "Jumlah Kolom A TIDAK Sama Dengan Jumlah Baris B." << endl;
    } else {
        a = (int *) malloc(brsA * klmA * 4);
        b = (int *) malloc(brsB * klmB * 4);
        c = (int *) malloc(brsA * klmB * 4);
        clrscr();
        cout << "Input Matriks A:\n" << endl;
        Masukan(a, brsA, klmA);
        getch();
        clrscr();
        cout << "Input Matriks B:\n" << endl;
        Masukan(b, brsB, klmB);
        getch();
        clrscr();
        cout << "Matriks A:" << endl;
        Tampilkan(a, brsA, klmA);
        cout << "\nMatriks B:" << endl;
        Tampilkan(b, brsB, klmB);
        Kali(a, b, c, brsA, klmA, brsB, klmB);
        cout << "\nMatriks A x B:" << endl;
        Tampilkan(c, brsA, klmB);
    }
    getch();
    return 0;
}

Keterangan:

Pada fungsi main(), terdapat pernyataan:

a = (int *) malloc(brsA * klmA * 4);

yang berguna untuk memesan jumlah blok pada Random Access Memory (RAM) sebanyak jumlah elemen matriks A (baris A x kolom A) dikali dengan 4 byte (ukuran sebuah data integer). Angka 4 juga dapat diganti dengan “sizeof(int)”, sehingga pernyataan tersebut menjadi:

a = (int *) malloc(brsA * klmA * sizeof(int));

Selain itu, tentunya kita juga bisa menggunakan sizeof() untuk jenis-jenis data primitif lainnya, seperti double atau char.

Teknik pengalamatan elemen matriks kurang lebih dapat diilustrasikan sebagai berikut. Sebagai contoh, matriks A berukuran 3 x 3:

a[i][j] = *(q + i * klm + j)

misalkan q merupakan pointer yang menunjuk ke blok memori nomor 0016 (desimal), dan klm merupakan parameter yang menampung jumlah kolom matriks A (yaitu 3).

a[0][0] = *(q+0*3+0) = *(q+0) = 0016
a[0][1] = *(q+0*3+1) = *(q+1) = 0017
a[0][2] = *(q+0*3+2) = *(q+2) = 0018
a[1][0] = *(q+1*3+0) = *(q+3) = 0019
a[1][1] = *(q+1*3+1) = *(q+4) = 0020
a[1][2] = *(q+1*3+2) = *(q+5) = 0021
a[2][0] = *(q+2*3+0) = *(q+6) = 0022
a[2][1] = *(q+2*3+1) = *(q+7) = 0023
a[2][2] = *(q+2*3+2) = *(q+8) = 0024

Bagaimana? Ternyata dengan menggunakan pointer, teknik pengalamatan elemen matriks sama seperti pengalamatan pada larik satu dimensi.

Kemudian, fungsi Kali() berisi algoritma standar untuk melakukan perkalian matriks. Bila kita menggunakan larik, maka algoritmanya adalah:

C[i][j] += A[i][k] * B[k][j]

Nah, pada fungsi Kali() kita juga menggunakan algoritma standar tersebut. Yang diubah hanya teknik pengalamatannya saja, seperti yang sudah saya ilustrasikan di atas.

Terima kasih sudah membaca artikel saya. Semoga bermanfaat.

Advertisements

2 thoughts on “[C/C++] Perkalian Matriks Menggunakan Pointer

  1. outtaste says:

    nice post..
    mantap..
    sering2 ngepost yos!!
    hheeee……

  2. djiesoft says:

    bagus, tutorialnya sangat bermanfaat.. thaks for sharing

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: