ハードコアプログラマーとしてのMATLABとRの存続[終了]


25

私は筋金入りのプログラマー向けの言語でのプログラミングが大好きです。(私のお気に入りはPythonとDです。)MATLABはエンジニア向けで、Rは統計学者向けです。これらの言語は、筋金入りのプログラマーではなく、筋金入りのプログラマーのように思わない人向けに設計されたようです。私はいつもそれらを使用するのがやや厄介だと感じており、ある程度までその理由に指を置くことができません。ここに、私が特定したいくつかの問題を示します。

  • (両方):真のプリミティブが存在しない範囲でベクトルと行列を極端に強調します。
  • (両方):基本的な文字列操作の難しさ。
  • (両方):ハッシュテーブルや「実際の」、つまり型パラメトリックでネスト可能な配列などの基本的なデータ構造のサポートの欠如または不便さ。
  • (両方):コードをベクトル化するために後ろに曲がらない限り、インタープリター言語の標準でも本当に遅いです。
  • (両方):彼らは外の世界と相互作用するように設計されていないようです。たとえば、どちらも起動に時間がかかるかなりかさばるプログラムであり、単純なテキストフィルタープログラムを簡単に作成できるようには設計されていないようです。さらに、適切な文字列処理がないため、非常に標準的な形式以外のファイルI / Oはほとんど不可能になります。
  • (両方):オブジェクトの向きは非常にボルトで締められたように見えます。はい、できますが、Cのオブジェクト指向よりもはるかに慣用的な感じはしません。
  • (両方):参照型を取得するための明白で簡単な方法はありません。ポインターまたはクラス参照はありません。たとえば、これらの言語のいずれかで独自のリンクリストをどのようにロールするかはわかりません。
  • (MATLAB):単一のファイルに複数のトップレベル関数を配置することはできません。非常に長い関数とカットアンドペーストコーディングを奨励します。
  • (MATLAB):整数は最初のクラス型として存在しないようです。
  • (R):基本的な組み込みデータ構造は、高すぎるレベルであり、文書化が不十分であるように思われ、同様であるが低レベルのデータ構造での私の経験を考えると、期待どおりに機能しないようです。
  • (R):ドキュメントはいたるところに散らばっており、閲覧や検索が事実上不可能です。悪いドキュメントのためにしばしばノックされ、まだかなりアルファっぽいDでさえ、私が知る限りではかなり優れています。
  • (R):少なくとも私が知っている限りでは、良いIDEはありません。繰り返しますが、小さなコミュニティを持つかなりアルファっぽい言語であるDでさえもうまくいきます。

一般的に、十分に包括的なライブラリが存在する場合、MATLABとRはより汎用的な言語の単純な古いライブラリに簡単に置き換えることができると感じています。これは、ライブラリ作成者向けの多くの機能を含む新しい汎用言語では特に当てはまります。

なぜRとMATLABは私にとってとても奇妙に見えるのですか?これらの言語が筋金入りのプログラマーにとって奇妙なものになるかもしれないと気づいた他の大きな問題はありますか?それらの使用が必要な場合、いくつかの良いサバイバルのヒントは何ですか?

編集:私が得たいくつかの答えから1つの問題を見ています。データを分析するときは、パイプライン全体を組み込む1つのスクリプトを作成することを強く好みます。これは、汎用言語を使用する必要があることを意味します。スクリプトを記述してデータを「クリーンアップ」して吐き出し、次に別のスクリプトを作成して完全に異なる環境で読み返す必要があるのは嫌いです。まったく異なるアドレス空間を備えた異なる言語と、残りの部分が大きな摩擦の原因であると考える方法。さらに、接着剤層が存在することは知っていますが、それらは常に恐ろしく複雑で摩擦の原因になるようです。


40
Pythonは「ハードコア」プログラマ向けに書かれていますか?それはいつ起こりましたか?
TZHX

3
@TZHX:なるほど、ハードコアは間違った言葉だったかもしれません。より良いフレーズは、「プログラマであり、プログラマのように考える人」です。
-dsimcha

