Main Content

validateattributes での関数入力のチェック

関数 validateattributes を使用して、関数への入力が一連の要件を満たすかどうかを確認します。

validateattributes ではチェックする変数と、その変数でサポートされるデータ型を渡す必要があります。オプションとして、有効な次元や値を記述する一連の属性を渡します。

データ型および他の属性のチェック

checkme.m というファイルに、最大で次の 3 つの入力を受け入れる関数を定義します。abc。次の項目を確認します。

  • a が正の倍精度値の 2 次元配列であるかどうか

  • b に 100 個の数値が 10 列の配列として含まれているかどうか

  • c が空でない文字ベクトルまたは cell 配列であるかどうか

function checkme(a,b,c)

validateattributes(a,{'double'},{'positive','2d'})
validateattributes(b,{'numeric'},{'numel',100,'ncols',10})
validateattributes(c,{'char','cell'},{'nonempty'})

disp('All inputs are ok.')

中かっこ {} は、データ型のセットと追加の属性のセットが cell 配列に格納されていることを示します。cell 配列では、テキスト データと数値データの組み合わせや長さの異なる文字ベクトルを 1 つの変数に格納できます。

有効な入力を指定して checkme を呼び出します。

checkme(pi,rand(5,10,2),'text')
All inputs are ok.

size(pi) = [1,1] なので、スカラー値 pi は 2 次元になります。

無効な入力を指定して checkme を呼び出します。検証に失敗した最初の入力が見つかると、関数 validateattributes によりエラーが出され、checkme は処理を停止します。

checkme(-4)
Error using checkme (line 3)
Expected input to be positive.
checkme(pi,rand(3,4,2))
Error using checkme (line 4)
Expected input to be an array with number of elements equal to 100.
checkme(pi,rand(5,10,2),struct)
Error using checkme (line 5)
Expected input to be one of these types:

  char, cell

Instead its type was struct.

既定のエラー メッセージでは、汎用語である input を使って検証に失敗した引数を参照します。既定のエラー メッセージを使用する場合、どの入力が検証に失敗したかを判断するには、checkme 内の指定されたコード行を確認する以外に方法はありません。

エラー メッセージへの入力名と位置の追加

checkdetails.m というファイルに、checkme と同じ検証を実行し、さらにエラー メッセージに入力の名前と位置に関する詳細を追加する関数を定義します。

function checkdetails(a,b,c)

validateattributes(a,{'double'},{'positive','2d'},'','First',1)
validateattributes(b,{'numeric'},{'numel',100,'ncols',10},'','Second',2)
validateattributes(c,{'char'},{'nonempty'},'','Third',3)

disp('All inputs are ok.')

validateattributes への 4 番目の入力である空の文字ベクトル '' は、オプションの関数名のプレースホルダーです。関数名はエラー メッセージに既に記載されているので、指定する必要はありません。追加のエラー処理を行うためエラー識別子に関数名を含める場合は、関数名を指定します。

無効な入力を指定して checkdetails を呼び出します。

checkdetails(-4)
Error using checkdetails (line 3)
Expected input number 1, First, to be positive.
checkdetails(pi,rand(3,4,2))
Error using checkdetails (line 4)
Expected input number 2, Second, to be an array with
number of elements equal to 100.

参考

|