Hardcore Programcısı olarak MATLAB ve R'den kurtulma [kapalı]


25

Sert programcılara yönelik görünen dillerdeki programlamayı seviyorum. (Favorilerim Python ve D.) MATLAB mühendislere yönelik, R ise istatistikçilere yönelik ve bu diller hardcore programcılar olmayan ve hardcore programcılar gibi düşünmeyen insanlar için tasarlandı. Onları her zaman kullanması biraz garip buluyorum ve bir dereceye kadar parmağımı neden kullanamıyorum. Tanımlamayı başardığım bazı sorunlar:

  • (Her ikisi de): Vektörler ve matrisler üzerinde, gerçek ilkellerin olmadığı ölçüde aşırı vurgu.
  • (Her ikisi de): Temel dize işlemlerinin zorluğu.
  • (Her ikisi de): Karma tablolar ve "gerçek" gibi temel veri yapılarını destekleyen (yani parametrik ve değişken tipli diziler) destek eksikliği veya beceriksizliği.
  • (Her ikisi de): Kodunuzu vektörleştirmek için geriye doğru eğilmediğiniz sürece, yorumlanmış dil standartlarına göre bile gerçekten yavaştır.
  • (Her ikisi de): Dış dünyayla etkileşime girecek şekilde tasarlanmamış gibi görünüyorlar. Örneğin, her ikisi de başlatılması biraz zaman alan ve basit metin filtresi programlarını yazmayı kolaylaştıracak şekilde tasarlanmamış gibi görünen oldukça hacimli programlardır. Dahası, iyi bir dizge işlemenin olmayışı, dosya G / Ç'leri her şeyde dosya haline getirir, ancak standart biçimlerde imkansız.
  • (Her ikisi de): Nesne oryantasyonunun cıvatalı bir his var gibi görünüyor. Evet, yapabilirsin, ancak C'deki OO'dan daha aptalca bir his yok.
  • (Her ikisi de): Referans türü almanın açık ve basit bir yolu yok. İşaretçiler veya sınıf referansları yok. Örneğin, kendi bağlantılı listenizi bu dillerden birinde nasıl yuvarladığınızı bilmiyorum.
  • (MATLAB): Birden fazla üst düzey işlevi tek bir dosyaya koyamazsınız, çok uzun işlevleri ve kes ve yapıştır kodlamasını teşvik edemezsiniz.
  • (MATLAB): Tam anlamıyla ilk sınıf tipi olarak görünmüyor.
  • (R): Temel yerleşik veri yapıları çok yüksek ve kötü bir şekilde belgelenmiş görünüyor ve benzer ancak daha düşük seviyeli veri yapılarıyla ilgili deneyimlerime dayanarak beklediğim şeyi kesinlikle yapmadım.
  • (R): Belgeler her yere yayılmış ve göz atmak veya aramak neredeyse imkansız. Kötü dokümantasyon için sık sık çalınan ve hala oldukça alfa olan D bile, söyleyebileceğim kadarıyla daha iyi.
  • (R): En azından bildiğim kadarıyla, bunun için iyi bir IDE yok. Yine, D bile, küçük bir topluluğa sahip oldukça alfa dilli bir dil, daha iyisini yapar.

Genel olarak, yeterince kapsamlı kütüphaneler mevcutsa, MATLAB ve R'nin daha genel amaçlı dillerde düz eski kütüphanelerle kolayca değiştirilebileceğini hissediyorum. Bu, özellikle kütüphane yazarları için birçok özellik içeren yeni genel amaçlı dillerde geçerlidir.

Neden R ve MATLAB bana çok garip geliyor? Bu dilleri zorlu programcılar için garip hale getirebilecek önemli olduğunu düşündüğünüz başka önemli konular var mı? Kullanımı gerektiğinde, iyi hayatta kalma ipuçları nelerdir?