17
「ハードコアプログラマー」という言葉が本当に嫌いです。ある種のエリート主義のように聞こえますが、「汎用プログラマー」という用語は、同じことを言えば十分でした。
-blubb

5
あなたはRとMatlabは筋金入りのプログラマー向けではないことを不平を言っていますが、あなたの不満はあなたがRとMatlabを使用するのに十分な筋金入りでないということのようです。アルゴル語以外の言語で記述したい場合は、その用語で考える必要があります。
ピーターテイラー

5
Gee、私の2番目のプログラミング言語はAssemblyでした。Pythonのないハードコア-それは上だ正確 RおよびMatlabのと同じレベル。異なると仮定することは、Pythonをはるかに超えて理解しないことです... Pythonは、汎用プログラミングにとって素晴らしいです。Mathworksで簡単にできることがたくさんあるため、Matlabは素晴らしいです。Rは、比類のない統計、機械学習、データ準備、分析、および視覚化ツール(統計とも呼ばれる)が利用できるため、優れています。Perlのすばらしいb / c ...私と同じように-それらすべてを学び、仕事に適したものを選択してください。:)
イテレーター

回答:


29

プログラミング全般、または汎用言語を使用した汎用プログラムのプログラミングに必要な考え方でドメイン固有の言語にアプローチすることは、おそらく悪い考えです。ドメイン固有であるため、最も効率的に使用するには、より急な学習曲線と不快な心のセットが必要になる可能性があります。Matlabでコードを書くことは、高度に最適化されたドメイン固有のコード(たとえば、効率的でクリーンなOpenGLコードの作成と同等)を書くことと同等です。また、他の言語で使用するライブラリとして有用になるようにそれらがますます動くのを見てきました-たとえば、http://www.mathworks.com/matlabcentral/fileexchange/12987-integrating-matlab-with-cを参照してください

これらのDSLには、他のDSLと同じプロセスを使用します。

  • MatlabまたはRを使用して解決する問題を慎重に選択し、それらが解決するのに最適な問題の種類であることを確認します。たとえば、回避できる場合は、Matlabを使用してベクターを操作し、残りの作業ではありません
  • 一般的に、MatlabまたはRでプログラムする部分を、それらが処理するために構築された問題の正確なサブセットに制限するように、ソリューションを組み合わせます。
  • ソリューションを設計および構築するときは、言語が構築されているドメインの一般的なユーザーの考え方に従います。たとえば、Matlabプログラムで作業を開始する前に、ベクトル数学的な世界観を取り入れます。おそらく標準的な数学表記を使用して、最初にあなたの作品を紙に書く
  • 快適な作業環境を構築するために必要な追加作業を行い、DSLの標準とは異なる場合でも、作業を行うために必要なツールを入手します。たとえば、emacsユーザーの場合、emacsでmatlabモードを使用して作業を行うことを検討してください。他の言語用に設定したモードと同様に機能することを確認してください
  • 切り替える準備をしてください。特に、頻繁に言語に戻る必要がある場合は、DSLで行う作業がドメイン固有の作業のみに含まれる信頼性の高いエコシステムを構築してください。残りの作業。通常よりも頻繁に、他のシステムで非DSL固有の作業を行う方法を探すことを思い出してください。

3
あなたの言うことは完全に理にかなっており、通常、MatlabまたはRを使用する必要があるときに私が物事を行う方法です。これのイライラする部分は、複数の方法と複数のアドレス空間を複数の言語に統合する必要があることによって生じる摩擦です 通常、これには、一見任意のポイントでテキストファイルに物をダンプし、それらを読み戻すか、構成するのが難しくてくて難しい接着層を使用します。
-dsimcha

25

私は、MATLABに精通しているが、Rには精通していないことに注意して、これに先立ちます。

MATLABがオブジェクト指向、文字列処理、またはカスタムデータ構造でうまく機能しない理由は、それらを行うこと意図していないためです。OOには多くの言語があり、文字列処理で優れた仕事をする多くの言語があり、さらに多くの言語がクレイジーなカスタムデータ型をサポートしています。それらはどれも、行列乗算が得意ではありません。なぜなら、それらは、そのために設計されていないからです。

