web-dev-qa-db-ja.com

MATLABエラー: 'double'型の入力引数に対する未定義の関数またはメソッドX

私はMatlabの新しいユーザーです、助けてください:
。Mファイルに次のコードがあります。

function f = divrat(w, C)
S=sqrt(diag(diag(C)));
s=diag(S);
f=sqrt(w'*C*w)/(w'*s);

このファイル(divrat.M)を通常のMatlabパスに保存しているため、Matlabが起動時に関数を読み取るため、この関数を使用できるようにする必要があります。

ただし、入力するとき

>> divrat(w, C)

次のエラーが表示されます

???タイプ「double」の入力引数に対する未定義の関数またはメソッド「divrat」。

コードまたは関数呼び出しにエラーが表示されないというエラーメッセージは何ですか?

18
Per

関数がMATLABパスまたはpwdにない場合、このエラーが発生します。

まず、以下を使用して関数を見つけることができることを確認してください。

>> which divrat
c:\work\divrat\divrat.m

返される場合:

>> which divrat
'divrat' not found.

MATLABパスまたはPWDにはありません。

次に、divratコマンドを使用して、PATHを含むディレクトリがMATLABパス上にあることを確認します。パス上にあると思ったディレクトリが、実際にはパス上にない可能性があります。

最後に、「プライベート」ディレクトリを使用していないことを確認してください。 divratがprivateという名前のディレクトリにある場合、親ディレクトリの関数からアクセスできますが、MATLABコマンドラインからはアクセスできません。

>> foo

ans =

     1

>> divrat(1,1)
??? Undefined function or method 'divrat' for input arguments of type 'double'.

>> which -all divrat
c:\work\divrat\private\divrat.m  % Private to divrat
28
Todd

他の人が指摘しているように、これはおそらくMatlabの「パス」にない関数ファイルのパスの問題です。

これを確認する簡単な方法は、エディターで関数を開き、 F5 キー。これにより、エディターはファイルを実行しようとし、ファイルがパスにない場合、メッセージボックスが表示されます。その中でAdd to Pathを選択すると、元気になります。

補足説明:上記のプロセスの最後に、Matlabコマンドウィンドウは引数が見つからないというエラーを表示します。明らかに、エディターから実行しようとしたときに引数を指定しませんでした。ただし、今後はコマンドラインから関数を使用して正しい引数を指定できます。

5
sundar

この問題の最も一般的な原因は、Matlabが検索パスでファイルを見つけられないことです。基本的に、Matlabは以下のファイルを探します:

  1. 現在のディレクトリ(pwd);
  2. パス上のディレクトリで直接(パスを表示するには、コマンドラインでpathと入力します)
  3. 上の任意のディレクトリにある@(whatever the class of the first argument is)という名前のディレクトリ。

    他の誰かが示唆したように、コマンドwhichを使用できますが、この場合は役に立たないことがよくあります。Matlabがファイルを見つけることができないことを知っています。

    最初に行うことは、ファイルがパス上に配置可能であることを確認することです。

    次に行うことは、matlabが見つけている(使用している)ファイルが、実際に渡している最初の引数と同じタイプを必要とすることを確認することです。 I.el、wが異なるクラスであると想定され、そこにdivrat関数があるが、wが実際には空の場合、_[]_、したがってmatlab _Double/divrat_を探していますが、@(yourclass)/divrat.しかありません。これは単なる憶測ですが、これはしばしば私を噛みます。

4
Marc

関数自体は有効なmatlab-codeです。問題は別のものでなければなりません。
配置されているディレクトリ内から関数を呼び出すか、addpath('pathname')を使用してそのディレクトリを検索パスに追加してください。

2
bastibe

エラーコードは、関数定義が見つからないことを示します。 divrat.mファイルが保存されているのと同じワークスペースから関数を呼び出していることを確認してください。また、divrat関数がサブ関数ではないことを確認してください。これはファイル内の最初の関数宣言でなければなりません。また、同じdivrat.mファイルから関数を呼び出して、ワークスペースの選択または関数に問題があるかどうかを確認することもできます。

ところで、なぜあなたは単純に言わなかったのですか

s = sqrt(diag(C));

同じではないでしょうか?

2
hakan

また、divrat.mではなく、divrat.Mという名前を付けます。これはほとんどのOSでは問題になりませんが、誰が知っている...

whichコマンドを使用して、matlabが関数を見つけることができるかどうかをテストすることもできます。

which divrat
2
Mr Fooz

この問題が発生した理由は、この関数が属するツールボックス(パッケージ)のライセンスが原因であると確信しています。which divratを書いて、結果を確認してください。関数のパスとコメントHas no license availableが返される場合、問題はライセンスに関連しています。つまり、パッケージのライセンスが正しく設定されていません。ほとんどの場合、この関数のパッケージ(ツールボックス)が後で、つまり元のmatlabのインストール後に追加された場合に発生します。ライセンスの問題を確認して解決すると、問題なく動作します。

0
eyasu