which 函数是 MATLAB 中非常常用的一个函数,它用于查找给定函数、脚本、文件、变量、类方法等的路径。这个函数能够帮助用户定位文件在 MATLAB 路径中的位置。通过 which,你可以快速了解一个项(如函数、脚本等)是来自 MATLAB 环境中的哪个文件夹,以及它的具体路径。

以下是对 which 函数的详细解释,包括不同的用法、输入输出及其应用场景。

基本语法

  1. 查找函数或文件路径:

    which item
    

    其中 item 是你想要查找的项,可以是函数名、脚本名、类名或文件名。如果 item 位于 MATLAB 路径中,which 会返回该项的完整路径。如果该项在 MATLAB 中不可用,它会返回 'not found'。

  2. 返回路径到字符串:

    str = which(item)
    

    此语法返回 item 的完整路径并存储在变量 str 中。

  3. 定位函数在指定文件中的位置:

    which fun1 in fun2
    

    这种用法用于查找由文件 fun2 调用的函数 fun1 的路径。它可以帮助你区分在同一个命名空间或路径下,是否是调用的局部函数。

  4. 查找所有匹配的项:

    which ___ -all
    

    使用 -all 选项时,which 会返回所有符合名称的项的路径,包括可能有多个版本的函数、重载的函数等。

功能和行为

1. 定位函数或文件的路径

which 最基本的功能是定位一个函数或文件的路径。例如:

which pinv

这将显示 pinv 函数的路径,如:

matlabroot/toolbox/matlab/matfun/pinv.m

表示该函数位于 matfun 文件夹中。

2. 查找私有函数

如果你有一个私有函数(通常位于 private 子文件夹中),你也可以使用 which 来查找它。例如:

which private/orthog

该命令会显示 private 文件夹中名为 orthog.m 的文件的路径。

3. 定位加载的 Java 类中的方法

如果你加载了一个 Java 类并实例化了它,你可以使用 which 来查找类中的方法。例如:

myDate = java.util.Date;
which setMonth

这将显示 setMonth 方法所在的路径,表示它是 java.util.Date 类的方法。

4. 查找局部函数

有时,你可能会想要查看某个函数是否是局部函数。你可以使用 which 结合 in 来查看一个函数是否是由指定文件中的局部函数调用。例如:

which parseargs in area

这会显示 parseargs 是否是由 area.m 文件中的局部函数调用。

5. 查找多个匹配项

如果路径中有多个项匹配 item,你可以使用 -all 参数来返回所有匹配项的路径。例如:

which openedFiles -all

这会列出所有在 MATLAB 路径上匹配 openedFiles 的项,通常用于查看是否有多个重载版本。

高级用法

1. 查找通过输入参数调用的函数

你还可以使用 which 查找使用特定输入参数时调用的函数。例如,如果你有一个 matfile 对象并希望查找 who 函数的路径,你可以这样做:

matObj = matfile('topography.mat');
which who(matObj)

这将返回 who 方法在 matfile 对象中的实现路径。

2. 使用字符串或字符向量作为参数

which 支持将项指定为字符向量或字符串标量。如果是函数格式,输入项需要用单引号或双引号括起来。例如:

str = which('pinv');

str 将包含 pinv 函数的完整路径。

3. 限制搜索范围

你还可以限制搜索范围,仅搜索 MATLAB 路径中的文件。例如:

which /myfunction

这将返回 myfunction.m 在 MATLAB 路径中的完整路径,而不包括内置函数或 Java 类。

4. 查找私有函数

当你使用 private 子文件夹中的函数时,你可以使用类似 which private/orthog 的语法来定位私有函数的位置。

输出

  • 返回路径:
    which 会返回该项(函数、文件等)的完整路径。例如,如果你查找一个函数,它会返回该函数的路径。

  • 返回 'not found':
    如果你查找的项不在路径中,which 会返回 'not found',表示无法找到该项。

  • 多重匹配:
    如果路径中有多个匹配项,使用 -all 参数时,which 会列出所有匹配项的路径。

示例

  1. 查找一个函数的路径:

    which pinv
    

    输出:

    matlabroot/toolbox/matlab/matfun/pinv.m
    
  2. 查找私有函数:

    which private/orthog
    

    输出:

    matlabroot/toolbox/matlab/elmat/private/orthog.m
    
  3. 查找特定 Java 方法:

    myDate = java.util.Date;
    which setMonth
    

    输出:

    setMonth is a Java method % java.util.Date method
    
  4. 查找局部函数:

    which parseargs in area
    

    输出:

    matlabroot/toolbox/matlab/specgraph/area.m (parseargs)  % Local function of area
    
  5. 查找多个匹配项:

    which openedFiles -all
    

    输出(举例):

    built-in (matlabroot/toolbox/matlab/iofun/openedFiles)
    

局限性

  • which 只能定位 MATLAB 路径中存在的函数、文件或类方法。对于没有加载的 Java 类方法,which 只会在类已加载时返回路径。
  • 如果一个方法在 @ 文件夹中没有被定义或者不在命名空间中,它可能不会被 which 查找到。

总结

which 是一个非常强大的工具,它能帮助用户快速定位 MATLAB 环境中的函数、脚本、私有函数、Java 方法等。通过不同的用法(例如使用 -all 或 in),which 可以进一步精细化查找,从而帮助用户高效管理和定位代码文件。

更多推荐