MATLABが実行するベクトルおよび行列演算を最適化するだけでは、ユーザー定義の型やポインターなどを処理することなく、十分に困難です(困難でなければ、それほど多くを請求することはできません)。既存の汎用言語に高速ベクトルサポートを追加することも困難です。ほとんどのプログラマーが使用することのない機能に大きなオーバーヘッドが追加されます(リンクリストを理解するプログラマーが少なすぎます。固有値分解をどのように使用しますか? )。

MATLABは、科学者やエンジニアが行列の乗算やODEの計算を非常に高速に行えるように設計されているため、非常に異質です。MATLABは、「ハードコア」言語の定義に基づいて測定することはありませんでした。MATLABをPythonまたはDの観点から考えようとすることは、Cの観点からLISPまたはHaskellを考え、JavaScriptの観点からVerilogおよびVHDLを考えようとするのと同じです。公平を期すために、MATLABは、ドメイン固有の言語の観点からも頭を包み込むことのできない奇妙な言語設計の選択肢を(大丈夫、たくさん)作成しました。しかし、天体Xが天体Yから48.0 AUに対してちょうど48 AU離れていることを天文学者が気にする必要がある特別な理由はありません。

ありがたいことに、いくつかのライブラリが登場します。これらのライブラリは、まさに提案どおりに機能します。汎用言語での科学計算の優れたサポートです。Pythonの場合、NumPy / Matplotlibがあります。これは、いくつかのラフなエッジを持ちますが、Python内で適切なMATLAB機能を提供します。このような他のプロジェクトがなかった理由は、MATLABとFORTRANで既にカバーされている市場にライブラリを記述して提供するのが非常に難しいためです。

絶対にMATLABまたはRを使用する必要がある場合、「ハードコア」プログラマーのようにプログラミングすることはできません。「ハードコア」科学者またはエンジニアのようにアプローチする必要があります。LISPについては、再帰考えています。MATLABでは、マトリックスで考える必要があります。線形代数をブラッシュアップします(トピックに関するMITの講義は素晴らしいレビューです)。そうでなければ、MATLABを「生き残る」ための唯一の方法は、ループをベクトル演算で置き換えることができるか、または外積の固有値を見つけることに問題が減ったときを認識することです。


はい、全体的に私はNumpy / Scipy / Matplotlibが大好きで、明らかな代替手段がMATLAB / Rの場合はいつでもそれらを使用します。これらについての私の唯一の不満は、それらがMATLAB / Rほど深くなく、Pythonであるため、まだ多少遅いということです。
-dsimcha

4
@dsimcha、これは事実上正しくありません。このパフォーマンススタディでは、NumpyはMATLABと同等であり、PyrexはC ++の2倍以内です。
wvoq

@wvoq:明確化:私はPythonインタープリターがNumpyではなく遅いことを意味しました。Numpyはほとんどの場合、BLASとLAPACKのラッパーであり、高速です。もちろん、このコードを呼び出すことによるオーバーヘッドは依然として固定されています。私はPyrexやCythonなども知っていますが、それらは助けになりますが、あなたは言語をきめ細かいレベルで混合しているので、これは依然として摩擦の原因になります。
dsimcha

2
@ dsimcha、Numpyを呼び出すオーバーヘッドは実質的に一定です。私が述べたパフォーマンス調査では、C ++を使用すると数十分の一秒が得られます。その時間は、BLAS呼び出しの書き込みとデバッグ、およびデバッグに費やされた時間と比較する必要があります。アセンブリですべてを書いてみませんか?または、アセンブリからマシンコードへの変換により固定オーバーヘッドが追加されるため、ストレートマシンコードでもかまいません。
wvoq

3
@dsimchaえ?単一の(高速)言語ですべてを実行したい場合、Pythonが最も好きで、Pythonが遅いと不平を言っていますか?それで、全体のポイントは何ですか。MATLABに、より汎用的な機能を持たせ、インタープリター言語よりも高速にしたいだけでしょうか?
クリスは、モニカを復活させる

14

