Wednesday, August 25, 2010

Menyoal C/C++ Sebagai Pengganti Matlab

Dalam membuat permodelan algoritma, kita sering menemui permasalahan matriks, vector, dan beberapa masalah aljabar. Matlab/Octave adalah bahasa pemrograman yang paling powerful untuk menjawab permasalahan tadi. Tapi jika ingin beralih ke C/C++, ada beberapa alternatif library yang bisa dicoba. Tentu saja matrix bisa dibuat menggunakan pure C/C++, tapi akan sangat tidak nyaman. Saya sendiri masih pemula dalam masalah ini tapi akan saya coba ulas sedikit disini.

Pertama, GSL (GNU Scientific Library). GSL, seperti kebanyakan software GNU lainnya, ditulis dalam C, walau ada beberapa wrapper untuk C++ nya. Syntax GSL cukup mudah dipahami bagi yang sudah terbiasa dengan Matlab/Octave. Misalnya, untuk menjumlahkan b yang bertipe scalar dengan nilai dari vector a pada posisi I, alih-alih menulis dengan notasi a(i)+=b, notasi GSL lebih wordy:

gsl_vector_float_set(a,i,gsl_vector_float_get(a,i)+b)

Sayangnya, example code GSL sangat minim. Bahkan di installer-nya tidak ada example sama sekali. beberapa contoh code menggunakan GSL bisa dilihat di dokumentasi online-nya.Ketika pertama kali mencoba membuat penjumlahan dua buah matrix (menggunakan gsl_matrix_add), saya menemui kesulitan karena dengan tidak adanya example code mengenai ini.

Berikut salah satu contoh code pakai GSL:

#include < stdio.h >
#include < gsl/gsl_matrix.h >
int main (void)
{
    int i, j;
    const int SIZE_ROW = 10;
    const int SIZE_COLUMN = 3;

    gsl_matrix * m1 = gsl_matrix_alloc (SIZE_ROW, SIZE_COLUMN);

    for (i=0; i < SIZE_ROW; i++ )
        for (j=0; j < SIZE_COLUMN; i++ )
            gsl_matrix_set (m1, i, j, (i+1) * (j+1));

    printf("\nmatrix m1: \n");
    for (i=0; i < SIZE_ROW; i++ )
        for (j=0; j < SIZE_COLUMN; i++ )
            printf ("%g ", gsl_matrix_get (m1, i, j));
        printf("\n");
        }

    gsl_matrix_free (m1);
    return 0;
};

Kedua, Armadillo. Armadillo disponsori oleh The University of Queensland. Kelebihan Armadillo (bagi saya) dibanding GSL adalah syntax yang lebih mirip dengan Matlab. Lebih lagi, mereka  membuatkan conversion table, sebagai perbandingan syntax Matlab dengan Armadillo. Tentu ini membuat para pengguna Matlab nyaman. Kekurangan yang cukup signifikan adalah bahwa umur project ini masih baru, belum matang, dan fitur-fitur-nya masih belum banyak, sehingga kemungkinan besar akan menyulitkan programmer. Silakan bandingkan fitur-fitur yang dimiliki Armadillo dengan GSL. Pun project turunan GSL jauh lebih banyak ketimbang Armadillo.

Berikut salah satu contoh code pakai Armadillo.

#include < iostream >
#include < armadillo >

using namespace std;
using namespace arma;

int main(int argc, char** argv)
{
    mat A = randu(4,5);
 
    cout << "A*trans(B) =" << endl;
    cout << A*trans(B) << endl;
 
    return 0;
}

Ketiga, IT++. IT++ lebih menspesialisasikan diri untuk signal processing dan telekomunikasi. Bahkan contoh implementasi yang mereka tawarkan sangat banyak. Class library yang ada banyak menyinggung masalah telekomunikasi, misalnya AWGN channel, modulasi, bahkan komputasi rumit seperti BCH dan Turbo Coding.