Düzenleme: Aldığım bazı cevaplardan bir sorun görüyorum. Verileri analiz ettiğimde bütün boru hattını içeren tek bir komut dosyası kullanmak için güçlü bir kişisel tercihim var . Bu, genel amaçlı bir dilin kullanılması gerektiği anlamına gelir. Verileri "temizlemek" için bir komut dosyası yazmaktan ve bundan sonra tamamen farklı bir ortamda okumak için başka bir şey yazmaktan nefret ediyorum, vb. Tamamen farklı bir adres alanı ve geri kalanı için çok büyük bir sürtünme kaynağı olması için farklı düşünce biçimleri olan farklı bir dil Dahası, var olan yapıştırıcı tabakaları olduğunu biliyorum, ancak her zaman korkunç derecede karmaşık ve sürtünme kaynağı gibi görünüyorlar.


40
python şimdi "hardcore" programcılar için yazılmıştır? bu ne zaman oldu
TZHX

3
@ TZHX: Tamam, belki de hardcore yanlış sözdü. Daha iyi bir ifade, "programlayıcı olan ve programcı gibi düşünen insanlar" dır.
dsimcha

17
Gerçekten "hardcore programcı" terimini beğenmedim. Sesler bir tür seçkinlik gibi gözüküyor ve “genel amaçlı programcı” terimi aynı noktaya gelmeye yetmişti.
blubb

5
R ve Matlab'ın hardcore programcılar için olmadığından şikayet ediyorsun, ama şikayetlerin R ve Matlab'ı kullanacak kadar sert olmadığın gibi görünüyor. Algol ailesinden olmayan bir dilde yazmak istiyorsanız, terimleri açısından düşünmeniz gerekir.
Peter Taylor

5
Gee, benim ikinci programlama dilim Assembly idi. Python'un sert çekirdeği değil - kesinlikle R ve Matlab ile aynı seviyede. Bunun farklı olduğunu varsaymak, Python'un ötesinde bir şey anlamamaktır ... Python, genel amaçlı programlama için harikadır. Matlab, Mathworks'ün kolaylaştırdığı birçok şey nedeniyle harika. R, kıyaslanamayan istatistik, makine öğrenmesi, veri hazırlama, analiz ve görselleştirme araçları (aka istatistik) nedeniyle mükemmeldir. Perl'in harika b / c ... Sadece benim yaptığımı yapın - hepsini öğrenin ve iş için doğru olanı seçin. :)
Iterator

Yanıtlar:


29

Büyük olasılıkla programlama yapmak için gereken zihniyet ile etki alanına özgü dillere yaklaşmak veya genel amaçlı programları genel amaçlı dillerle programlamak muhtemelen kötü bir fikirdir. Etki alanına özgü olması, daha verimli bir şekilde kullanılması için daha dik bir öğrenme eğrisi ve rahatsız edici bir zihin kümesi gerektirecektir. Kodları, Matlab’da yüksek derecede optimize edilmiş, alana özgü kodlar yazmaya (örneğin, verimli ve temiz OpenGL kodları yazmakla eşit) yazmaya eşdeğerdir. Ayrıca, diğer dillerde kullanılacak kütüphaneler olarak kullanışlı olma yolunda gittikçe daha fazla hareket ettiklerini gördüm - bkz. Örneğin, http://www.mathworks.com/matlabcentral/fileexchange/12987-integrating-matlab-with-c

Diyelim ki bu DSL için aynı işlemi başkaları için olduğu gibi kullanın:

  • Tam olarak çözmede en iyi oldukları sorunların türü olduklarından emin olmak için Matlab veya R kullanarak çözmekte olduğunuz sorunları dikkatlice seçin. Örneğin, vektörlerinizi değiştirmek için Matlab'ı kullanın, işinizin geri kalanında değil, kaçınmanız durumunda
  • Genel olarak, Matlab veya R'de programladığınız kısımları, ele almak için oluşturdukları sorunun tam alt kümesiyle sınırlamak için çözümü karıştırın / eşleştirin.
  • Örneğin bir Matlab programında çalışmaya başlamadan önce, dillerin oluşturulduğu alandaki, çözümünüzü tasarlarken ve oluştururken, tipik bir kullanıcının zihniyetini izleyin; muhtemelen ilk önce standart matematik gösterimini kullanarak çalışmanızı kağıda yazın.
  • Kendinizi rahat bir çalışma ortamı oluşturmak için gereken ekstra işleri yapın ve DSL için standarttan farklı olsa bile, işi yapmak için gereken araçları edinin. Örneğin, bir emac kullanıcısıysanız, emac'ların işinizi yapması için matlab modunu kullanmayı düşünün; diğer diller için ayarladığınız modların yanı sıra çalıştığından emin olun.
  • Kapatmaya hazır olun. Özellikle sık sık dile geri dönmeniz gerekiyorsa, DSL'de yaptığınız işin yalnızca etki alanına özgü çalışmanın bulunduğu ve güvenilir bir ekosistemi oluşturduğunuzdan emin olun, yalnızca başka bir dile geçmek mümkün işinin geri kalanı. DSL'e özgü olmayan işleri diğer sistemlerde yapmanın yollarını aramak için her zamankinden daha sık kendinize hatırlatın

