1. ホーム
  2. マットラボ

[解決済み] "入力引数が 'double' 型の場合、未定義の関数 'function_name' が存在します"

2022-03-03 15:29:23

質問

形は違えど、よく出てくる質問があります。次のようなエラーメッセージが表示されるのですが、なぜですか?

入力引数が 'double' 型の場合、未定義の関数 'function_name'があります。

この記事では、このエラーメッセージが発生する可能性のあるさまざまなシナリオを取り上げ、解決方法を提案しようと思います。

解決方法は?

このエラーメッセージに遭遇し、その意味がわからなくなった場合。これで安心してください。90%の人が同じフレーズをググったことがあるのです。

<ブロッククオート

入力引数が 'double' 型の場合、未定義の関数 'int'があります。

このエラーメッセージは非常にわかりやすいものですが、それでも混乱を招く可能性があります。(私は 'int' をランダムに使用することもできます。 'train', 'table', 'my_function' または他の何か)。

このエラーが発生するケースは、主に2つあります。

  1. まだ存在しない関数を使おうとしている。
  2. 存在しない変数内の要素にアクセスしようとしています。

このエラーが出たらどうするのですか?

まず、次のことを試してみてください。 which . これは、使おうとしている関数や変数が定義されているかどうかを教えてくれるものです。

which int
'int' not found.

明らかなように,Matlabは関数や変数の名前に int . したがって、これを使おうとしても無駄です。では、次のように比較してみましょう。 max :

which max
built-in (C:\Program Files\MATLAB\R2014b\toolbox\matlab\datafun\@logical\max)  % logical method

しかし、"Undefined function 'x' ..."と表示されても、次のように表示されることがあります。その場合は、以下のポイント3を参照してください。

which x
x is a variable.

1. しかし、関数 "int" は存在するのです! それは、さらに ドキュメント !?

はい。 int は存在しますが、それは シンボリックツールボックス . ツールボックスは別途購入する必要がある追加パッケージなので(かなり高価)、そのパッケージを持っていない可能性があります。

Undefined function"のエラーが出たが、ドキュメントにその関数がある場合、左のメニューから探すか、単にアドレスを確認してください。標準的なMatlabの関数は以下のようなアドレスを持っています。

mathworks.com/help/matlab/ref/max.html
                   ^^^^^^

matlab"の部分に注目してください。もしこれが見えたら、あなたはMatlabのコアの一部である関数を使用していることになります。

一方、以下のようなアドレスが表示された場合、使用しようとしている関数はSymbolic Toolboxに含まれています。

mathworks.com/help/symbolic/int.html
                   ^^^^^^^^

あるいは、Neural Network Toolboxの一部かもしれません。

mathworks.com/help/nnet/ref/train.html
                   ^^^^ 

解決策 あなたが持っていないツールボックスの一部ではない別の関数を見つける。あなたが熟練したググラーであれば、探しているものが見つかる可能性があります。もし見つからない場合は、助けを求めてください。何を試したか説明し、努力したことを示しましょう。

2. しかし、この関数は の文書があります。 そして、Matlabのコアに含まれています。

ある関数がMatlabの標準的なインストールに含まれていて、よく文書化されていても、このエラーが発生することがあります。このエラーの最も可能性の高い原因は、Matlabの古いバージョンを使用していることです。ドキュメントを確認すると、ページの下の方に以下のように記載されています。

<ブロッククオート

R2013b で導入されました。

つまり、R2012bを使用している場合、例えば、以下のような使い方はできません。 table .

解決策 お使いのMatlabのバージョンで、その関数が定義されているかどうか確認してください。もしまだ実装されていないなら、Matlabをアップデートするか、他の方法を見つける必要があります。代替案として table は、例えばセルや構造体を使用することができます。

3. しかし、変数 "my_variable" は存在するのです! 上の行で作りました!

いいえ、そうではありません。あなたが作成した変数 myvariable , my_Variable , my_Variable のようなものを上の行に書いてください。また、作成したはいいが、誤って cleared を使用します。

解決策 コードに目を通す。タイプミスや、誤って変数をクリアしてしまったところなどを探してみてください。Matlabエディタでは、変数をマークすると下の方に次の行が表示されます: "3 usages of "x" found" if you have defined and used the function.変数をマークすると、下の方に次の行が表示されます: "3 usages of "x" found" if you have defined and used the function. また、未使用の変数の下にはオレンジ色の線が表示されます。

4. しかし、次のように入力すると、 "y is a variable" が表示されます。 which y ?

上記のエラーが発生した場合 "未定義の関数 'y'ですが which は、次のように伝えます。 y が存在する場合、エラーメッセージにはさらに数行が含まれます。

my_function(x)
Undefined function or variable 'y'.
Error in my_function (line 2)
t = x*y; 

>> which y
y is a variable.

このことからわかるのは、変数に y の中にある Matlabワークスペース (また このリンク ).

問題は、関数がこのワークスペースにアクセスできないことです。

関数は基本ワークスペースを使用しません。すべての関数は、独自の関数ワークスペースを持っています。

関数で変数を見て使用したい場合、その変数を 引数 . こうすることで、その変数はその関数のローカルワークスペースの一部となります。同様に、関数の内部で作成した変数に関数の外部からもアクセスできるようにしたい場合は、関数からの出力として用意する必要があります。

解決策 使用する関数に入力引数として使用したい変数を渡します。関数内の名前は内部的に矛盾がないようにすること。つまり、関数全体で同じ名前でなければなりません。関数の外側と内側の変数名には何の関連性もないことに注意してください。

5. しかし、関数の入力として変数を渡しますが、それでも同じエラーメッセージが表示されます!?

はい、おそらく変数を入力として使用しているのでしょう。しかし、異なる関数で変数名が同じとは限りません(ほとんどの場合、そうではありません)。

という関数があったとします。

function output = my_function(x)  
output = 2*y;
end

を使っているのに、以下のコードのようにワークスペースから呼び出すと、上記と同じエラーが発生します。 y を入力変数として使用し y を関数内で使用します。

y = 3;
res = my_function(y)

これは、関数内部で my_function の場合、入力として使用する変数が x のように、関数の外側でどのように呼ばれていたかに関係なく。

解決策 関数のヘッダーで入力変数名を変更するか、関数全体で変数名を変更します。

6. しかし、私が作成した x をグローバル変数にするのか!?

まず最初に。グローバル変数を使わないことをお勧めします。引数として変数を渡す方がはるかに良い。

として変数を宣言するだけでは十分ではありません。 グローバル をMatlabのワークスペースに追加しました。それを使用するすべての関数で宣言しなければなりません.したがって,もしグローバル変数 x を実行する必要があります。 global x をすべての関数で使用します。

解決策 コードを書き直し、グローバル変数を使用する代わりに変数を引数として渡します。それができない場合は global x を使用しているすべての関数で使用します。


この回答に加えて、公式の Matlab FAQ .