Matlabで自作関数をオーバーロード

このQ&Aのポイント
  • Matlabの組み込み関数の中には、引数の数や戻り値の数に応じて異なる作用をするものが沢山あると思います。
  • 自分で作成した関数をオーバーロードすることは可能ですか?
  • 例えば、同じ関数名でも呼び方に応じて異なった操作をさせることはできないでしょうか?
回答を見る
  • ベストアンサー

Matlabで自作関数をオーバーロード

Matlabの組み込み関数の中には、引数の数や戻り値の数に応じて異なる作用をするものが沢山あると思います。 例えば組み込みのmax関数だと y=max(x) ならxの第一次元にについての最大値を返しますし、 [y,i]=max(x) なら、さらに i に最大値のindexを代入、 一方 x=max(x,y) ならx,yの各要素について大きい方を取った行列を、 x=max(x,[],d) ならxのd次元についての最大化をしてくれます。 質問ですが、そういう関数を自分で作ることは可能ですか? function [z,w]=f(x,y) という風に関数を定義してしまうと、たとえyを関数中で利用しない場合でも、引数yを指定しなければエラーになってしまいます。同じ関数名でも呼び方に応じて異なった操作をさせることはできないでしょうか?

  • incd
  • お礼率37% (24/64)

質問者が選んだベストアンサー

  • ベストアンサー
  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.1

MATLABには、関数のオーバーロードという概念はありません。 組込み関数を覗いてみると分かりますが、複数の組合せの引数を許容している関数は、関数側の引数がCell型になっています。 そのような関数の詳細な作成方法は、実際にmsgbox.mなど該当する関数のソースコードを見て確認する方が早いと思います。 MATLABの組込み関数のソースファイルは、インストールフォルダのtoolboxフォルダ以下にあります。

incd
質問者

お礼

ありがとうございます!早速試してみます。

その他の回答 (1)

  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.2

書き忘れましたが、戻り値の方は呼び出し側が全て受け取らなくても問題ありません。 ですので、max関数を例に挙げれば、おそらく関数定義は以下のようになっていると思います。 function [value, index] = max(varargin) もしくは function [varargout] = max(varargin) ■ varargin, varargout http://dl.cybernet.co.jp/matlab/support/manual/r13/toolbox/matlab/ref/?/matlab/support/manual/r13/toolbox/matlab/ref/varargin.shtml