あなた自身について「ハードコアプログラマー」という用語を繰り返し使用しています。RとMATLABの設計者はそうではないというあなたのほのめかしに加えて、私は非常にばかげていると思い、あなたの批判を真剣に受け止めないように人々を励まします。

Rに対する深刻な批判を読みたい場合は、Rのデザイナーの1人であるRoss Ihakaによるこの記事を読んでください。R を設計することは、 DやPython を使用するよりもかなり難しいようです。


2
-1。私は、MATLABとRのデザイナーが非常に優れた筋金入りのプログラマー以外であることを意味するつもりはありませんでした。ただし、MATLABとRは筋金入りのプログラマ向けに設計さていません。
-dsimcha

3
「...これらの言語は筋金入りのプログラマーではなく、筋金入りのプログラマーのように思わない人々によって設計されたようです。」
wvoq

6
あなたはまだ「ハードコアプログラマー」が何であるかを明確にしていません。あなたの例では、「ハードコア」は「C ++で最も快適」を意味するように聞こえます。この場合、RとMATLABは定義上ハードコアではありません。ほとんどすべての例は、これらの分野の専門家がそれらの言語をそのように実装するのに適していると考える理由を尋ねることなく、これらの言語が慣れ親しんでいないという苦情に帰着します。
wvoq

1
また、定義の観点からは明らかだと思いましたが、「ハードコアプログラマー」とは、参照/ポインター、オブジェクト指向、ラムダ関数、基本的なデータ構造などの基本的なプログラミング概念に慣れている人のことです。汎用言語で。
-dsimcha

2
まず、「oo / procedural / functional programmingの基本概念に精通している人」を示すことを意図している場合、「hardcore」はかなり負荷の高い用語です。第二に、MATLABについて話すことはできませんが、Rにはこれらすべてがあります。唯一の違いは、Rでは、統計的な語彙の要素がプリミティブになるように、言語によって問題を解決するよう奨励されていることです。その理由は、統計学者や機械学習の人々は、この方法で簡単に表現される問題に取り組むことが多く、「ハードコア」なものに慣れていてもRが自然にフィットするからです。
wvoq

9

真のプリミティブが存在しない範囲でのベクトルと行列の極端な強調。

それはあなたが真のプリミティブと呼ぶものに依存します。Rでは、ベクトルは真のプリミティブです。つまり、すべての変数はベクトルです。同様に、MATLABでは、すべての変数は行列です。

基本的な文字列操作の難しさ。

MATLABでは、文字列操作は強力ですが、コードがtheくて直感的でないことが多いことに同意します(少なくとも現時点では)。Rには、stringr他の言語のツールと同じくらい便利なパッケージがあります。

ハッシュテーブルや「実際の」、つまり型パラメトリックでネスト可能な配列のような基本的なデータ構造のサポートの欠如または不便さ。

Rでは、ベクトルにはハッシュのように機能する名前があります。hashおよびfilehashパッケージもあります。MATLABの実装についてはわかりませんが、必要に応じてJAVAまたは.NETバージョンを簡単に呼び出すことができます。

あなたがコードをベクトル化するために後ろに曲がらない限り、それらはインタープリター言語標準によってさえ本当に本当に本当に遅いです。

ベクトル化のコツを手に入れたら(本当にハードコアなら、きっとそうなるでしょう)、他の言語に戻ったときにループを使わなければならないのは呪いでしょう。実行速度は、プログラミング速度のトレードオフです。

彼らは外の世界と相互作用するように設計されていないようです。たとえば、どちらも起動に時間がかかるかなりかさばるプログラムであり、単純なテキストフィルタープログラムを簡単に作成できるようには設計されていないようです。さらに、適切な文字列処理がないため、非常に標準的な形式以外のファイルI / Oはほとんど不可能になります。

どちらも、ほぼすべての形式でデータを読み書きできます。どちらも他のほとんどのプログラミング言語から呼び出すことができます。または、コマンドプロンプトから。GUIを作成できます。それはどのように外の世界と相互作用しないのですか?テキストフィルタープログラムに苦労している場合は、stackoverflowで質問してください。