3
Söyledikleriniz mükemmel bir anlam ifade ediyor ve tipik olarak Matlab veya R'yi kullanmam gerektiğinde işleri nasıl yaptığımdır. Bunun sinir bozucu kısmı, birden çok dili birden çok şeyi yapma yolu ve çoklu adres alanlarıyla bütünleştirmek zorunda kalmanın neden olduğu sürtünmedir. Genellikle, bu işlemleri metin dosyalarına görünüşte rastgele noktalardan atma ve geri okuma ya da yapılandırmak için tutkal katmanını kırılgan, çirkin, zor kullanmaktan ibarettir.
dsimcha

25

MATLAB ile aşina olduğumu, ancak R'yi bilmediğime dikkat ederek bunu ön planlayacağım.

MATLAB OO, dize işleme veya özel veri yapıları ile de yapmaz nedeni değil olmasıdır geliyordu bunları yapmak. OO için birçok dil, string işleme ile iyi bir iş yapan lotlar ve çılgın özel veri türlerini destekleyen birçok dil var. Hiçbiri matris çarpımında iyi değil, çünkü onlar bunun için tasarlanmadı.

Sadece, MATLAB'ın yaptığı vektör ve matris işlemlerini optimize etmek, kullanıcı tanımlı türler veya işaretçilerle uğraşmadan ya da ne yapmazsa, (eğer zor olmasa, bunun için çok fazla ücret alamazlardı) yeterince zordur. Mevcut genel amaçlı dillere hızlı vektör desteği eklemek de zordur, --- az sayıda programcının kullanacağı bir özellik için büyük bir ek yük ekler (çok az programcının bağlantılı listeleri anlaması, özdeğer ayrıştırmasını nasıl kullanmaları beklenir? ).

MATLAB sana çok yabancı çünkü bilim adamlarının ve mühendislerin matris çarpımı ve ODE hesaplamalarını çok hızlı yapmasına izin verecek şekilde tasarlandı. MATLAB "hardcore" bir dil tanımınızı ölçmez, çünkü asla yapmaması gerekiyordu. MATLAB'ı Python veya D açısından düşünmeye çalışmak, LISP veya Haskell'i C, veya Verilog ve VHDL hakkında düşünmeye çalışmak gibi, JavaScript açısından --- farklı problemleri çözüyor ve problem çözmeyi çok farklı şekillerde ele alıyorlar. Dürüst olmak gerekirse, MATLAB, alana özgü bir dil perspektifinden bile başımı çevreleyemediğim tuhaf dil tasarım seçimleri yaptı. Ancak bir astronomun, göksel cismin X'in, 48.0 AU'ya karşılık göksel cisim Y'den tam olarak 48 AU uzakta olmasını önemsemesinin belirli bir nedeni yoktur.

Şimdi, neyse ki, bazı kütüphaneler tam da sizin önerdiğiniz gibi sahneye geliyor: genel amaçlı bir dilde bilimsel hesaplama için iyi destek. Python için bazı pürüzlü kenarlara sahip olan ancak Python içinde makul MATLAB işlevselliği sağlayan NumPy / Matplotlib var. Bunun gibi başka bir projenin olmamasının nedeni, kütüphanelerin zaten MATLAB ve FORTRAN tarafından kapsanan bir pazara yazmak ve hizmet etmek için inanılmaz zor olmasıdır.

