4

pols[theta, rho, z] のベクトルを含む列行列があるとします。つまり、そのようなベクトルが 9 つある場合、9x3 の行列になります。それらのいずれかを次のような関数にフィードできるため、それらをそのように配置すると非常に便利ですpol2cart

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

特定のベクトルについて、インデックス 1、2、3 を介してそのコンポーネントを見つけることができます。

rho5 = pols(5,2);

ただし、マトリックスが実際には別のより広いマトリックス内にある場合があり、上記が次のようになるように、最初ではなく中間にある可能性があります。

rho5 = pols(5,6);

他の誰かがコードを保守しなければならない場合にコードを読みやすくするために、一意の名前でインデックスを参照する方法はありますか? お気に入り

rho5 = pols(5).rho;

.rhoここで、rho の値を持つ列にマップすることを以前に定義できました。

行列をセルに変換してから and を使用して配列に変換することに挑戦しましたmat2cellcell2struct、実用的ではないようです。または、構造体の配列を作成することもできますが、実行する能力を失い、pol2cart(pols)代わりに実行する必要があります

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

質問を繰り返します: インデックスを一意の名前にマップできますか?

4

3 に答える 3

3

デフォルトの MATLAB データ型については、いいえ、実際にはできません。ただし、独自の新しいデータ型 (つまり、クラス オブジェクト) を作成して、データを格納することもできます。クラス定義内でsubsrefメソッドをオーバーロードして、添字付き参照 (つまり()、 、{}、またはを使用.) が新しいオブジェクトに対してどのように動作するかを定義します。これは、オブジェクトの配列を扱う場合にはややこしくなりますが、可能です。

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

...そして、これにより、現在の状況に対するより簡単な解決策が得られます。まったく新しい型のクラス オブジェクトを作成する代わりに、構造体配列 (または配列のスカラー構造) を作成してデータを格納し、構造体データ型pol2cart専用の新しいオーバーロード関数を作成して、呼び出し構文を簡素化することができます。

組み込みデータ型の関数のオーバーロードの詳細については、他の 2 つの回答herehereで説明しています。つまり、 というフォルダーを作成し、 MATLAB path@struct上のフォルダーに配置します。このフォルダーに、このオーバーロードされた関数を配置します。@struct

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

これは関数の簡素化されたバージョンであり、入力のエラー チェックなどがないことに注意してください。では、サンプル データを作成してみましょう。

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));

rhoそして、次のように 5 行目の値にアクセスできます。

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

そして、次のように、それぞれが同じ結果を返すことを確認できます。

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

ans =

     1   %# True!
于 2012-04-19T18:47:05.330 に答える
1

OK、上記のウッドチップで与えられたように、正式な答えはおそらく「いいえ」です。ただし、どうしてもそのようなことをしたい場合は、セミハックを使用できる場合があります。具体的には、クラスを定義し、演算子をオーバーロードして、(ほぼ) 目的を達成することができます。残念ながら、Matlab ではオーバーロードが許可されていないため.、他の演算子を使用する必要があります。(以下の編集を参照)

アイデアを提供するために、行列の i 番目の行を で返すクラスを次に示しMますM^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

于 2012-04-19T18:14:23.963 に答える
0

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

于 2012-04-19T15:44:55.970 に答える