Pada kesempatan kali ini sekali lagi saya menekankan pentingnya menghindari looping dalam pemrograman MATLAB. Kebetulan ini merupakan soal yang saya berikan dalam pelatihan MATLAB kemarin kepada teman-teman. Saya g tau apa ini bisa dikerjakan atau tidak, yang jelas saya kasikan aja jawabannya, sekalian berbagi pengetahuan. Semoga bisa diambil manfaatnya.
Soalnya adalah diberikan sebuah matriks yang ukurannya 1000 x 1000. Kenapa 1000 x 1000, karena biar kita terbiasa dengan perhitungan sesungguhnya di lapangan. Pada matriks ini, sederhana saja yang dilakukan yakni, jika penjumlahan baris dan kolom genap, isi matriks tersebut dengan angka dua, sementara jika ganjil, isi dengan 1. Adapaun hasil codingnya adalah sebagai berikut.
Jadi terlihat jelas bahwa performa indeks 10 kali lipat lebih cepat ketimbang pake looping.
Sesungguhnya shalat itu mencegah dari (perbuatan-perbuatan) keji dan mungkar
Q.S. Al-'Ankabut Ayat 45
Wednesday, July 17, 2013
Sunday, July 14, 2013
Rut-etra-izer versi JavaFX
Pada tutorial kali ini saya akan mendemonstrasikan salah satu kegunaan dari JavaFX yakni dalam melakukan translate terhadap salah satu aplikasi berbasis javascript yakni Rut-etra-izer kedalam bahasa java. Kebetulan saya agak penasaran dengan kecanggihan aplikasi ini. Saya baru tahu soalnya dan saya harap pembaca bisa mengambil manfaat dari tutorial ini. Adapun hasil mentahnya dapat dilihat pada gambar berikut:
Maksud saya adalah saya pengen berbagi tutorial aja. Semoga bermanfaat!
package fjr.main.rutte.traizer; import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.image.PixelReader; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.scene.shape.LineTo; import javafx.scene.shape.MoveTo; import javafx.scene.shape.Path; import javafx.scene.shape.PathBuilder; import javafx.scene.shape.QuadCurve; import javafx.scene.transform.Affine; import javafx.scene.transform.Rotate; import javafx.stage.Stage; public class Rutte extends Application { static String main = Rutte.class.getResource("mami.jpg").toExternalForm(); int step = 5; int stepY = 50; double depth = 56; double width = 0 ; double height = 0; @Override public void start(Stage primaryStage) throws Exception { Group root = getEsembel(); primaryStage.setScene(new Scene(root)); primaryStage.setTitle("TUT WURI HANDAYANI"); primaryStage.show(); } public Group getEsembel() { Group root = new Group(); Image image = new Image(main); width = image.getWidth(); height = image.getHeight(); PixelReader pixel = image.getPixelReader(); double originX = 0; double destinyX = 0; double originY = 100; double destinyY = 0.0; Canvas canvas = new Canvas(width+50,height+50); GraphicsContext gc = canvas.getGraphicsContext2D(); double shifty =0; for(int y = 0 ; y < height; y+= step){ for(int x = 0; x < width-step ;x+= step){ Color color = pixel.getColor(x, y); Color color1 = pixel.getColor(x+step, y); double brightness = color.getBrightness(); double brightness1 = color1.getBrightness(); originX = x ; destinyX = x+step; originY = - brightness*depth+brightness/2 + shifty; destinyY = - brightness1*depth+brightness1/2+ shifty; gc.setStroke(color); this.rotateX(gc, -30); gc.strokeLine(originX,originY, destinyX, destinyY ); originX = destinyX ; originY = destinyY; } shifty+= 5; } root.setTranslateX(20); root.setTranslateY(20); root.getChildren().add(canvas); return root; } /* * I'm not found the way to rotate GraphicContext with simple way like other node */ static void rotateX(GraphicsContext gc , double angle){ Affine affine = new Affine(); double angleRadi = Math.toRadians(angle); double sinus = Math.sin(angleRadi); double cosinus = Math.cos(angleRadi); affine.setMxx(1); affine.setMxy(0); affine.setMxz(0); affine.setTx(0); affine.setMyx(0); affine.setMyy(cosinus); affine.setMyz(-sinus); affine.setTy(0); affine.setMzx(0); affine.setMzy(sinus); affine.setMzz(cosinus); affine.setTz(0); gc.setTransform(affine); } static void rotateY(GraphicsContext gc , double angle){ Affine affine = new Affine(); double angleRadi = Math.toRadians(angle); double sinus = Math.sin(angleRadi); double cosinus = Math.cos(angleRadi); affine.setMxx(cosinus); affine.setMxy(0); affine.setMxz(sinus); affine.setTx(0); affine.setMyx(0); affine.setMyy(1); affine.setMyz(0); affine.setTy(0); affine.setMzx(-sinus); affine.setMzy(0); affine.setMzz(-cosinus); affine.setTz(0); gc.setTransform(affine); } static void rotateZ(GraphicsContext gc , double angle){ Affine affine = new Affine(); double angleRadi = Math.toRadians(angle); double sinus = Math.sin(angleRadi); double cosinus = Math.cos(angleRadi); affine.setMxx(cosinus); affine.setMxy(-sinus); affine.setMxz(0); affine.setTx(0); affine.setMyx(sinus); affine.setMyy(cosinus); affine.setMyz(0); affine.setTy(0); affine.setMzx(0); affine.setMzy(0); affine.setMzz(1); affine.setTz(0); gc.setTransform(affine); } public Group getLine(double y) { Group root = new Group(); return root; } public static void main(String[] args) { launch(args); } }Sebenarnya masih ada beberapa bagian yang ingin saya sempurnakan, misalnya respon terhadap mouse, drag n drop terhadap foto serta menyimpan hasil ke dalam gambar JPEG. Tapi biar g terlalu basi, mendingan dipublish aja versi BETA-nya. Itupun kalo layak disebut BETA.
Maksud saya adalah saya pengen berbagi tutorial aja. Semoga bermanfaat!
Tuesday, July 9, 2013
Performa indeks dalam mengganti logika if di MATLAB
Posting ini berkaitan dengan posting saya sebelumnya yakni tentang vektorisasi molekular dinamik di MATLAB:
yang sampai saat ini masih menyisakan pertanyaan besar di kepala saya. Antara lain, mengapa vektorisasi justru membutuhkan waktu lebih lama, serta yang kedua, entah kenapa simulasinya g sesuai dengan yang diharapkan: terjadi kolaps setelah waktu tertentu dan perpindahan posisi yang cukup lambat ketimbang companion-nya yang dibuat di java [1]. Dalam menyelidiki masalah ini saya sekali lagi pengen menunjukin kenapa vektorisasi itu penting di MATLAB dan sebisa mungkin kita harus menghindari loop dalam menulis program di MATLAB.
Oleh karena itu saudara bisa menyimak listing berikut
Terlihat jelas bahwa penggunaan indeks di MATLAB bisa digunakan untuk mengganti logika if pada looping. Lantas bagaimana dengan performanya. Pada listing berikut ini telah saya ukur bagaimana performa dari indeks sendiri.
Yang mana menunjukkan bahwa dengan menggunakan indeks kita bisa mengurangi waktu eksekusi program hingga sampai setengahnya. Hal ini jelas disebabkan oleh perintah indeks sendiri ditangani secara 'native' oleh MATLAB interpreter.
Fakta kedua yang bisa digaris bawahi adalah ternyata dua fungsi dalam satu file pada MATLAB alokasi eksekusinya ditempatkan pada core processor yang berbeda seperti sudah saya komentari pada listing di atas.
Oleh karena itu saudara bisa menyimak listing berikut
Terlihat jelas bahwa penggunaan indeks di MATLAB bisa digunakan untuk mengganti logika if pada looping. Lantas bagaimana dengan performanya. Pada listing berikut ini telah saya ukur bagaimana performa dari indeks sendiri.
Yang mana menunjukkan bahwa dengan menggunakan indeks kita bisa mengurangi waktu eksekusi program hingga sampai setengahnya. Hal ini jelas disebabkan oleh perintah indeks sendiri ditangani secara 'native' oleh MATLAB interpreter.
Fakta kedua yang bisa digaris bawahi adalah ternyata dua fungsi dalam satu file pada MATLAB alokasi eksekusinya ditempatkan pada core processor yang berbeda seperti sudah saya komentari pada listing di atas.
1. Ternyata perintah
axis manual
di MATLAB hanya berlaku ketika ada perintah hold on
.Sunday, July 7, 2013
Vektorisasi loop molekular dinamik di MATLAB
Hal ini berlaku pula dalam dunia pemrograman. Dalam dokumentasi resmi MATLAB yang saya ambil di link http://www.mathworks.com/help/matlab/matlab_prog/techniques-for-improving-performance.html disebutkan bahwa agar program MATLAB bisa berjalan dengan lebih cepat maka salah satu cara yang bisa digunakan adalah menggunakan pre-alocating array dan menghindari penggunaan looping:
http://stackoverflow.com/questions/12074373/matlab-vectorization-how-to-avoid-this-for-loop
http://stackoverflow.com/questions/16214891/how-to-avoid-a-for-loop-in-matlab-when-performing-a-operation-on-each-row-in-a
Akan tetapi baru-baru ini saya mencoba mengetes dugaan tersebut dalam simulasi molekular dinamik. Dan ternyata hasilnya tidak sesuai yang ada pada buku. Rupanya pengembangan MATLAB akhir-akhir ini cenderung melakukan optimisasi pada looping ketimbang prosedur standar (yakni operasi matriks) yang merupakan brand dari MATLAB.
Simulasi molekular dinamik sendiri saya translate dari sumber di
http://www.personal.psu.edu/auk183/MolDynamics/Molecular%20Dynamics%20Simulations.html
Yang aslinya dikembangkan dengan bahasa java. Setelah melakukan debugging yang susah payah, akhirnya saya berhasil mengembangkan versi MATLAB nya: menggunakan teknik vektorisasi yang menjadi brand MATLAB ketimbang menggunakan looping yang katanya mengurangi performa. Berikut merupakan kode hasil vektorisasi tersebut
Adapun kode hasil translate secara 'mentah' adalah sebagai berikut
Setelah dieksekusi terlihat bahwa hasil penggunaan loop bukannya memperlambat performa, malah mempercepat performa dari program MATLAB sendiri. Rata-rata waktu eksekusi looping berada di sekitar 0.03 detik, sementara hasil vektorisasi ternyata membutuhkan waktu 3 kali lebih lama yani berada di sekitar 0.1 detik.
Saturday, July 6, 2013
Belajar Monte Carlo di MATLAB
Berikut saya berikan contoh program tentang bagaimana menghitung luas poligon dengan metode monte carlo. Saya harap dengan pemahaman ini, teman-teman semua bisa memahami hakikat dari monte carlo. Sehingga bisa menggunakannya untuk keperluan-keperluan lainnya.
Plot gerak jatuh bebas di MATLAB
Buat teman-teman sekalian yang ingin belajar plot gerak jatuh bebas di MATLAB berikut saya berikan sedikit tutorial. Semoga bermanfaat:
Thursday, July 4, 2013
Belajar Latex
Bagi teman-teman sekalian yang pengen belajar Latex, saya akan memberikan buku ala kadarnya yang jauh dari kesempurnaan. Semoga bisa dinikmati
Untuk downloadnya di:
Tuesday, July 2, 2013
Berkenalan dengan bahasa python
Pada kesempatan kali ini saya akan mencoba sedikit membahas tentang salah satu bahasa pemrograman yang cukup populer di dunia, yakni bahasa pemrograman python. Mengapa python, karena bahasa python merupakan salah satu bahasa yang bisa menghadirkan banyak fleksibilitas dengan kehandalan yang sudah diakui. Bagi saya python itu bahasa yang sangat fleksibel. Mungkin anda pernah punya pengalaman dengan bahasa semisal MATLAB atau sejenisnya. Tapi menurut saya bahasa tersebut terlalu kaku. Memang untuk para enggineer, MATLAB sudah menyediakan beberapa fitur built-in yang sangat membantu. Tapi jika dipikir-pikir dari sekian banyak fitur-fitur tersebut hanya sedikit saja yang benar-benar kita butuhkan. Yang lainnya merupakan fitur hasil abstraksi tingkat tinggi yang sebenarnya kurang begitu kita perlukan, atau bahkan sama sekali tidak sesuai dengan kebutuhan kita sehingga harus dimodifikasi lebih lanjut atau dicarikan alternatifnya.
Misalnya saja financial toolbox atau medical toolbox. Saya yakin kalo orang berkecimpung di dunia medis atau ekonomi, tentu sudah ada alat default yang biasa mereka gunakan yang spesifik untuk kebutuhan mereka ketimbang harus menggunakan MATLAB yang kurang populer di kalangan mereka. Bayangkan harga MATLAB berapa kemudian ukuran file instalasinya berapa, sementara yang kita butuhkan hanya operasi-operasi dasar matriks yang dalam bahasa lain pun sudah tersedia dengan gratis.
Python sendiri sebagai bahasa pemrograman punya domain penggunaan yang sangat luas di samping komunitasnya sangat aktif. Komunitas inilah yang menjadi penentu dalam pengembangan bahasa pemrograman. Kalo komunitasnya mandek otomatis bahasanya juga ikutan stagnan. Sementara kalo kita sudah sangat mahir di MATLAB atau beberapa bahasa pemrograman lainnya---kecuali kita seorang developer yang dihire untuk mempekerjakan proyek-proyek berbasis MATLAB---tentu lebih tertarik menggunakan bahasa-bahasa lain yang lebih interaktif dan free. Jika menguasai python, kecakapan tersebut bisa digunakan untuk kebutuhan lain misalnya untuk membangun aplikasi database atau aplikasi berbasis web. Sementara jika cuma tahu MATLAB, g ada yang bisa dilakukan (setidaknya di Indonesia ini). Bahkan di laboratorium fisika di seluruh dunia bahasa yang dipakai pun bukan MATLAB melainkan fortran atau C. Sementara untuk tahu bahasa fortran dan C, sebagai langkah awal kita harus belajar dulu bahasa yang konsepnya mudah dipahami semacam python.
Tapi ini perspektif pribadi. Anda boleh saja punya pendapat lain yang mungkin saja lebih shahih. Yang jelas untuk perkenalan saya akan memberikan sebuah potongan operasi dasar pada python. Kebetulan python sendiri merupakan bahasa yang sedikit banyak terinspirasi dengan bahasa Lisp---yakn penyerapan konsep List ke dalam struktur bahasanya----maka saya akan menggunakan konsep list tersebut yang kebetulan juga baru-baru ini saya pelajari:D.
Untuk mulai menggunakan python, terlebih dahulu kita mesti mendownload file instalasinya di https://code.google.com/p/winpython/. Sebagai perkenalan, berikut saya berikan sebuah listing tentang operasi perkalian matrix di python. Kebetulan saya sedang membuat buku (dalam bahasa Indonesia) untuk pemrograman di python---Masalahanya kalo dalam bahasa Inggris sangat melimpah di internet. Jadi penjelasannya menyusul di belakang.
Friday, June 28, 2013
Re-syncs subtitle dengan windows power shell
Pada kesempatan kali ini saya akan memberikan sedikit tips yang ada hubungannya dengan pengalaman saya semalam dalam menonton film. Kebetulan film tersebut saya download di youtube. Dan masalahnya adalah subtitle yang tersedia pada film tersebut adalah subtitle untuk 2 CD sementara filmnya 1 CD. Jadinya kacau.
Yang pertama saya pikirkan adalah bagaimana agar kedua substitlenya di merge aja. Maksudnya disamping dialognya digeser nomornya juga dirubah. Tapi masalahnya adalah kita g tau benar, berapa jeda antara habisnya substitle yang pertama dengan masuknya subtitle kedua. Jadi biar amannya mendingan file dipisah aja. Sisanya (kalo masih g sinkron) tinggal di shift-shift aja dengan tool bawaan dari media player. Sebenarnya yang saya maksud pada tutorial ini sedikit berbagi aja fungsi dari windows power shell (tentunya bagi yang belum tahu).
Berikut adalah listing dari program yang saya buat!
untuk file lengkapnya bisa anda liat di link berikut: https://github.com/gunungloli666/substitle
Yang pertama saya pikirkan adalah bagaimana agar kedua substitlenya di merge aja. Maksudnya disamping dialognya digeser nomornya juga dirubah. Tapi masalahnya adalah kita g tau benar, berapa jeda antara habisnya substitle yang pertama dengan masuknya subtitle kedua. Jadi biar amannya mendingan file dipisah aja. Sisanya (kalo masih g sinkron) tinggal di shift-shift aja dengan tool bawaan dari media player. Sebenarnya yang saya maksud pada tutorial ini sedikit berbagi aja fungsi dari windows power shell (tentunya bagi yang belum tahu).
Berikut adalah listing dari program yang saya buat!
$ref_file = get-content ./1.srt $cari = [regex] "^[1-9][0-9]{0,3}\b\s*$"; $cari1 = [regex] "-->"; $temp = ""; $i= 0; foreach($item in $ref_file){ if($item -match $cari){$i = [int]$item; } if($item -match $cari1){$temp = $item ; } } $temp = $temp.split("-->")[3].replace("\s+", "").split("[:,\,]"); $i++; # geser sedikit dalam microsecond $temp[3] = 200; ( get-content ./2.srt) | foreach-object{ $sambung = ""; if($_ -match $cari1){ $hasil = $_ -split $cari1 ; $first = $hasil[0].split("[:,\,]"); $second = $hasil[1].split("[:,\,]"); $first[3] = [int]$first[3] + $temp[3]; if([int] $first[3] -gt 1000){ $first[2] = [int]$first[2] + 1; $first[3] = [int]$first[3] - 1000; } $first[2] = [int] $first[2] + $temp[2]; if([int] $first[2] -gt 60){ $first[1] = [int]$first[1] + 1; $first[2] = [int]$first[2] - 60; } $first[1] = [int] $first[1] + $temp[1]; if([int] $first[1] -gt 60){ $first[0] = [int]$first[0] + 1; $first[1] = [int]$first[1] - 60; } $first[0] = [int] $first[0] + $temp[0]; $second[3] = [int] $second[3] + $temp[3]; if([int] $second[3] -gt 1000){ $second[2] = [int]$second[2] + 1; $second[3] = [int]$second[3] - 1000; } $second[2] = [int] $second[2] + $temp[2]; if([int] $second[2] -gt 60){ $second[1] = [int]$second[1] + 1; $second[2] = [int]$second[2] - 60; } $second[1] = [int] $second[1] + $temp[1]; if([int] $second[1] -gt 60){ $second[0] = [int]$second[0] + 1; $second[1] = [int]$second[1] - 60; } $second[0] = [int] $second[0] + $temp[0]; $sambung = $first[0]+":"+$first[1]+":"+$first[2]+","+$first[3]+" --> "+$second[0]+":"+$second[1]+":"+$second[2]+","+$second[3]; } # sebenarnya nomornya mau dirubah juga tapi g jadi # $_ -replace "^.*-->.*$" , $sambung -replace $cari , $i ; $_ -replace "^.*-->.*$" , $sambung ; # if($_ -match $cari){ # $i++; # } } | set-content ./2_baru.srt;
untuk file lengkapnya bisa anda liat di link berikut: https://github.com/gunungloli666/substitle
Wednesday, June 26, 2013
Tentang Enumi
Memang hidup sebagai programmer itu tidak mudah. Harus selalu tabah dalam mendebug program. Bayangkan membuat dokumen saja mesti pusing tujuh keliling buat nyari petunjuk sana-sini. Tadi malam saya bingung bagaimana membuat sebuah penomoran dalam beamer yang nomornya panjang dan lebih dari sebuah frame. Anda bisa menggunakan perintah
Semoga bermanfaat!
\allowframebreak
tapi itu ada masalah. Masalahnya adalah perintah itu akan mematikan overlay. Jadi tidak akan ada lagi efek warna-warni dalam presentasi anda. Cara yang paling bagus adalah menggunakan perintah \setcounter
. Perhatikan cuplikan berikut
% enumi penomoran asli Latex, sementara saveenumi adalah buatan kita \newcounter{saveenumi} \newcommand{\simpan}{\setcounter{saveenumi}{\value{enumi}}} \newcommand{\ambil}{\setcounter{enumi}{\value{saveenumi}}} \begin{frame} \begin{enumerate} \item Item satu \item Item dua % dst \item Item yang masih muat \simpan % simpan hitungan default \end{enumerate} \end{frame} \begin{frame} \begin{enumerate} \ambil % ambil hitungan yang disimpan \item Item seterusnya \end{enumerate} \end{frame}
Semoga bermanfaat!
Subscribe to:
Posts (Atom)