我是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)
我收到以下错误
???未定义的函数或方法'divrat'表示'double'类型的输入参数。
告诉我这样做的错误信息是什么,我在代码或函数调用中看不到任何错误?
答案 0 :(得分:28)
当函数不在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
答案 1 :(得分:5)
正如其他人所指出的,这很可能是函数文件路径不在Matlab的“路径”中的问题。
验证这一点的一种简单方法是在编辑器中打开您的功能,然后按 F5 键。这将使编辑器尝试运行该文件,如果文件不在路径中,它将提示您一个消息框。选择Add to Path
,你必须没事。
一方面注意:在上述过程结束时,Matlab命令窗口会出现错误,说明参数丢失:显然,当我们尝试从编辑器运行时,我们没有提供任何参数。但是从现在开始,您可以使用命令行中的函数给出正确的参数。
答案 2 :(得分:4)
此问题的最常见原因是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.
这只是我的猜测,但这经常让我感到厌烦。
答案 3 :(得分:2)
错误代码表示找不到函数定义。确保从存储divrat.m
文件的同一工作区调用该函数。并确保divrat
函数不是一个子函数,它应该是文件中的第一个函数声明。您也可以尝试从同一个divrat.m
文件调用该函数,以查看问题是否与工作区选择或函数有关。
顺便问一下,你为什么不简单地说
s = sqrt(diag(C));
不一样吗?
答案 4 :(得分:2)
另外,将其命名为divrat.m
,而不是divrat.M
。这对大多数操作系统来说无关紧要,但谁知道......
您还可以使用which
命令测试matlab是否可以找到函数,即
which divrat
答案 5 :(得分:2)
函数本身是有效的matlab代码。问题必须是别的。
尝试从它所在的目录中调用该函数,或使用addpath('pathname')
将该目录添加到搜索路径。
答案 6 :(得分:0)
我很确定发生此问题的原因是因为此函数所属的工具箱(包)的许可证。编写which divrat
并查看结果是什么。如果它返回函数的路径和注释Has no license available
,则问题与许可证有关。这意味着,未正确设置包的许可证。大多数情况下,如果稍后添加此函数的包(工具箱),即在安装原始matlab
之后,就会发生这种情况。请检查并解决许可证问题,然后它将正常工作。