2010-11-21 5 views
18

Cのn長配列のインデックスは0:N-1です。一方、MATLABでは1:NMATLABでゼロベースのインデックスが使用されています

です。これで、Cスタイルのインデックス作成がより快適になりました。従来の1:Nインデックス作成ではなく、Cスタイルのインデックス作成を採用するために、MATLABスクリプトなどにいくつかのコマンドを含めることによって、MATLABに指示する方法はありますか?

+4

定期的にMATLABを1つのクラスに使用しなければならない人として、これがどれくらいの可能性があるのか​​を私はあなたに伝えることはできません。それは 'var ++ 'を行うことができますが、まあ、MATLABには場所があり、その場所は深刻な非数学プログラミングではありません。 –

+1

コードを壊さずにMATLABにそのような機能を追加するのは興味深い作業かもしれません。 – zellus

+8

@zellus - "興味深い定義" ; 「ああ、神様、私たちはすべて死ぬつもりだよ」 – Donnie

答えて

10

ない、と私は違いは数学者がMATLABは、数学者に適していないことを1(から数え始めるという事実から生じると信じて、逆にそれが使用されています(記号処理がより強力なMathematicaやMapleに比べて)

MATLABに似ていますが、MATLABに似ている場合は、PythonパッケージのNumPy and SciPyを参照してください。

また、ゼロベースと1つのベースのインデックス作成についてはWhy numbering should start at zero、MATLAB固有の説明についてはMATLAB indexing issueを参照してください。これについては、https://plus.google.com/115212051037621986145/posts/YTUxbXYZyfiを参照してください。

+0

wikipediaの素晴らしい概観:http://en.wikipedia.org/wiki/Comparison_of_programming_languages_(array) – zellus

+0

これらのリンクは有益でした。どうもありがとうございました! – smilingbuddha

+5

私は数学者であり、私は0から数えます。(もっと真剣に言えば、数学者はt = 0、t = 1などで時間をインデックスするために使用されます)Matlabは数値解析(微分方程式) – Legendre

3
一言で

:なし...

9

あなたは潜在的にあなたがのためにインデックス・スキームを変更することを(ビルトインまたはユーザ定義)のオブジェクトのすべての異なるタイプの機能SUBSREFSUBSASGNをオーバーロードすることにより、このような何かを行うことができます。組み込み型のメソッドをオーバーロードする方法の例は、my answerthis questionです。欠点は?...

  • これは大規模で危険な仕事です。
  • 1ベースのインデックスに依存する組み込み関数をすべて破ります。つまり、ほとんどのMATLABを基本的に書き直す必要があります。
  • from other MATLAB usersを使用する可能性のあるコードは、1ベースのインデックスにも依存しますが、書き直す必要があります。要するに

ビルトイン種類がインデックスにもリモートで実行可能ではありませんどのように処理するか変更します。しかし、subclassing in MATLAB's OOP systemを使用して別の(しかし、やや危険な)オプションがあります。そして、あなたは、ゼロベースのインデックスを取るSUBSREFSUBSASGNの特別な実装でdouble_zbを拡張することができ

classdef double_zb < double 
    methods 
     function obj = double_zb(data) 
     if nargin == 0 
      data = 0; 
     end 
     obj = [email protected](data); % initialize the base class portion 
     end 
    end 
end 

:たとえば、ビルトインdoubleクラスから継承する新しいクラスdouble_zbを作ることができます。しかし、doubleオブジェクトの代わりにdouble_zbオブジェクトを効果的に使用すると、doubleオブジェクトの他のすべてのメソッドを再実装するか、またはdoubleメソッドを使用してdouble_zbオブジェクトを使用するコンバーターメソッドを実装する必要があります。私はこれを行うことに関わるすべての細部についてもわからないが、確かにそれは巨大な頭痛になると言うことができる。

私の究極のアドバイス...心配しないで、1ベースのインデックス作成を愛する方法を学んでください。 ;)

+8

"この記事を読んでいるときにJW Goetheの「The Sorcerer's Apprentice」 – zellus

+0

最初に指摘したようにSUBSREFとSUBSASGNをオーバーロードすると、0ベースのインデックスを使用するたびにグローバル論理変数を設定できず、 SUBSREFとSUBSASGNがその変数をチェックし、存在しない場合は古典的な1ベースのインデックスを使用しますか?;-) –

6

実際には、Matlab ではゼロベースのインデックスを使用します。それらは、 (残念なことに、あまり優先度が低く、むしろあくまでも と記載されている)接頭語演算子「1+」、すなわち、

(1+(0:M))

ソース: http://www.mathworks.com/matlabcentral/newsreader/view_thread/11510

私が思う "1+" 1ベースの世界に住んでPPLから来た:1をベースにするために1を追加しますインデックス。

+9

これはゼロベースのインデックスではありません。 '1 +'はベクトル '(0:m)'のすべてのエントリにスカラー値1を加算するだけで、 'a'を索引付けするために使用される1ベースのインデックス' 1:(m + 1) 。 – gnovice

+7

真実ですが、ゼロベースの式に視覚的にマッチさせるコードが必要な場合は、 – acjay

2

私はMatlabを数学に使用しています。私たちは "start at time = 0"をたくさん使用します。私は時間0,1,2のYの値を表す配列y = [0,1,2,3,4]を持っている場合、例えば、

time(x) = x + 1 

:これに対する私の解決策は、関数を作成することでした、3,4。 0は、このようにすべての私の方程式を変更すること回避の正しい結果を生成

y(time(0)) 

:私はこれを行うことができます。

関連する問題