Bilimsel / mühendislik programlamasını C geliştiricilerine iletmenin önerilen bir yolu var mı?


16

Bir web uygulaması için bir arka uç sürecinin bir parçası olarak C (yürütme hızı bu iş için kritik) taşınması gereken MATLAB kodu bir sürü var. Bu kodu bir C geliştiricisine dış kaynak kullanmaya çalıştığımda, birkaç C geliştiricisinin MATLAB kodunu da anladığını varsayıyorum (dizinleme ve bellek yönetimi gibi şeyler farklı, vb.). Ben kod en iyi ne iletişim kurmak için benim için bir prosedür önerebilir herhangi bir C geliştiricileri olup olmadığını merak ediyorum?

Örneğin, MATLAB kodunu sağlamalı ve satır satır ne yaptığını açıklamalı mıyım? Ya da sadece matematik / algoritmayı sağlamalı mıyım, açık İngilizce olarak açıklamalı mıyım ve C geliştiricisinin bunu bu anlayışla kendi yöntemiyle uygulamasına izin vermeli miyim (örneğin geliştiricinin karmaşık matematikle nasıl çalıştığını anladığını varsayabilir miyim (yani hayali) sayılar), histogramlar nasıl oluşturulur, bir FFT nasıl yapılır vb.)?

Yoksa daha iyi bir yöntem var mı? Bunu ilk yapmam gereken bir şey olmadığını umuyorum, bu yüzden orada herhangi bir C geliştiricisinin bu duruma girip girmediğini merak ediyorum ve geleneksel bir bilgeliği bu görevin nasıl aktarılmasını istediklerini paylaşabilir miyim?

herhangi bir yorum için şimdiden teşekkür ederiz.


3
matlab kodunu c'ye dönüştürmek için mcc'yi kullanmayı denediniz mi? sanırım onunmcc -c matlabfile.m
Will Tate

4
Programlayıcıyı işe aldığınızda, hem C hem de Matlab kodunu anlaması gerektiğini belirtin. Hıza olan öneminiz göz önüne alındığında, muhtemelen C yerine C ++ kullanmalısınız (biraz dikkatle, asla daha yavaş ve daha hızlı değildir).
Jerry Coffin

3
@willytate: Bu, Matlab derleyicisine sahip olmanızı gerektirir, özellikle verimli kod üretmez ve hangi kodu derleyebileceğiniz konusunda bazı sınırlamalar vardır.
Jonas

3
C'de nesne yönelimli bir programlama yaparsanız, sadece derleyicinin ekstra tip güvenlik kontrolleri yapma fırsatından mahrum kalmazsınız, derleyiciye kolayca ifade edilemeyen bazı optimizasyonlar yapma şansından mahrum kalırsınız. Ayrıca, C ++ kullanmak, sizden daha akıllı biri tarafından yazılmış bir kitaplıktaki işlevselliği kullanabilme şansınızı artırır.

3
Çoğu zaman gerçek algoritmada mı yoksa dosyalar, ES ve ayrıştırma ile mi uğraşır? Ortalama C kodlayıcısı, MATLAB uygulamasıyla rekabet eden herhangi bir yere gelen FFT ve matris kodunu yazamayacaktır. Ayrıştırma, G / Ç ve dosya işlemleri programınızın zamanını harcadığı yerdeyse, C programlayıcınız buna odaklanmalı ve MATLAB kütüphanelerinden işlevleri çağıran tutkal kodu yazmalıdır. Eğer FFT / matris ayrışımı / ODE çözümü darboğaz ise, o zaman çok sayıda sayısal yöntem deneyimi olan bir C programcısı bulmalısınız.
Charles E. Grant

Yanıtlar:


15

Ben de sizin gibi benzer bir durumdayım ki insanlar da Matlab kodumu C ++ 'a taşıyor.

