2012-04-19 2 views
4

[θ、rho、z]のベクトルを含む列行列polsがあるとします。 これは、9つのベクトルがある場合、9x3の行列になります。私はちょうどpol2cartような関数にそれらのいずれかを供給することができるので それらのような配置有することが非常に便利である。Matlab:配列インデックスを一意の名前で参照できますか?

cart3 = pol2cart(pols(3,:)); 

および特定のベクトルに対して、Iは指標1を介して、そのコンポーネントを見つけることができ、2

rho5 = pols(5,6); 
:、3:上記はなるかもしれないような

rho5 = pols(5,2); 

しかし、時には行列は別の、より広いマトリックス内に実際には、代わりに最初の真ん中にあることができ、

誰かがそれを維持しなければならない場合に備えて、コードをより読みやすくするために、一意の名前でインデックスを参照する必要はありますか?それは、ρの値を持つ列に早くその.rhoマップを定義することができ同様

rho5 = pols(5).rho; 

私は行列に変換してからmat2cellcell2structを使って配列に変換しようとしましたが、実用的ではありません。それとも、私は構造体の配列を作ることができるが、その後、私はpol2cart(pols)を行う能力を失い、代わりそこで質問を繰り返すように

pol2cart(pols.theta, pols.rho, pols.z); 

を行う必要があります。私は、一意の名前にインデックスをマッピングすることができますか?

+1

あなたの最初の行は動作しません。 [POL2CART](http://www.mathworks.com/help/techdoc/ref/pol2cart.html)には、1つのベクトル引数ではなく、2つ(または3つ)の入力引数が必要です。どのバージョンのMATLABを使用していますか? – gnovice

+0

私はMatlabを持っていないので実際にはOctaveでテストしましたが、使用している友人を助けなければなりません。したがって、pol2cartがそのような引数を受け入れない場合、最初の引数は保持されません。それでも、名前を使ってインデックスに対処することができれば便利です。 – syockit

答えて

3

デフォルトのMATLABデータ型では、実際にはできません。ただし、データを保存するにはcreate your own new data type (i.e. class object)とすることができます。クラス定義内では、subsrefメソッドをオーバーロードして、添え字付き参照(つまり、(){}、または.を使用)が新しいオブジェクトに対して動作します。これはオブジェクトの配列を扱うことに関してはやや難解かもしれませんが、可能です。

新しいデータ型で使用するすべての既存関数のオーバーロードされたメソッドを作成する必要があることにも注意してください。具体的には、組み込みのpol2cart関数を引数として渡されたオブジェクトの適切なデータで内部的に呼び出すことができる、オブジェクトのメソッドpol2cartを作成する必要があります。

...これは私の現在の状況のた​​めのより簡単なソリューションに私をもたらします。まったく新しいタイプのクラスオブジェクトを作成する代わりに、データを格納するストラクチャ配列(または配列のスカラー構造)を作成し、呼び出し構文を簡略化するstruct data types用の新しいオーバーロードされたpol2cart関数を作成することができます。

組み込みデータ型のオーバーロード関数の詳細については、別の2つの回答herehereで詳しく説明します。つまり、@structというフォルダを作成し、MATLAB pathのフォルダに配置します。これは今、いくつかのサンプルデータを作成してみましょうなど、入力にエラーチェックをせずに、機能のストリームライニングバージョンであることを

function varargout = pol2cart(polarCoordinates) 
    [varargout{1:nargout}] = pol2cart(polarCoordinates.theta, ... 
            polarCoordinates.rho, ... 
            polarCoordinates.z); 
end 

注:

この @structフォルダの中に、あなたは、このオーバーロードされた関数を置きます
pols = rand(9, 3); %# A 2-D array of data 
polStruct = struct('theta', pols(:, 1), ... %# Convert it to a scalar 
        'rho', pols(:, 2), ... %# structure of arrays 
        'z', pols(:, 3)); 

、次のように、あなたは、5行目のrho値にアクセスできます。

rho5 = pols(5,2); 
rho5 = polStruct.rho(5); 

あなたはデカルトに極性から変換したい場合

[X,Y,Z] = pol2cart(pols(:,1), pols(:,2), pols(:,3)); %# Calls the built-in one 
[X2,Y2,Z2] = pol2cart(polStruct); %# Calls the overloaded one 

そして、あなたは次のように、彼らそれぞれが同一の結果が得られていることを確認することができます:n個の座標が、ここでは、各データ・タイプのためにそれを行うだろう方法ですコードの

>> isequal([X Y Z],[X2 Y2 Z2]) 

ans = 

    1 %# True! 
+0

詳細な回答ありがとう!私はクラスが行く方法だと思う...私はコードの所有者を怖がらせる恐れのためにコードでそれを採用することはできないが、プログラミングやオブジェクト指向のパラダイムに精通していないのではないかと思う。 – syockit

0

いいえできません。それと同じくらい簡単です。

1

OK、正式な答えはおそらく上記のwoodchipsで与えられているように "いいえ"です。しかし、あなたが本当にそのようなことをしたいのであれば、セミハックを使うことができます。具体的には、クラスを定義し、演算子をオーバーロードして(ほとんど)必要なものを達成することができます。 残念ながら、Matlabはオーバーロードが許可されていないことがわかります.、他の演算子を使用する必要があります。(下記を参照してください)

ここでは、行列によってM^iによってi行目を返すクラスがあります。

classdef Test 
    properties 
    M; 
    end 

    methods 
    function this = Test(M) 
     this.M = M; 
    end 

    function res = mpower(this, i) 
     res = this.M(i, :); 
    end 
    end 
end 

そして、それはこのように実行することができます。ご自身の責任で

>> tmp = Test([1 2; 3 4]); 
>> tmp^1 

ans = 

    1  2 

>> tmp^2 

ans = 

    3  4 

使用! :)

編集:

私は上記の間違っていました。 gnoviceの答えで述べたように、subsrefというメソッドを使って実際にカスタムクラスの.演算子を定義することができます。

+0

うわー、それは病気です!私はそれを行うことができることを知っています:)他の人と仕事をしているときには適していないかもしれませんが(なぜこれが理由でオペレータが過負荷にならないのですか?) – syockit

関連する問題