23/12/09

Perkalian matrix

.. dalam satu baris! euh, maksudnya 1 statement.

hasil = map(lambda index:
      sum(
        map(lambda n: n[0] * n[1],
          zip(
            [a[i * 4 + (index % 4)] for i in range(4)],  # baris
            [b[(index / 4) * 4 + i] for i in range(4)]   # kolom
          )   # pasangan elemen baris dan kolom
        )   # kalikan setiap pasangan
      ),  # jumlahkan
    range(4*4))

Input adalah dua buah matrix berukuran 4 × 4, yaitu a dan b, dan hasilnya tentu saja matrix 4 × 4 juga yang ada di dalam variabel hasil.

Ketiga matrix ini ditulis dalam bentuk array 1 dimensi dari elemen-elemen yang ada dengan menjejerkan kolom-kolom yang ada. Sebagai contoh, matrix di bawah ini

 1   2   3   4
 5   6   7   8
 9  10  11  12
13  14  15  16

akan ditulis dalam variabel berupa [1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16].

Kalau mau dibalik (urut baris), tukar saja a dan b. Tuk perkalian matrix n x n, ganti saja 4 menjadi n tersebut.

Mohon dikoreksi kalau ada yg salah. Hasil nyoba2 membandingkan hasilnya dg hasil perhitungan dg GNU Octave sih bener.. :D

Jadi pengen latihan functional programming..

2 komentar:

kusut mengatakan...

latihan emacs lisp (dance)

Arie mengatakan...

Gyaaa, masih trauma dengan kurung-kurung waktu ber-LISP ria di tingkat 1.. :D

Poskan Komentar