Çok şey, kodunuzun karmaşıklığına ve C / C ++ geliştiricisinin beceri düzeyine ve ne uygulamaları gerektiğini anlamalarına bağlıdır - ne kadar iyi ve sorununuzu ne kadar iyi anlarlarsa, o kadar fazla bağımsız olarak çalışabilirler.

Matlab kodunun C / C ++ 'a doğrudan çevirisi bir sorunu ele almanın en etkili yolu olmadığından, girdinin ne olduğunu, kodun ne yapması gerektiğini ve çıktı olarak geri dönmesi gereken şeyi iyi iletmenizi öneririm. Ayrıca, kodun doğru çalıştığından emin olmak için hem hata ayıklama için bir yardım hem de kalite kontrol için bir araç sağlamak için test etmelisiniz. Bunun da ötesinde, Matlab kodunu sonuca nasıl ulaşılabileceğine dair kaba bir kılavuz olarak sunmalı ve açıklamalısınız.

Geliştiricinin bir programı nasıl yapılandıracağını ve hata ayıklama araçlarını nasıl kullanacağını bildiğini varsayabilirsiniz. Bununla birlikte, geliştiricinin istatistik veya optimizasyon (matematiksel) optimizasyonu hakkında nasıl özel bilgiye sahip olduğunu bildiğini varsaymanız gerekmeyebilir. Bu nedenle, bu parçalarda hata ayıklama girişinizle çok daha hızlı olacaktır.

Geliştiriciyle düzenli toplantılar planlamanıza yardımcı olabilir, böylece geliştiriciye biraz garip gelebilecek "küçük şeyler", ancak büyük sorunlara dönüşmeden önce size önemli sorunları bildirecek.


Yazılım için geçerli test sonuçlarına sahip olduğu için +1. Matlab'dan C / C ++ 'ya geçiş kodu, sonuçların nasıl görünmesi gerektiğini bilmeden yeterince zordur.
rjzii

12

Bunun sizin için geçerli olduğunu söylemiyorum, ama: Sadece MATLAB'da kod yazan çoğu insan kötü kod yazar. Kötü biçimlendirme, yapı ve dokümantasyon ile çok kötü.

Bu durumda, MATLAB kodunu kullanmanın tek kolay yolu, kodu taşınan koddan doğrulamak için çalıştırmaktır. Ek belgeler olmadan MATLAB kodunu tersine mühendislik yapmaya çalışmak, yalnızca MATLAB kodunun orijinal yazarı gerçekten ölü veya koma ise üstlenilmesi gereken bir şeydir. Öte yandan, bir algoritma üzerine iyi yazılmış bir matematiksel makale genellikle yazarın lisansüstü öğrencisinin kendi uygulamasından çok daha yararlıdır.