Pertama kali buka website-nya langsung disuguhi ini “As you might have noticed, the current IT++ maintenance and development team has not been active for some time. Therefore, IT++ is looking for volunteers who are interested in further maintenance and/or development of this library.” Well, tampaknya IT++ tidak lebih ramai dari dua C/C++ library sebelumnya. IT++ ini dirintis oleh Chalmers University, Swedia. Secara pribadi saya kurang tertarik dengan IT++. Kita lewat saja tanpa mencobanya.

Keempat, SPUC. SPUC (Signal Processing Using C++) agak lebih mirip dengan IT++. Menyediakan class library cukup komplit untuk aplikasi signal processing dan telekomunikasi. Sekilas SPUC ini cukup komplit, project ini juga cukup matang. Operasi vector dan matrix cukup lengkap dan convinient.

Overall, semua kembali pada pilihan masing-masing. Saya melihat SPUC dan GSL cukup potensial. Pertanyaan yang harus dijawab adalah: apakah library yang disupport sudah komplit? Mulai dari tipe data matriks, vector, sampai fix point? Bagaimana dengan kompatibilitas Unix/Windows-nya? Kemudahan porting dari Matlab-nya? Kemudahan integrasi dengan platform lainnya (misalnya SystemVerilog DPI)? Dan pertanyaan-pertanyaan lainnya yang muncul dari engineer modeling, dan system architect. So, apa pilihan Anda? Tolong share disinya ya... (ya2n)

