20

私は 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' が定義されていません。

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

4

7 に答える 7

28

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

まず、次を使用して関数を見つけることができることを確認します。

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

返された場合:

>> which divrat
'divrat' not found.

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

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

最後に、「プライベート」ディレクトリを使用していないことを確認してください。private という名前のディレクトリにある場合divrat、親ディレクトリの関数からアクセスできますが、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
于 2008-11-21T15:38:10.800 に答える
5

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

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

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

于 2008-10-20T18:35:17.183 に答える
4

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

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

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

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

    次に行うことは、matlab が検出する (使用する) ファイルが、実際に渡す最初の引数と同じタイプを必要とすることを確認することです。I.el, Ifwは別のクラスであるはずで、そこにはdivrat関数がありますが、w実際には空です[]。そのため、matlab は を探してDouble/divrat@(yourclass)/divrat. ます。

于 2008-10-20T18:45:52.480 に答える
2

また、名前はdivrat.mではなく にしdivrat.Mます。これはほとんどの OS では問題にならないはずですが、誰が知っているのでしょうか...

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

which divrat
于 2008-10-13T13:40:18.327 に答える
2

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

于 2008-10-18T00:41:03.467 に答える
2

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

ところで、なぜ簡単に言わなかったのですか?

s = sqrt(diag(C));

それは同じではありませんか?

于 2008-10-13T13:11:21.020 に答える