関連するQ&A

  • matlabにおける行列の格納

    matlabにおける質問です。 (matlabもとよりプラグラミング初心者です。) 例えばx=[1 2 3;3 4 5]となっているとき for i=1:10 y(1)=i*x end のように、しても、y(1)とxの次元が合わないというエラーが 出ると思います 行列を、このように「i番目」といった添え字のついた変数に 代入するには、どうしたらよいのでしょうか。 初心者のため大変初歩的なことですが、どなたかご教授ください。 とても焦っております。。。

  • Matlabのspdiags関数

    Matlabのspdiags関数に関してわからないところがあります。以下はMatlabのヘルプWebページから持ってきた例です。http://dl.cybernet.co.jp/matlab/support/manual/r2006/toolbox/matlab/math/?/matlab/support/manual/r2006/toolbox/matlab/math/sparse4.shtml B = [ 41 11 0 52 22 0 63 33 13 74 44 24 ]; d = [-3 0 2];、m=7, n=4のとき A = spdiags(B,d,7,4) A = (1,1) 11 (4,1) 41 (2,2) 22 (5,2) 52 (1,3) 13 (3,3) 33 (6,3) 63 (2,4) 24 (4,4) 44 (7,4) 74 これに対応するフル行列Aは、つぎのようになります。 full(A) ans = 11 0 13 0 0 22 0 24 0 0 33 0 41 0 0 44 0 52 0 0 0 0 63 0 0 0 0 74 mやnというのはfull(A)がm行n列の行列であるというイメージの対応がわかるのですが、d = [-3 0 2]とfull(A)の行列の関係がわかりません。-3,0,2というのはfull(A)のどこを見れば良いのでしょうか。

  • matlabのquadl関数について

    matlabのquad,quadl関数についての質問です pを1*nのデータとして func1 = @(eta) (eta.^10).*((1-eta).^(10))./(prod(p.*eta+(1-p).*(1-eta))); K=quadl(func1,0,1); を計算したいのですが、 エラー ==> times 行列の次元は同じである必要があります となってしまいます。 多分prodがいけないと思うのですが、pの要素が多いため(p(i)*eta+(1-p(i))*(1-eta))のように全部書き下すことができません。 どう直せばよいのでしょうか

  • matlab計算について

    matlab独学で進めていますが、時間がないのと頭が足りないので 質問させていただきます。 p1=0.1; p2=2.663*10^6; D= 1:10:1000; A=(log(D)+12.7)/1.1; f(D)=(1/power((2*pi),0.5)*1.1*D)*exp(-0.5*power(A,2)); Y=(p/pash*4/3*pi*power((D/2),3))*f(D) plot(D,Y) X軸がD、Y軸がf(D)のグラフを作成したいです。 内部行列の次元は一致しなければなりません。 とエラーが出ます。このエラーの原因を教えてください。 間違いだらけかもしれませんが...ご指摘よろしくお願いします。

  • 関数の作り方について

    今、4次元正方行列Lの1ノルムを求めるプログラムを作っています。 1ノルムを求めること自体は、各列の総和を取って最大値を求めるプログラムを作るだけなのでこれで合ってると思うのですが、複数の行列のノルムを求めるとき #include<stdio.h> int main() { int i,j,k; double l[4][4],u[4][4];/*L,Uは既知の上下三角行列とする*/ double lnorm,unorm,bnorm,max; /*L,Uそれぞれのノルムを求める。*/ norm=0; max=0; for(i=0;i++;i<4)/*Lの1ノルムを求める*/ { for(j=0;j++;j<4) { norm = norm + l[i][j]; } if(norm >= max){ max=norm; } norm=lnorm; } for(i=0;i++;i<4)/*Uのノルムを求める*/ { for(j=0;j++;j<4) { norm = norm + u[i][j]; } if(norm >= max){ max=norm; } norm=unorm; } bnorm=0; のようにLとUで同じ内容のfor文を2回使ってやってるんですが 代入値が行列の場合でも関数を使ってうまくできるやり方はありませんか?

  • MATLAB 行列の抽出

    私はMATLAB初心者なのですが,行列の抽出ができなくて困っております. やりたいこととしては,for文を用いて行列x_r(41×3行列)がode45によって次々と求められるので,そのつどそのつど(i=1のときから1=10のときまで)でx_r(1)の値を新しい行列pに保存していきたいのですが上手くいきません.わかる方がいらっしゃいましたらご教授お願いします. for i=1:10 [t,x_r]=ode45('...',[0.01],x_r); ..... p(:,i)=x_r(:,1); …(1) ..... end 上の(1)のように行列pにi=1~10までのときのそれぞれのx(i)(41×1行列)の値を保存しようとしましたがうまくいきません. p=(x(1)_i=1,x(1)_i=2,x(1)_i=3,・・・・,x(1)_i=10) (41×10行列)(やりたいことのイメージ) エラーメッセージは「添字による代入の次元が一致しません。」と出ています.

  • プログラミング 関数の問題について

    どうもお世話になってます。プログラミングの問題ですが問題を見てもよく分らないので答えを教えてください。 double型の数値を引数にして呼び出されたら、それまでに渡された数値の最大値を返す関数 double maxd(double)を完成しなさい。 (1)maxd((2) x) {(3) int i=0; (4)double max; if((5)){ (6); (7); }else if((8))(9); return((10)); } 知り合いに聞いてみたところ (1)double(2)double(3)static(4)static(5)i=0(7)max = x(8)max < x(9)max = x(10)max と言われて説明してもらったのですが、説明してもらってもよく分りませんでした・・・。(そもそもプログラミング分かってないのですが・・・。) 答えだけ聞くのは本末転倒なのですが、上の答えで合っているのでしょうか?もし違っていたら申し訳ないですが正しい答えを教えてください。よろしくお願いします。

  • Excelで2次関数の頂点の座標を求める方法

    Excelで2次関数の最大値の頂点の座標を求める方法を教えて頂けないでしょうか。 y軸の値について最大値を出すためにはMax関数を使用すれば出ますが、その時のx軸の値を求める関数が分かりません。 例えば、以下のデータがあったとします。 Maxコマンドを使用すると最大値のy軸の値は「8」とでますが、そのときのx軸の値 が抽出できればと、この時のx軸の値は「3」と出したいのですが、関数が分かりません。 ご教授お願いいたします。 x y 0 0 1 2 2 4 3 8 4 4 5 2 6 0

  • matlabに関する質問です.

    タイトルの通りmatlabに関する質問です. matlabの組み込み関数ndgridにつきまして,[X1,X2,...,Xn] = ndgrid(x1,x2,...,xn)のように入力をx1,x2,...,xnと増加させると出力もX1,X2,...,Xnと増加するのですが,任意の入力数(セル配列で入力)に対して出力側も任意の出力数に対応させたいのですが [Xn_cell{:}] = ndgrid(xn_cell{:})としてもエラーが出てしまい上手く出来ません. 何か良い方法はありませんでしょうか. ご教授の程,宜しくお願いいたします.

  • matlab matファイルから一部だけを読み込む

    Matlab初心者です、よろしくお願いします。 Matlabでn×m行列のデータが入っているmatファイルからx×y行列のデータを変数に読み込みたいのですが、どうすれば良いのでしょうか? ご教授していただけると助かります。 よろしくお願いします。

専門家に質問してみよう