Saya memiliki banyak kode MATLAB yang perlu porting ke C (kecepatan eksekusi sangat penting untuk pekerjaan ini) sebagai bagian dari proses back-end untuk aplikasi web. Ketika saya mencoba untuk melakukan outsourcing kode ini ke pengembang C, saya berasumsi (perbaiki saya jika saya salah) beberapa pengembang C juga memahami kode MATLAB (hal-hal seperti pengindeksan dan manajemen memori berbeda, dll.). Saya bertanya-tanya apakah ada pengembang C di luar sana yang dapat merekomendasikan prosedur untuk saya ikuti untuk mengkomunikasikan dengan baik apa yang kode lakukan?
Sebagai contoh, haruskah saya memberikan kode MATLAB dan menjelaskan apa yang dilakukannya baris demi baris? Atau, haruskah saya memberikan matematika / algoritme, menjelaskannya dalam bahasa Inggris, dan membiarkan pengembang C mengimplementasikannya dengan pemahaman ini dengan caranya sendiri (mis. Bisakah saya menganggap pengembang memahami cara bekerja dengan matematika yang rumit (yaitu imajiner angka), bagaimana cara menghasilkan histogram, melakukan FFT, dll)?
Atau, adakah metode yang lebih baik? Saya berharap saya bukan orang pertama yang perlu melakukan ini, jadi saya ingin tahu apakah ada pengembang C di luar sana yang menghadapi situasi ini dan dapat berbagi kebijaksanaan konvensional bagaimana mereka ingin tugas ini ditransfer?
Terima kasih sebelumnya atas komentar Anda.
mcc -c matlabfile.m
Jawaban:
Saya berada dalam situasi yang sama seperti Anda dalam hal saya juga memiliki orang-orang port kode Matlab saya ke C ++.
Banyak hal tergantung pada kerumitan kode Anda, serta tingkat keterampilan pengembang C / C ++ dan pada pemahaman mereka tentang apa yang seharusnya mereka terapkan - semakin baik mereka dan semakin baik mereka memahami masalah Anda, semakin banyak secara mandiri mereka dapat bekerja.
Karena terjemahan langsung kode Matlab ke C / C ++ mungkin bukan cara yang paling efisien untuk menangani masalah, saya sarankan Anda berkomunikasi dengan baik apa inputnya, apa yang harus dilakukan kode, dan apa yang seharusnya dikembalikan sebagai output. Anda juga harus menyediakan cara untuk menguji kode untuk memastikan kode itu berfungsi dengan benar - baik sebagai bantuan untuk debugging maupun menyediakan sarana untuk kontrol kualitas. Selain itu, Anda harus memberikan dan menjelaskan kode Matlab sebagai pedoman kasar tentang bagaimana hasil dapat dicapai.
Anda harus dapat mengasumsikan bahwa pengembang tahu bagaimana menyusun program dan bagaimana menggunakan alat debugging. Namun, Anda mungkin tidak dapat mengasumsikan bahwa pengembang tahu bagaimana memiliki pengetahuan khusus dalam, katakanlah statistik, atau optimasi (matematis). Dengan demikian, men-debug bagian-bagian ini akan jauh lebih cepat dengan input Anda.
Mungkin membantu untuk menjadwalkan pertemuan rutin dengan pengembang, sehingga "hal-hal kecil" yang mungkin terasa agak aneh bagi pengembang, tetapi itu akan menandakan masalah penting agar Anda dapat dikomunikasikan sebelum mereka berkembang menjadi masalah besar.
sumber
Saya tidak mengatakan ini berlaku untuk Anda, tetapi: Kebanyakan orang yang hanya kode di MATLAB menulis kode yang buruk. Sangat buruk, dengan format, struktur, dan dokumentasi yang buruk.
Ketika hal ini terjadi, satu-satunya cara mudah untuk menggunakan kode MATLAB adalah menjalankannya untuk memverifikasi hasil dari kode porting. Mencoba merekayasa balik kode MATLAB tanpa dokumentasi tambahan adalah sesuatu yang hanya boleh dilakukan jika pembuat asli kode MATLAB benar-benar mati atau koma. Di sisi lain, makalah matematika yang ditulis dengan baik pada suatu algoritma biasanya jauh lebih membantu daripada implementasi mahasiswa pascasarjana sendiri.
Untuk mempermudah orang yang mengirim kode Anda:
Perbaiki kode Anda untuk memastikan bahwa operasi dipecah menjadi fungsi yang berbeda. Gaya satu-fungsi-per-file MATLAB mendorong fungsi menjadi terlalu panjang dan mencakup terlalu banyak operasi. Juga pastikan bahwa kode yang digandakan ditarik ke fungsi pembantu, bahkan jika ini menghasilkan lebih banyak file daripada yang biasanya ingin Anda gunakan untuk proyek MATLAB.
Jelaskan angka ajaib atau konstanta yang digunakan dalam kode Anda, dan kondisi di mana mereka valid.
Dokumentasikan struktur data kode Anda. Gaya "semuanya adalah matriks" MATLAB sangat berbeda dari kebanyakan bahasa, dan itu sering berarti bahwa struktur data Anda didefinisikan secara implisit oleh cara Anda menggunakan matriks. Pemrogram AC perlu mengetahui cara mengatur berbagai struktur dan mengalokasikan array yang diperlukan, jadi pastikan sudah jelas apa arti dan struktur internal variabel Anda.
Dokumentasikan algoritma yang digunakan oleh kode Anda. Secara khusus, pastikan bahwa sudah jelas apa yang terjadi ketika Anda menggunakan fungsi dan operator seluruh array yang rumit, dan pastikan bahwa programmer C memiliki akses ke referensi tentang algoritma yang digunakan oleh fungsi toolbox atau fungsi pustaka standar yang lebih rumit daripada Fungsi BLAS.
Dokumentasikan apa pun yang telah Anda lakukan untuk membuat kode tersebut kuat, seperti validasi input dan penanganan kesalahan. Cara Anda menerapkannya mungkin sangat berbeda dari yang harus dilakukan dalam C. Akademisi menulis kode MATLAB jarang repot untuk belajar tentang hal-hal seperti penanganan pengecualian. Jika Anda belum melakukan apa pun untuk membuat kode Anda kuat, maka setidaknya dokumentasikan apa yang dapat dilakukan tentang input yang tidak valid atau cacat atau sebagian data.
Pastikan orang yang mem-porting kode dapat membandingkan keluaran dengan kode MATLAB asli, dan jika memungkinkan, berikan rangkaian uji input dan keluaran yang benar.
Jika orang yang melakukan porting tidak mengetahui analisis numerik, Anda perlu mengawasi proses porting dan memastikan bahwa Anda meninjau dan memahami kode C. Ini akan sangat mendidik bagi Anda berdua.
sumber
Bahasa pemrograman lebih mudah dibaca daripada menulis. Kebanyakan programmer C dengan sedikit pengalaman harus dapat membaca kode Matlab Anda baik-baik saja dengan akses ke referensi, dan terutama dengan akses ke programmer Matlab untuk menjawab pertanyaan mereka. Kode apa pun jauh lebih tidak ambigu daripada sebagian besar persyaratan yang harus kami selesaikan.
Jika mereka memiliki gelar sarjana dalam ilmu komputer atau teknik komputer, mereka kemungkinan akan mengambil kalkulus, trigonometri, dan aljabar linier, tetapi mungkin berkarat. Kecuali mereka melakukan banyak pemrograman sains / matematika, kebanyakan programmer C akan tahu apa itu FFT, tetapi jarang atau tidak pernah harus melakukannya. Kandidat ideal Anda akan memiliki semua yang segar dalam pikirannya, tetapi siapa pun dengan gelar harus mampu menangani matematika dengan beberapa studi penyegaran. Dalam kedua kasus, Anda menginginkan seseorang yang menekankan menemukan perpustakaan yang ada untuk operasi umum seperti itu bila memungkinkan daripada menggulir perpustakaan mereka sendiri.
Bakat untuk dapat mengoptimalkan waktu eksekusi algoritma sangat bervariasi bahkan di antara programmer berpengalaman. Saya akan merekomendasikan Anda memiliki masalah wawancara untuk menemukan itu. Tunjukkan kepada kandidat algoritma yang sederhana namun tidak efisien dan tanyakan kepada mereka apa fungsinya. Lihat apakah mereka memunculkan inefisiensi sendiri. Tanyakan kepada mereka apa kompleksitas asimptotik itu dan apa yang seharusnya. Tanyakan kepada mereka bagaimana mereka akan menulis ulang untuk meningkatkan efisiensi.
sumber
Alasan keuangan untuk tidak menggunakan kompiler matlab dapat dimengerti. Namun, Anda dapat menggunakan pengubah scilab ke C gratis. Prosedurnya adalah
Idealnya tidak ada pengetahuan tentang Scilab yang diperlukan dalam proses dan cukup mudah untuk mengambil waktu untuk mencoba solusi ini (dalam praktiknya, itu mungkin tidak sesederhana ...)
Catatan: Saya tidak mencoba ini tetapi ini adalah solusi yang saya bayangkan untuk alasan yang sama.
sumber
Kembangkan set pengujian yang baik yang dapat Anda jalankan melalui kedua aplikasi dan kemudian lihat metriknya.
Ini akan sangat membantu pengembang Anda menguji kode mereka, dan memastikan bahwa kualitasnya pada tingkat yang masuk akal.
sumber
Pos luar biasa oleh Jonas, terutama untuk menyediakan cara menguji kode. Berikut beberapa saran tambahan:
Kode Berbagi Pertimbangkan untuk menyediakan sumber MATLAB tetapi bersiaplah untuk menjelaskan strukturnya atau detail lainnya (dari sintaksis ke gaya pribadi Anda). Pengembang C diharapkan akan mengenali konsep, algoritma, dan matematika tingkat tinggi ( dan mudah-mudahan Anda mengomentari kode Anda ).
Dokumentasi. Sangat penting bagi Anda untuk memiliki dokumentasi yang jelas yang mendefinisikan proyek; setelah semua, jika orang tersebut tidak lancar dalam MATLAB, kode tersebut mungkin bukan referensi yang sangat berguna.
Latihan Keterampilan Orang. Ini mungkin jelas namun ada baiknya untuk diingat ketika berkolaborasi, terutama pada tingkat mikro semacam ini. Jadi Anda harus mencoba untuk menghapus sebanyak mungkin ambiguitas dari kode / dokumentasi Anda. Bergantung pada tingkat kepemimpinan Anda dalam proyek, Anda mungkin menemukan bahwa Anda mencapai keseimbangan antara membimbing pengembangan dan membiarkan orang tersebut memberikan kontribusi pribadi mereka sendiri.
sumber
Kecuali jika coders C Anda menggunakan libs yang tepat, Matlab jauh lebih baik dalam hal-hal sepele seperti membalikkan sebuah matriks. Implan C naif. tidak cukup stabil. Menyewa coders C akan mahal. Saya akan mencoba porting kode Matlab ke scipy dan membandingkan kecepatan, mencoba menggunakan kompiler c Matlab, atau ... hanya melemparkan lebih banyak perangkat keras di dalamnya - itu bisa jauh lebih murah dan lebih sederhana dan lebih aman dan lebih cepat dan lebih cepat.
sumber