Kodunuzu taşıyan kişinin daha kolay olmasını sağlamak için:

  1. İşlemlerin farklı işlevlere ayrıldığından emin olmak için kodunuzu yeniden düzenleyin. MATLAB'ın dosya başına bir işlev stili, işlevlerin çok uzun olmasını ve çok fazla işlemi kapsamaya teşvik eder. Ayrıca, normalde bir MATLAB projesi için çalışmak isteyeceğinizden daha fazla dosyayla sonuçlansa bile, çoğaltılan kodun yardımcı işlevlere çekildiğinden emin olun.

  2. Kodunuzda kullanılan sihirli sayıları veya sabitleri ve bunların geçerli olduğu koşulları açıklayın.

  3. Kodunuzun veri yapılarını belgeleyin. MATLAB'ın "her şey bir matristir" tarzı çoğu dilden çok farklıdır ve genellikle veri yapılarınızın matrisleri nasıl kullandığınızla örtülü olarak tanımlandığı anlamına gelir. AC programcısı, çeşitli yapıların nasıl kurulacağını ve gerekli dizilerin nasıl tahsis edileceğini bulmalıdır, bu nedenle değişkenlerinizin anlamlarının ve iç yapılarının ne olduğundan emin olun.

  4. Kodunuz tarafından kullanılan algoritmaları belgeleyin. Özellikle, karmaşık tüm dizi işlevlerini ve işleçlerini kullandığınızda ne olacağının açık olduğundan emin olun ve C programcısının, herhangi bir araç kutusu işlevi veya standart kitaplık işlevleri tarafından kullanılan algoritmalarla ilgili referanslara daha karmaşık olduğundan emin olun. BLAS fonksiyonları.

  5. Giriş doğrulama ve hata işleme gibi kodu sağlamlaştırmak için yaptığınız her şeyi belgeleyin. Bunu uygulama şekliniz, muhtemelen C.'de nasıl yapılması gerektiğinden çok farklıdır. MATLAB kodu yazan akademisyenler, istisna yönetimi gibi şeyleri öğrenmek için nadiren rahatsız olurlar. Kodunuzu sağlamlaştırmak için herhangi bir şey yapmadıysanız, en azından geçersiz giriş veya hatalı veya kısmi veriler hakkında neler yapılabileceğini belgeleyin.

  6. Kodu taşıyan kişinin çıktıyı orijinal MATLAB koduyla karşılaştırabildiğinden ve mümkünse eksiksiz bir girdi ve doğru çıktı test paketi sağladığından emin olun.

  7. Taşıma işlemini yapan kişi sayısal analiz bilmiyorsa, taşıma işlemini denetlemeniz ve C kodunu gözden geçirip anladığınızdan emin olmanız gerekir. İkiniz için de çok eğitici olacak.


Teknik değerlendirmenize katılıyorum ve iyi puanlar veriyorsunuz (1 - 7), ancak bence en üstte "sadece MATLAB'da kod yapan çoğu insan" hakkındaki reklam honesi gereksiz ve yanlıştı.

5
Deneyimlerime dayanarak, MATLAB'ı tek programlama dili olarak kullanan insanların çoğu, programlama genellikle bir amaçtan başka bir şey olmayan uygulamalı matematik insanlardır. Programlama pratiğini önemsememek için hiçbir teşviği yoktur ve sadece doğru kodu yazmakla ilgilenirler, iyi veya güzel kodları değil. Kodlarını paylaştıklarında, genellikle kullanılması amaçlanır, ancak okunmaz - her zaman kodu açıklamak için bir kağıt vardır. Bunun saldırgan olduğunu düşünüyorsanız (ve olması gerekmiyorsa), umursamayan insanların bakış açısını kaçırıyorsunuz demektir.

4
Deneyimlerime göre, kötü kod esas olarak tek seferlik kod yazan insanlar tarafından yazılır, yani tek bir problem için tek bir kişi tarafından kullanılacak (okunacak) kod. Programlama dili önemli değil. Ve bana göre Matlab'da çoğunlukla programlama yapan bir kişi olarak, reklam hominem rahatsız edici olarak karşımıza çıkıyor.
Jonas

Bir enerji verimliliği şirketi olarak çoğunlukla MATLAB yazmam bekleniyor ve size katılıyorum. Kapsam belirleme, ad alanı oluşturma, veri yapıları halinde düzenleme veya iyi değişken adlandırma olmadan çok korkunç bir kodlama stilini teşvik eder. Vektörizasyon anlaşıldıktan sonra, sonuçta ortaya çıkan zeki tek satırlık mucizelerden herhangi biri hakkında yorum yapmak gerçekten zahmete girmez. Çirkin, verimsiz kodlardan oluşan dev bir çöp yığını.
Milind R

4

Programlama dillerinin okunması yazmaktan çok daha kolaydır. Bir modicum deneyimi olan çoğu C programcısı, bir referansa erişimle ve özellikle sorularını cevaplamak için bir Matlab programcısına erişerek Matlab kodunuzu iyi okuyabilmelidir. Herhangi bir tür kod, üzerinde çalışmamız gereken çoğu koşuldan çok daha az belirsizdir.