16 comments:

  1. Pertanyaannya adalah, mengapa harus berpindah ke C++? Mengapa harus melalui lereng pembelajaran yang curam jika Matlab jauh lebih nyaman, dan para penggunanya jauh lebih terbiasa? Bagaimanakah pendapat para modeler tentang hal ini?

    ReplyDelete
  2. memang modeling lebih memprioritaskan segala macam metode dan inovasi/kreasi di bidang telekomunikasi apapun 'tools' yang digunakan. Dan memang matlab menjanjikan 'surga' bagi ilmuwan model untuk bisa membuat segala macem metode, sangat user friendly, cuma berikut kelemahan jika kita tetap menggunakan matlab
    1. matlab ini tidak gratis, trus mahal lagi
    2. simulasinya lama banget...bayangin jika kita pengen simulasi dengan BER 10^-6 trus dengan montecarlo 1000 kali, bisa berbulan bulan...he he,,membutuhkan resource computer (cluster) sangat banyak..
    padahal simulasi yang menggunakan banyak bit yang dibangkitkan akan semakin merepresentasikan performa sesungguhnya,,
    belum kalau kita lagi butuh debug (yang membutuhkan symbol yang cukup banyak) jika sekali running 3 menit saja sudah bikin stress..he he

    ya berlahanlah berpindahnya...step by step..

    ReplyDelete
  3. saya jg udh pernah liat SPUC ini,library nya udah banyak gitu,dokumentasinya jg bagus,tapi saya blm pernah nyoba,,,,
    menurut saya SPUC adalah pilihan yang tepat untuk berpindah dari matlab....

    ReplyDelete
  4. untuk gambar/figure gmn gan?
    kan dah enakan manipulasinya pake matlab..

    ReplyDelete
  5. nah untuk figure atau gambar mungkin kita masih mengandalkan matlab,
    misal simulasi yang banyak kemudian BER kita save, baru kemudian di plot di matlab,
    atau misal kita pengen lihat konstelasi yang kita dump keluaran equalizernya kemudian kita simpan di simbol tertentu baru kita plot di matlab,
    atau kita pengen tahu 'frequency respon'nya seperti apa??, ya kita dump input FFT baru kemudian di plot di matlab.

    istilahnya kita ga bisa meninggalkan secara full matlab ini..
    atau mungkin yang lain bisa kasih saran??? misal make octave, cuma aku lom pengalaman plot di octave..

    ReplyDelete
  6. octave lebih baik. Free. Syntaxnya lebih mirip MATLAB. Bisa menampilkan figure jg. Beberapa toolbox MATLAB bisa dipindahin/dipake ke octave. Saya sudah pernah running simulasi yg biasanya jalan di MATLAB tp ternyata jg bisa di octave tanpa porting.

    Tinggal cari cara integrasi ke platform lain :p.

    ReplyDelete
  7. Dalam open verification methodologhy (ovm), akan lebih cocok bila model dalam C, karena ovm mempunyai suatu driver yang bisa mengkonversikan data berbentuk transaction level dari model C menjadi data dalam bentuk pin level activity untuk DUT.
    Jadi di ovm tidak perlu ngedump vector untuk di input ke DUT

    ReplyDelete
  8. Bagaimana kalau menggunakan mix language, mix language ini terbagi menjadi 2 layer, layer high level language (python,ruby,java) dan low level language (C/C++) . Low level language menghandle semua masalah time critical dan berisi fungsi fungsi pure komputasi model sedangkan high level language (dalam hal ini saya sarankan menggunakan Python) bertugas memanggil fungsi fungsi yang sudah disediakan oleh low layer dan jga berfungsi untuk plotting, logging, transfer data (tcp,usb,serial dsb). Bahkan klo perlu fungsi fungsi komputasi sederhana atau yang sedikit komplek bisa dilakukan dilayer high level. Untuk python sendiri fungsi komputasi bisa dilakukan menggunakan numpy. Berikut adalah link "propaganda" python pengganti Matlab untuk masalah plotting

    ReplyDelete
  9. Maaf gan, linknya lupa hehehehe

    http://www.ii.uib.no/~avle/python.html

    peace V^_^

    ReplyDelete
  10. Tambahan,

    Selain dilihat dari sisi komputasi Modeling dan freeness, ada beberapa hal yg menyebabkan C/C++ dilirik:

    SoC design juga mulai mengeksploitasi C/C++ untuk system level design, early exploration, early software development, analisa H/W-S/W partiton, dll.

    SoC design tidak bisa lepas dari software (yang notabene menggunakan C/C++), dan algoritma hardware tidak harus didesain dalam RTL (verilog/vhdl) dulu untuk bisa dijalankan bersama software kan? Kelamaan. Kalau bisa Co-Design & Verification mengapa tidak?

    Tinggal masalah kompatibilitas platform ini yg harus diconfirm, misalnya, kalo c/c++/systemc/verilog sih sudah dijamin OK, tapi SPUC/verilog?? Let's see... ;)

    ReplyDelete
  11. @ mas indra,

    Setuju mas, harus pake mix language. Bagi para penggemar phyton akan menyarankan pake phyton sbg wrapper, kalo plotter mungkin banyak juga yg familiar di octave, dan phyton ttp sebagai wrappernya.. :D

    "Everything has to be made simple, but not simpler," Einstein

    ReplyDelete
  12. Ada lagi nih :

    http://www.dedoimedo.com/computers/scientific.html

    ReplyDelete
  13. code octave jg bisa bisa di execute langsung dalam program C++. Ini bisa membantu integrasi ga ?
    http://en.wikipedia.org/wiki/GNU_Octave#C.2B.2B_Integration

    ReplyDelete
  14. saya ingin membuat grafik di matlab dari perhitungan C++. pertanyaan saya: gmn crnya nyimpan C++ nya kemudian manggil data lewat matlab????
    sekian terima kasih...

    ReplyDelete
  15. @rifki,
    Cara paling sederhana, tulis dulu variabel di C++ itu ke suatu file, kemudian baca filenya dari Matlab. Matlab punya library yang mirip untuk pengolahan file.

    ReplyDelete
  16. Sedikit tambahan, kalau pakai library IT++, variabel di C++ bisa dengan mudah dipindah ke matlab.

    Penyimpanan dilakukan dengan membuat variabel bertipe data it_file, yang kemudian bisa membuat file baru berekstensi .it dan bisa diperlakukan seperti standard output (pakai << untuk memasukan datanya).

    Contohnya pemakaian it_file ini bisa dilihat dalam package IT++. Ekstrak saja package-nya, kemudian pelajari ./tests/itfile_test.cpp.

    Untuk baca file .it yang sudah dihasilkan, bisa langsung pakai script matlab itload.m yang sudah disediakan juga oleh IT++. Jalankan di matlab, nanti akan langsung muncul di workspace matlab.

    ReplyDelete