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。可能是您认为在路径上的目录实际上不在路径上。

最后,确保您没有使用“私人”目录。如果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
于 2008-11-21T15:38:10.800 回答
5

正如其他人所指出的,这很可能是函数文件的路径不在 Matlab 的“路径”中的问题。

验证这一点的一种简单方法是在编辑器中打开您的函数并按下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)目录中。

    正如其他人建议的那样,您可以使用 command which,但这在这种情况下通常没有帮助 - 它告诉您 Matlab 找不到您已经知道的文件。

    所以首先要做的是确保文件在路径上是可定位的。

    接下来要做的是确保 matlab 正在查找(使用哪个)的文件需要与您实际传递的第一个参数相同的类型。I.el, Ifw应该是不同的类,并且那里有一个divrat函数,但w实际上是空的[],所以 matlab 正在寻找Double/divrat,当只有 a@(yourclass)/divrat. 这只是我的猜测,但这经常咬我。

于 2008-10-20T18:45:52.480 回答
2

错误代码表示找不到函数定义。确保您从divrat.m存储文件的同一工作区调用该函数。并确保divrat函数不是子函数,它应该是文件中的第一个函数声明。您还可以尝试从同一个divrat.m文件中调用该函数,以查看问题是否与工作区选择或函数有关。

顺便说一句,你为什么不简单地说

s = sqrt(diag(C));

会不会一样?

于 2008-10-13T13:11:21.020 回答
2

该函数本身是有效的 matlab 代码。问题一定是别的。
尝试从它所在的目录中调用该函数,或者使用addpath('pathname').

于 2008-10-18T00:41:03.467 回答
2

另外,命名它divrat.m,而不是divrat.M。这在大多数操作系统上应该无关紧要,但谁知道......

也可以通过which命令测试matlab是否能找到函数,即

which divrat
于 2008-10-13T13:40:18.327 回答
0

我很确定出现这个问题的原因是因为这个函数所属的工具箱(包)的许可证。写which divrat看看会是什么结果。如果它返回函数的路径和注释Has no license available,则问题与许可证有关。这意味着,软件包的许可证设置不正确。大多数情况下,如果这个功能的包(工具箱)是后来添加的,即在安装原始matlab. 请检查并解决许可证问题,然后它将正常工作。

于 2015-04-19T11:38:26.603 回答