主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

numArgumentsFromSubscript

カスタマイズされたインデックス手法の引数の数

説明

n= numArgumentsFromSubscript (obj年代indexingContextは,subsasgnへの必要な入力数またはsubsrefからの必要な出力数を返します。

返されたインデックス式から出力される値の数や,コンマ区切りのリストに代入する値の数を記述するには,numArgumentsFromSubscriptをオーバーロードします。これは,“{}”または“。”インデックスで終了するインデックス式です。関数numArgumentsFromSubscriptを使用すると,次のような処理ができます。

  • インデックス式に使用されるインデックス演算とインデックスにアクセスする

  • インデックス演算が参照ステートメント,関数に渡された式,あるいは代入のどのコンテキストで処理されるかを判別する

クラスがnumArgumentsFromSubscriptをオーバーロードする場合,MATLAB®がこれを呼び出して,要素数が1より大きい場合にインデックス演算に使用される配列要素の数を判別します。たとえば,次の“。”インデックス演算ではnumArgumentsFromSubscriptの呼び出しが行われます。

  • objArray.a——ステートメント(声明)で参照される要素の数

  • func (objArray.a)——式で返される要素の数(表达式

  • [objArray。) = rhs——コンマ区切りのリスト(赋值)で代入される値の数

MATLABは,呼び出しコンテキストを使用してnumArgumentsFromSubscriptで返された値を適用するかどうかを判断します。numArgumentsFromSubscriptの実装方法によって,3種類のインデックス付けステートメントにそれぞれ異なる出力を提供できます。たとえば,numArgumentsFromSubscriptのこのオーバーロードでは次が行われます。

  • 関数に渡されるインデックス式についてsubsrefからの出力引数の想定される数を変更します。

  • インデックス演算に必要な引数の数を判別するには,インデックス付けサブ構造体年代を使用します。

函数n = numArgumentsFromSubscript (obj,年代,indexingContext)如果indexingContext == matlab.mixin.util.IndexingContext.Expression n = 1;其他的n =长度(s (1) .subs {:});结束结束

subsrefメソッドをvarargout出力を使って実装し,MATLABが指定された出力引数の数を使用してこのメソッドを呼び出せるようにします。

函数varargout = subsref (obj,年代)...结束

すべて折りたたむ

オブジェクトプロパティのインデックスとして単語を使用します。

既定では,MATLABは文字配列内の各文字を個別の要素として扱います。したがって、MATLABは文字配列のインデックスを複数のインデックス値として解釈します。

numArgumentsFromSubscriptをオーバーロードしない場合,キーワードインデックス付けのステートメントが要求する引数がsubsrefおよびsubsasgnメソッドに対して過多になります。文字配列を1つのキーワードとして使用するインデックス付けを実装するには,参照または代入される要素数として1を返すnumArgumentsFromSubscriptメソッドを定義します。

numArgumentsFromSubscriptをオーバーロードして,以下のようなインデックス付きの参照および代入をサポートします。

文字配列を使用したインデックス参照:

obj {关键字

関数の引数でのインデックス参照:

func (obj {关键字})

オブジェクト配列へのコンマ区切りリストの代入:

(obj {关键字}] =右边值;

このような場合,subsrefsubsasgnは,呼び出しコンテキストに基づいて必要な出力引数および入力引数の数を判別することができません。この情報は関数numArgumentsFromSubscriptを使用して提供します。

2つのプロパティをもつクラスKeyIndexを定義します。KeyCellにはキーの名前を格納し,DataArrayには対応するデータを格納します。インデックス付けをカスタマイズするには,次を行います。

  • 指定のキーワードに対応するデータ値を返すsubsrefメソッドを実装します。

  • 指定の値をDataArrayプロパティの対応する要素に代入するsubsasgnメソッドを実装します。

  • numArgumentsFromSubscriptをオーバーロードして,1の値か,オブジェクト配列の場合はスカラーオブジェクトと元素个数(objArray)の値を返します。

月の名前を含む细胞配列をKeyCellプロパティとして指定します。DataArrayプロパティに,それぞれ対応する月の降雪量を示す数値配列を指定します。

snow15 = KeyIndex ({“1月”2月的“3”}, [36 42 2])
snow15 = KeyIndex with properties: KeyCell: {'Jan' ' 'Feb' 'March'} DataArray: [36 42 2]

キーワードを使用して,特定の月の降雪量を参照します。

snow15 {2月的
ans = 42

“{}”インデックス付けでキーワードを使用して,対応する要素に代入します。

snow15 {2月的} = 52个;

すると,キー2月的に対応する値が変更されます。

snow15 {2月的
ans = 52

2年間の降雪量データを含む配列を作成します。

snow14 = KeyIndex ({“1月”2月的“3”}, (12 8 2));sTotal = [snow14, snow15];

各年度の2月の降雪量を求めます。

sTotal {2月的
Ans = 8 Ans = 52

両方の年度の2月の降雪量の値を更新します。细胞配列内のインデックス付けにより,コンマ区切りリストが返されます。

c {1} = 34;c {2} = 56;[sTotal {2月的{}] = c:};

KeyIndexクラスは次のようになります。このクラスは特定のプログラミング手法を示すものです。通常のクラスで必要とされるエラー検査やその他の機能は含まれていません。

classdefKeyIndex属性KeyCell DataArray结束方法函数obj = KeyIndex(键,数据)如果Nargin > 0 obj。KeyCell =关键;obj。DataArray =数据;结束结束函数n = numargumentsfrom下标(obj,~,~) n = nummel (obj);结束函数Varargout = subsref(obj,s)开关(1) .type情况下“{}”varargout =细胞(1);j = 1:k = 1:元素个数(obj (j) .KeyCell)如果strcmp(s.s subs(:),obj(j).KeyCell{k}) varargout{j} = obj(j).DataArray(k);结束结束结束情况下“。”varargout ={内装式(“subsref”obj s)};情况下“()”varargout ={内装式(“subsref”obj s)};结束结束函数Obj = subsgn (Obj,s,varargin) a = numel(varargin);开关(1) .type情况下“{}”j = 1:k = 1:元素个数(obj (j) .KeyCell)如果比较字符串(s.subs (:), obj (j) .KeyCell {k}) obj (j) .DataArray (k) =变长度输入宗量{};结束结束结束情况下“。”obj =内装式(“subsasgn”obj,年代变长度输入宗量{:});情况下“()”obj =内装式(“subsasgn”obj,年代变长度输入宗量{:});结束结束结束结束

要素や配列ごとのプロパティのインデックス付けをサポートするクラスを定義します。

関数numArgumentsFromSubscriptにより,クラスで特定のプロパティへの参照をカスタマイズできるようになります。numArgumentsFromSubscriptに渡されるインデックス付けサブ構造体引数(年代)には,ドットインデックス式で参照されるプロパティの名前(つまりobj。PropertyNameという形式の参照)を含めます。numArgumentsFromSubscriptはこのインデックス付けサブ構造体を使用して,任意のプロパティについて一意の値を返すことができます。

PerArrayクラスは,インデックス付けサブ構造体の情報を使用して,各プロパティ参照の出力の数を指定します。

numArgumentsFromSubscriptをオーバーロードして次を返します。

  • ByElementプロパティの値のコンマ区切りリスト。配列の各要素につき1つの値を返します。

  • 配列全体につき,単一のByArrayプロパティ値。

PerArrayオブジェクトの配列を作成します。

k = 1:4 pa(k) = PerArray(rand(k));结束

プロパティ値のコンマ区切りリストを返すには,ByElementプロパティをクエリします。

pa。ByElement
Ans = 0.9293 0.6160 0.5853 0.7572 0.3500 0.4733 0.5497 0.7537 0.1966 0.3517 0.9172 0.3804 0.2511 0.8308 0.2858 0.5678

配列全体に対して1つの値を返すには,ByArrayプロパティをクエリします。

pa。ByArray
ans = 3.1416

PerArrayクラスは次のようになります。このクラスは特定のプログラミング手法を示すものです。通常のクラスで必要とされるエラー検査やその他の機能は含まれていません。

classdefPerArray属性ByElement结束属性(常量)ByArray = pi;结束方法函数obj = PerArray(是)如果Nargin > 0 obj。ByElement =;结束结束函数n = numargumentsfrom下标(obj,s,indexingContext)导入matlab.mixin.util.IndexingContext如果(indexingContext ~ = IndexingContext.Assignment)如果长度(s) < 2开关(s.subs (:))情况下“ByElement”n =元素个数(obj);情况下“ByArray”如果比较字符串(s (1) .type,“。”n = 1;结束结束elseif> 1 n = Length ([s(1).subs{:}]);结束结束结束函数varargout = subsref (obj,年代)开关(1) .type情况下“。”varargout =细胞(1,元素个数(obj));k = 1:元素个数(obj) varargout {k} = obj (k)。(s.subs (:));结束情况下“()”如果长度([s(1).subs{:}]) > 1 ind = [s(1).subs{:}]numInd =长度(印第安纳州);varargout =细胞(1、numInd);k = 1: numInd varargout {k} = obj(印第安纳州(k)。(s (2) .subs (:));结束其他的varargout ={内装式(“subsref”obj s)};结束结束结束结束结束

入力引数

すべて折りたたむ

インデックス演算で使用されるオーバーロードクラスのオブジェクト。このオブジェクトのクラスによって,インデックス演算の結果としてMATLABが呼び出すsubsrefまたはsubsasgnメソッドが決まります。

特定のインデックス式に関する情報を含む,インデックス付け構造体またはインデックス付け構造体の配列。各構造体には2つのフィールドがあります。

  • 类型——インデックス式は“()”“{}”“。”のいずれかを使用できます。

  • 潜艇——添字の値(プロパティ名またはインデックス番号の细胞配列)

データ型:结构体

結果が適用されるコンテキスト。次のいずれかの列挙値として指定します。

  • matlab.mixin.util.IndexingContext.Statement——ステートメントとして使用されるインデックス付き参照(obj.a

  • matlab.mixin.util.IndexingContext.Expression——関数の引数として使用されるインデックス付き参照(func (obj.a)

  • matlab.mixin.util.IndexingContext.Assignment——インデックス付き代入((obj。一个= x

出力引数

すべて折りたたむ

オーバーロードされるsubsrefで返される引数の数か,オーバーロードされるsubsasgnに渡される引数の数。numArgumentsFromSubscriptをオーバーロードして,そのクラスで各種のインデックス付けシナリオに必要とされる値を返します。

ヒント

  • オーバーロードされたsubsrefおよびsubsasgnからの結果を制御するには,元素个数の代わりにnumArgumentsFromSubscriptをオーバーロードします。numArgumentsFromSubscriptをオーバーロードすることで,元素个数のオーバーロードに起因するエラーを回避できます。

R2015bで導入