Bilgisayar bilimleri veya bilgisayar mühendisliği lisans derecesine sahiplerse, muhtemelen matematik, trigonometri ve doğrusal cebir almış olacaklar, ancak paslı olabilirler. Çok fazla bilimsel / matematik programlama yapmadığı sürece, çoğu C programcısı bir FFT'nin ne olduğunu bilecektir, ancak nadiren veya asla yapmak zorunda kalmaz. İdeal adayınız zihninde bu kadar taze olacak, ancak derecesi olan herkes biraz tazeleme çalışmasıyla matematiği idare edebilmelidir. Her iki durumda da, mümkün olan her durumda kendi kütüphanelerini döndürmek yerine mevcut kütüphaneleri bulmayı vurgulayan birisinin olmasını istersiniz.

Algoritma yürütme süresini optimize edebilme yeteneği deneyimli programcılar arasında bile büyük farklılıklar gösterir. Bunu keşfetmek için bir röportaj probleminiz olmasını tavsiye ederim. Adaylara basit ama kasıtlı olarak verimsiz bir algoritma gösterin ve onlara ne yaptığını sorun. Verimsizliğini kendi başlarına getirip getirmediklerine bakın. Onlara asimptotik karmaşıklığın ne olduğunu ve ne olması gerektiğini sorun. Onları verimliliği artırmak için nasıl yeniden yazacaklarını sorun.


3

Matlab derleyicisini kullanmamanın mali nedeni iyi anlaşılabilir. Ancak, ücretsiz scilab'dan C'ye dönüştürücü kullanabilirsiniz. Prosedür

İdeal olarak bu süreçte hiçbir Scilab bilgisi gerekmez ve bu çözümü denemek biraz zaman alabilir (pratikte, belki de o kadar basit değil ...)

Not: Bunu denemedim ama benzer nedenlerle kendimi öngördüğüm bir çözüm.


2

Her iki uygulamada da çalıştırabileceğiniz iyi bir test seti geliştirin ve ardından metriklere bir göz atın.

Bu, geliştiricinizin kodlarını test etmesine büyük ölçüde yardımcı olacak ve kalitenin makul bir seviyede olmasını sağlayacaktır.


2

Jonas tarafından büyük bir yazı, özellikle kodu test etmek için bir yol sağlama noktası. İşte bazı ek öneriler:

  • Paylaşım Kodu. MATLAB kaynağını sağlamayı düşünün, ancak yapısını veya diğer ayrıntılarını (sözdiziminden kişisel stilinize) açıklamaya hazır olun. C geliştiricisi umarım yüksek seviyeli kavramları, algoritmaları ve matematiği tanıyacaktır ( ve umarım kodunuzu yorumlamışsınızdır ).

  • Belgeler. Projeyi tanımlayan açık belgelerinizin olması çok önemlidir; Sonuçta, kişi MATLAB'da akıcı değilse, kod çok yararlı bir referans olmayabilir.

  • Egzersiz İnsanlar Becerileri. Bununla birlikte, bu tür bir mikro düzeyde işbirliği yaparken akılda tutulması iyi olabilir. Bu nedenle, kodunuzdan / belgelerinizden mümkün olduğunca fazla belirsizliği kaldırmaya çalışmalısınız. Projedeki liderlik seviyenize bağlı olarak, kalkınmaya rehberlik etmek ve kişinin kendi bireysel katkısını yapmasına izin vermek arasında bir denge kurduğunuzu görebilirsiniz.


1

C kodlayıcılarınız doğru kütüphaneleri kullanmadığı sürece Matlab, bir matrisi ters çevirmek kadar önemsiz şeylerde çok daha iyidir. Saf bir C impl. yeterince kararlı değil. C kodlayıcılarını işe almak pahalı olacaktır. Ben hız scipy ve karşılaştırmak için Matlab kod taşıma deneyin, Matlab c c derleyici kullanmaya çalışın, ya da ... sadece daha fazla donanım atmak - çok daha ucuz ve daha basit ve daha güvenli ve daha hızlı olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.