3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MATLABでキーワード引数をつかうには

Last updated at Posted at 2021-04-21

概要

調べた限りでは,MATLABでは位置引数による代入しかなく,Pythonにあるキーワード引数がないっぽいです.(R2021a現在.実はあるとかだったらコメント欄で教えてくださいm(_ _)m)
のでキーワード引数による代入を無理やりしてみました.

その前に 「位置引数」「キーワード引数」

通常,関数に値を代入する時,関数側で定義された順番で変数に値が渡されます.(位置引数)

↓Pythonの例

def Subtract(a, b):
    return a - b
Subtract(4, 3)

この場合,aに4が,bに3が渡されて,値1が返ってきます.

Subtract(b=5, a=9)

しかし,= を使って,bに5を代入して,aに9を代入してやるんだ!
とすれば,a, bにそれぞれ9, 5が代入され,値4が得られます.
このように,= を使って,代入先の変数とその値を紐づけて指定してあげるこの引数を,
キーワード引数と言います.

この機能がMATLABにはないため,MATLABでもこれっぽいことを無理やりしたのが,以下の内容です.

成果

がこちらです.

function Subtract(a, b, varargin)

if nargin > 2 %関数へ渡された値が3つ以上ある時 True
    for i = 1:size(varargin, 2) 
        c = cell2mat(varargin(i));
        eval(c)
    end
end
a - b

end

例1

Subtract(4, 3)

1が出力されます.

例2

Subtract(0, 0, 'b=5', 'a=9')

4が出力されます.

説明

vararginは,関数に渡された値の中で,余ったものを全部格納する変数です.詳しくは以下のドキュメンテーションを見てください.
MATLAB documentation : 可変長の入力のサポート

また,evalはStringやchar等の文字をコードとして実行する関数です.
MATLAB documentation : MATLAB式を評価する
Pythonのeval関数の解説のページでも貼っときます.
MATLABとPythonのeval関数は機能一緒です.↓の解説の方が100倍分かりやすいです.
TechAcademy : Pythonのeval関数について現役エンジニアが解説【初心者向け】

で,上のコードは,
・値の入力が2つなら,それらを左からa, bへ代入
・値の入力が3つ以上なら,3つ目以降の文字列をコードとして実行
するようになってます.

つまり,例1では上で説明した位置引数による代入され,
そのまま引き算が計算されることで,値1が出力されます.

例2ではa, bにそれぞれ0が代入されたのち,b=5, a=9 のコードが実行されることで,
a, bそれぞれが9, 5に上書きされ, 値4が出力されます.
ちなみに,aとbに0を代入しているのは,エラー回避のためです.

#最後に

既存の関数の入力引数を指定するところの一番右にvararginを追加して,
二行目以降にifの下をコピペして,
if文の条件であるnarginの右の値を調整すれば,
すぐにでも関数をキーワード引数対応にできるかと思います.

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?