web-dev-qa-db-ja.com

ハードコアプログラマーとしてのMATLABおよびRの存続

筋金入りのプログラマー向けの言語でのプログラミングが大好きです。 (私のお気に入りはPythonおよびDです。)MATLABはエンジニア向けで、Rは統計学者向けであり、これらの言語はハードコアプログラマーではなく、筋金入りのプログラマーのように考えます。私は常にそれらを使用するのがやや厄介だと思っており、その理由をある程度理解することはできません。

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

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

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

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

25
dsimcha

全般的なプログラミングや、汎用言語を使用した一般的なプログラムのプログラミングに必要な考え方でドメイン固有の言語にアプローチすることは、おそらく悪い考えです。ドメイン固有であるため、最も効率的に使用するには、より急な学習曲線と不快な考え方を必要とする可能性があります。 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固有の作業を行う方法を探すことを思い出してください。
30
blueberryfields

この前置きとして、MATLABに精通しているが、Rには精通していないことに注意してください。

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

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

科学者やエンジニアが行列の乗算やODE計算を非常に高速に行えるように設計されているため、MATLABは非常に不自然です。 MATLABは、「ハードコア」言語の定義に合わせて測定することはありませんでした。 PythonまたはDの観点からMATLABについて考えようとすることは、Cの観点からLISPまたはHaskellについて、またはJavaScriptの観点からVerilogおよびVHDLについて考えようとするようなものです---それらはさまざまな問題を解決し、根本的に異なる方法で問題解決に取り組みます。公平を期すために、MATLABは、ドメイン固有の言語の観点からでも、頭を包むことができないいくつかの(そう、多くの)奇妙な言語設計の選択を行いました。しかし、天文学者が天体Xが48.0 AUではなく、天体Yからちょうど48 AU離れていることに注意を払う必要がある特別な理由はありません。すべての科学的測定値にはエラーが含まれており、(平均的なMATLABユーザーの観点から)与えられた量は整数であり、小さな分数成分を持つ実数ではありません。

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

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

25
Hoa Long Tam

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

Rに対する深刻な批判を読みたければ、Rのデザイナーの1人であるロス・イハカの this piece を読むとよいでしょう。 useDよりもdesignRの方がコアはかなり難しいようですまたはPython。

15
wvoq

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

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

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

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

ハッシュテーブルや「実際の」、つまり型パラメトリックでネスト可能な配列などの基本的なデータ構造をサポートしていない、または扱いにくい。

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

コードをベクトル化するために逆方向に曲がらない限り、インタープリタード言語の標準によっても、速度は非常に遅くなります。

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

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

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

オブジェクトの向きは非常にボルトで固定されているようです。はい、できますが、CのOOよりも慣用的には感じられません。

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

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

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

1つのファイルに複数の最上位関数を配置することはできません。非常に長い関数とカットアンドペーストコーディングが推奨されます。

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

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

彼らはします。 _int8_、_int16_、_int32_および_int64_を参照してください。

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

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

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

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

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

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

9
Richie Cotton

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

それらの使用が必要です

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

残念ながら、私の個人的な意見では、この状況が誰かに強制されている場合、それは常に生き残ることができるとは限りません。大学であっても、すべての工学系の学生がMATLABの計算方法に慣れるわけではありません。

3
rwong

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

CまたはPythonがそうであるという意味で、それが汎用プログラミング言語ではないことを認める最初の人ですが、実際には、特に時系列分析または画像処理。

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

このような瞬間が本当に私にMATLABを高く評価させ、他の多くの議論されている罪を見逃すことを可能にします。

0
William Payne