オブジェクトの向きは非常にボルトで締められたように見えます。はい、できますが、Cのオブジェクト指向よりもはるかに慣用的な感じはしません。

同意した; これらは主に手続き型言語です。

参照型を取得するための明確で簡単な方法はありません。ポインターまたはクラス参照はありません。たとえば、これらの言語のいずれかで独自のリンクリストをどのようにロールするかはわかりません。

Rに同意。MATLABでは、参照はハンドルと呼ばれます。

1つのファイルに複数のトップレベル関数を配置することはできません。非常に長い関数とカットアンドペーストコーディングを奨励します。

ナンセンス。複数のファイルを作成するだけです。

整数は、明らかにファーストクラス型として存在しません。

彼らはします。参照してくださいint8int16int32int64

基本的な組み込みのデータ構造は、高すぎるレベルであり、文書化が不十分であるように思われ、同様の、しかし低レベルのデータ構造での経験を考えると、期待したことをまったく実行しないようです。

データ分析を行うのに適しています。予期しない動作の具体例を挙げてください。

ドキュメントはいたるところに散らばっており、閲覧や検索は事実上不可能です。悪いドキュメントのためにしばしばノックされ、まだかなりアルファっぽいDでさえ、私が知る限りではかなり優れています。

多くの種類のドキュメントがあります。始まる?some_functionRSiteSearch('some concept')rseek.org、およびsosパッケージ。インストールに付属のマニュアルは言うまでもありません。または良い本

少なくとも私が知っている限りでは、それに適したIDEはありません。繰り返しますが、小さなコミュニティを持つかなりアルファっぽい言語であるDでさえもうまくいきます。

ArchitectまたはRStudioまたはRevolution Analytics IDEをお試しください。リンクとその他のオプションについては、スタックオーバーフロー情報ページの「RのIDEとエディター」セクションを参照してください


3

MATLABは、JavaおよびC / C ++と統合できます。これらの言語で非数値ワークロードをすべて実装し、MATLABから呼び出すことができます。

それらの使用が必要です

それが必要な理由はありますか?他の人が書いた既存のMATLABコードベースに取り組んでいますか?仕事の要件ですか?(または学校にいる場合はクラスの要件)そうでない場合は、代わりにSciPyまたはNumPyの使用を検討できます。

残念ながら、私の個人的な意見では、この状況が誰かに押し付けられている場合、常に生き残ることはできません。大学であっても、すべてのエンジニアリング学生がMATLABの計算思考に慣れるわけではありません。


2
私はこれらの解決策を知っていますが、それらはかなり後方に見えます。MATLABをC ++、Javaなどから呼び出したいのですが、その逆ではありません。MATLAB以外を「ドライバー」言語にしたいです。
-dsimcha

2
@dsimchaあなたはC.を参照してくださいからMATLABやRのライブラリを呼び出すことができますmathworks.com/help/techdoc/matlab_external/f38569.htmlまたはmath.univ-montp2.fr/~pudlo/R_files/call_R.pdf
チャールズ・E・グラント

0

私は、MATLAB、Python、C(および場合によってはC ++)を使用しており、自分は(主に)ソフトウェア開発者であり、データサイエンティスト、数学者、または他のドメインスペシャリストであることが多い同僚と向かい合っています。

CやPythonの意味で汎用プログラミング言語ではないことを最初に認めますが、実際には、特に時系列分析や画像処理などの目的で、MATLABでスクリプトを書くことをかなり楽しんでいます。

この言語にはいくつかの機能がありますが、これらは一般に非常に非効率的に実装されていますが、使用するのは楽しいものです。たとえば、論理インデックスを作成します。関心領域を選択する論理ベクトルまたはマトリックスを作成し、「isInROI」という名前を付けて、その領域のベクトルまたはマトリックス「data」から要素を選択するフィルター操作を実行できます次に、単に「roiData = data(isInROI)」と書くだけです。

このような瞬間に、MATLABに本当に感謝し、他の多くの議論された罪を見落とすことができます。


numpyのは、同様に論理的なインデックスを持っている。なお:docs.scipy.org/doc/numpy/user/...
jarondl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.