私は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」。
コードまたは関数呼び出しにエラーが表示されないというエラーメッセージは何ですか?
関数が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
他の人が指摘しているように、これはおそらくMatlabの「パス」にない関数ファイルのパスの問題です。
これを確認する簡単な方法は、エディターで関数を開き、 F5 キー。これにより、エディターはファイルを実行しようとし、ファイルがパスにない場合、メッセージボックスが表示されます。その中でAdd to Path
を選択すると、元気になります。
補足説明:上記のプロセスの最後に、Matlabコマンドウィンドウは引数が見つからないというエラーを表示します。明らかに、エディターから実行しようとしたときに引数を指定しませんでした。ただし、今後はコマンドラインから関数を使用して正しい引数を指定できます。
この問題の最も一般的な原因は、Matlabが検索パスでファイルを見つけられないことです。基本的に、Matlabは以下のファイルを探します:
pwd
);path
と入力します)@(whatever the class of the first argument is)
という名前のディレクトリ。他の誰かが示唆したように、コマンドwhich
を使用できますが、この場合は役に立たないことがよくあります。Matlabがファイルを見つけることができないことを知っています。
最初に行うことは、ファイルがパス上に配置可能であることを確認することです。
次に行うことは、matlabが見つけている(使用している)ファイルが、実際に渡している最初の引数と同じタイプを必要とすることを確認することです。 I.el、w
が異なるクラスであると想定され、そこにdivrat
関数があるが、w
が実際には空の場合、_[]
_、したがってmatlab _Double/divrat
_を探していますが、@(yourclass)/divrat.
しかありません。これは単なる憶測ですが、これはしばしば私を噛みます。
関数自体は有効なmatlab-codeです。問題は別のものでなければなりません。
配置されているディレクトリ内から関数を呼び出すか、addpath('pathname')
を使用してそのディレクトリを検索パスに追加してください。
エラーコードは、関数定義が見つからないことを示します。 divrat.m
ファイルが保存されているのと同じワークスペースから関数を呼び出していることを確認してください。また、divrat
関数がサブ関数ではないことを確認してください。これはファイル内の最初の関数宣言でなければなりません。また、同じdivrat.m
ファイルから関数を呼び出して、ワークスペースの選択または関数に問題があるかどうかを確認することもできます。
ところで、なぜあなたは単純に言わなかったのですか
s = sqrt(diag(C));
同じではないでしょうか?
また、divrat.m
ではなく、divrat.M
という名前を付けます。これはほとんどのOSでは問題になりませんが、誰が知っている...
which
コマンドを使用して、matlabが関数を見つけることができるかどうかをテストすることもできます。
which divrat
この問題が発生した理由は、この関数が属するツールボックス(パッケージ)のライセンスが原因であると確信しています。which divrat
を書いて、結果を確認してください。関数のパスとコメントHas no license available
が返される場合、問題はライセンスに関連しています。つまり、パッケージのライセンスが正しく設定されていません。ほとんどの場合、この関数のパッケージ(ツールボックス)が後で、つまり元のmatlab
のインストール後に追加された場合に発生します。ライセンスの問題を確認して解決すると、問題なく動作します。