MATLAB veya R'yi kesinlikle kullanmak zorundaysanız, "hardcore" bir programcı gibi programlara yaklaşamazsınız, "hardcore" bir bilim adamı veya mühendis gibi yaklaşmanız gerekir. LISP için, var özyinelemede düşünüyorum. MATLAB'da, sadece matrislerde düşünmek zorundasınız. Doğrusal cebir tazelemek ( MIT'in konuyla ilgili dersleri harika bir derlemedir). Aksi taktirde, "hayatta kalmak" için tek yol MATLAB, bir döngünün bir vektör işlemiyle ne zaman değiştirilebileceğini veya sorununuz bir dış ürünün özdeğerlerini bulmak için ne zaman azaldığını anlamak için pratik yapmaktır.


Evet, genel olarak Numpy / Scipy / Matplotlib'i seviyorum ve bariz bir alternatif MATLAB / R olduğunda bunları kullanıyorum. Bununla ilgili tek şikayetim, MATLAB / R kadar derin olmadıkları ve Python oldukları için hala biraz yavaş oldukları.
dsimcha

4
@ dsimcha, bu aslında yanlıştır . Bu performans çalışmasında, Numpy MATLAB ile aynı seviyede ve Pyrex C + 2 katsayısı dahilinde.
wvoq

@ wvoq: Açıklama: Python yorumlayıcısının Numpy değil yavaş olduğu anlamına geliyordu. Numpy'nin çoğunlukla BLAS ve LAPACK için bir sarmalayıcı olduğunu biliyorum. Tabii ki hala bu koda çağrı sabit genel gider var. Ayrıca Pyrex, Cython, vb. Hakkında da bilgim var ve onlar yardım ediyor, ancak hala dilleri iyi ayarlanmış bir seviyede karıştırıyorsunuz ve bu hala bir sürtünme kaynağı olabilir.
dsimcha

2
@ dsimcha, Numpy'i çağırmanın ek yükü pratik olarak bir sabittir. Bahsettiğim performans çalışmasında, C ++ ile saniyenin onda birini kazanıyorsun. Bu zaman, yazma ve hata ayıklama ile harcanan zamanla karşılaştırmalı ve BLAS aramalarında hata ayıklama yapılmalı. Neden her şeyi mecliste yazmamayı sormak öğretici olabilir mi? Ya da düz makine kodu, montajdan makine koduna dönüşüm bazı sabit ek yükler eklediği için?
wvoq

3
@ dsimcha Huh? Her şeyi tek bir dilde yapmak istiyorsun, en çok Python'u seviyorsun ve sonra Python'un yavaş olduğundan şikayet ediyorsun? Öyleyse asıl nokta ne? Sanırım MATLAB'ın daha genel amaçlı özelliklere sahip olmasını ve yorumlanmış bir dilden daha hızlı olmasını istersiniz?
Chris, Reinstate Monica'nın

14

Kendine atıfta bulunarak "hardcore programcı" terimini tekrar kullanmanız. R ve MATLABa tasarımcıları olduklarını da ima birlikte değil , hem çok saçma beni çarptığı ve ciddiye eleştiriler almamaya teşvik eder.

Bazı ciddi R eleştirilerini okumak istersen, bu parçayı R'nin tasarımcılarından biri olan Ross Ihaka'nın okumasını iyi yaparsın . Bana göre tasarım yapmak D veya Python kullanmaktan daha zor .


2
-1. Asla MATLAB ve R tasarımcılarının çok iyi olmayan hardcore programcılardan başka bir şey olduğunu ima etmek istemedim. Bununla birlikte, MATLAB ve R, hardcore programcılar için tasarlanmamıştır .
dsimcha

3
“... görünüşe göre bu diller hardcore programcılar olmayan ve hardcore programcılar gibi düşünmeyen insanlar tarafından tasarlandı.”
wvoq

6
Bir "hardcore programcının" ne olduğunu hala netleştirmedin. Örneklerinize göre, "hardcore" sadece "C ++ ile en rahat" anlamına gelir; bu durumda R ve MATLAB tanım olarak sert olmaz. Neredeyse tüm örnekleriniz, bu alanlardaki uzmanların neden bu şekilde uygulamaya uygun göründüklerini sormadan, bu dillerin alıştığınız şey olmadığına dair şikayetleri azaltır.
wvoq

1
Ayrıca, tanım açısından açık olduğunu düşündüm, ama "hardcore bir programcı" sadece referanslar / işaretçiler, nesne yönelimi, lambda fonksiyonları, temel veri yapıları vb. genel amaçlı bir dilde.
dsimcha

2
İlk olarak, "hardcore", "oo / prosedürel / işlevsel programlamadaki temel kavramlarla konuşan birini" belirtmek isteniyorsa, oldukça yüklü bir terimdir. İkincisi, MATLAB için konuşamam, ama R bunların hepsine sahip. Tek fark, R'de, dilinizi, probleminizi, istatistiksel kelime öğelerinin ilkel haline geleceği şekilde ele alması için teşvik etmenizdir. Bunun nedeni, istatistikçilerin ve makine öğrenen kişilerin sık sık bu şekilde ifade edilen problemlerle çalışmasıdır, bu da R'yi “daha ​​sert çekirdekli” şeylerle rahat olsanız bile doğal bir formda tutar.
wvoq

9

Gerçek ilkel olmadıkça, vektörlere ve matrislere aşırı vurgu.

Gerçek ilkel dediğinize bağlı. R'de bir vektör gerçek bir ilkeldir; yani, tüm değişkenler vektördür. Aynı şekilde, MATLAB'da tüm değişkenler matrislerdir.

Temel dize işlemlerinin zorluğu.

MATLAB'da string manipülasyon güçlüdür ancak kodun genellikle çirkin ve sezgisel olmadığını kabul ediyorum (en azından şimdilik). R için, stringrbaşka bir dilde araç olarak kullanmak güzel olan bir paket var .

Hash tabloları ve "real" gibi temel veri yapılarını destekleme eksikliği veya beceriksizliği, yani tip-parametrik ve nesetlenebilir diziler.

R'de, vektörlerin bir karma gibi çalışan isimleri vardır. Ayrıca hashve filehashpaketler de var. MATLAB uygulamaları hakkında emin değilim, ancak isterseniz kolayca JAVA veya .NET sürümlerini çağırabilirsiniz.

Kodunuzu vektörleştirmek için geriye doğru eğilmediğiniz sürece, yorumlanmış dil standartlarına göre bile gerçekten yavaştırlar.

Bir kere vektörleşmeyi kestikten sonra (eminim ki, eğer gerçekten sert iseniz) diğer dillere geri döndüğünüzde döngüler kullanmak zorunda kalacağınız konusunda lanetleneceksiniz. Uygulama hızı, programlama hızının değişmesidir.

Dış dünya ile etkileşime girecek şekilde tasarlanmamış gibi görünüyorlar. Örneğin, her ikisi de başlatılması biraz zaman alan ve basit metin filtresi programlarını yazmayı kolaylaştıracak şekilde tasarlanmamış gibi görünen oldukça hacimli programlardır. Dahası, iyi bir dizge işlemenin olmayışı, dosya G / Ç'leri her şeyde dosya haline getirir, ancak standart biçimlerde imkansız.

Her ikisi de hemen hemen her formatta veri okuyabilir ve yazabilir. Her ikisi de birçok diğer programlama dilinden çağrılabilir. Veya komut isteminden. Onlarla GUI oluşturabilirsiniz. Bu dış dünyayla nasıl etkileşime girmiyor? Metin filtresi programınızla mücadele ediyorsanız stackoverflow'u sorun.

Nesne oryantasyonunun cıvatalı bir his var gibi görünüyor. Evet, yapabilirsin, ancak C'deki OO'dan daha aptalca bir his yok.

Kabul; Onlar öncelikle prosedür dilleridir.

Referans türünü almanın açık ve basit bir yolu yok. İşaretçiler veya sınıf referansları yok. Örneğin, kendi bağlantılı listenizi bu dillerden birinde nasıl yuvarladığınızı bilmiyorum.

R'de anlaşıldı. MATLAB'da referanslara tanıtıcı denir.

Tek bir dosyaya birden fazla üst düzey işlev koyamazsınız, çok uzun işlevler ve kes ve yapıştır kodlarını teşvik edemezsiniz.

Saçmalık. Sadece birden fazla dosya oluşturun.

Tamsayılar görünüşte birinci sınıf bir tip olarak mevcut değil.

Onlar yapar. Bkz int8, int16, int32ve int64.

Temel yerleşik veri yapıları çok yüksek ve kötü bir şekilde belgelenmiş görünüyor ve benzer ancak düşük seviyeli veri yapılarıyla ilgili deneyimlerime göre hiçbir zaman beklediğim gibi bir şey yapmıyor gibi görünüyor.

Veri analizi yapmaya uygundur. Lütfen beklenmedik davranışlarla ilgili özel örnekler verin.

Belgeler her yere yayılmıştır ve göz atmak veya aramak neredeyse imkansızdır. Kötü dokümantasyon için sık sık çalınan ve hala oldukça alfa olan D bile, söyleyebileceğim kadarıyla daha iyi.

Çok çeşitli belgeler var. İle başlayın ?some_function, RSiteSearch('some concept'), rseek.org ve sospaketin. Kurulumla birlikte verilen kılavuzlardan bahsetmiyorum bile. Ya da iyi bir kitap .

En azından farkında olduğum kadarıyla, bunun için iyi bir IDE yok. Yine, D bile, küçük bir topluluğa sahip oldukça alfa dilli bir dil, daha iyisini yapar.

Architect veya RStudio veya Revolution Analytics IDE'yi deneyin. Bağlantılar ve daha fazla seçenek için Yığın Taşması bilgi sayfasının "R ID'leri ve editörleri" bölümüne bakın .


3

MATLAB, Java ve C / C ++ ile bütünleşebilir. Nümerik olmayan iş yükünüzü bu dillerde uygulayabilir ve onları MATLAB'dan çağırın.

kullanımları gerekli

Gerekli olmasının bir nedeni var mı? Başkalarının yazdığı bir MATLAB kod tabanı üzerinde mi çalışıyorsunuz? Bir iş gereksinimi mi? (veya okuldaysanız sınıf gereksinimi) Olmazsa, yerine SciPy veya NumPy kullanmayı düşünebilirsiniz.

Ne yazık ki, benim görüşüme göre, eğer bu durum birine zorlanıyorsa, her zaman hayatta kalamaz. Kolejde bile, her mühendislik öğrencisi MATLAB'a hesaplamalı düşünme tarzına alışamaz.


2
Bu çözümlerin farkındayım, ancak oldukça geriye görünüyorlar. MATLAB'ı C ++, Java, vb. Den başka türlü değil. MATLAB dışında bir şey istiyorum "benim sürücü" dilim.
dsimcha

2
@dsimcha Eğer C. See gelen MATLAB ve R kütüphaneleri çağırabilir mathworks.com/help/techdoc/matlab_external/f38569.html veya math.univ-montp2.fr/~pudlo/R_files/call_R.pdf
Charles E. Grant

0

MATLAB, Python ve C (ve bazen C ++) ile çalışıyorum ve veri bilimcileri, matematikçiler veya diğer alan uzmanları olma eğiliminde olan meslektaşlarımın karşısında oturan bir yazılım geliştirici olduğumu düşünüyorum.

Her ne kadar C veya Python anlamında genel amaçlı bir programlama dili olmadığını kabul etmeme rağmen, aslında zaman serisi analizi veya görüntü işleme gibi şeyler için MATLAB'da senaryo yazmaktan çok hoşlanıyorum.

Dilin, genellikle oldukça verimsiz uygulanmış olmasına rağmen, kullanımı zevkli olan birkaç özelliği vardır. Örneğin, mantıksal indeksleme yapın: İlgilenilen bir bölgeyi seçen bir mantıksal vektör veya matris yaratabilir ve "isInROI" olarak adlandırabilir, o bölgedeki vektör veya matristen "veri" den öğeleri seçmek için bir filtre işlemi gerçekleştirebilir. o zaman sadece bir yazı meselesi: "roiData = data (isInROI)".

MATLAB'ı gerçekten takdir etmemi sağlayan ve diğer, çok sayıda ve çok tartışılan günahlarını gözden kaçırmama izin veren bu gibi anlar.


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.