如何解决 MATLAB 中的名称冲突?

How do I resolve name conflict in MATLAB?

我在 MATLAB 中创建了一个名为 "stack" 的 GUI。它有一个与之关联的 .m 文件。此 GUI 被同一文件夹中的另一个 GUI 多次调用。

现在我发现“stack”是 MATLAB 中的一个内置函数,我需要将其用于同一工作目录中的其他内容。所有对堆栈函数的调用都通过调用 stack.m 脚本以某种方式调用 GUI。

我不想重命名这个,因为它被用在很多地方。

有没有不用重命名就可以使用内置函数的方法?有什么方法可以分别引用函数和脚本?

为了可重复性对 稍作修改:在导航到存储 stack.m GUI 的地图之前,运行

builtinStack = @stack();

创建函数句柄。这样您就可以调用 builtinStack() 就像应该调用 MATLAB 函数一样,而不必每次要使用它时都 cd 离开目录。

使用builtin, as suggested by 是行不通的,因为内置函数被定义为

...Functions such as "ind2sub", "sub2ind", etc. are not MATLAB built-in functions.... Those functions that are shipped with MATLAB but are not defined as built-in functions can be referred to as "MATLAB functions" ...

MathWorks Technical Support 所回答。这意味着像 stack 这样的函数不是内置的,因为它们是用不同的语言构建、编译然后从 MATLAB 调用的,但实际上是用 MATLAB 编写的并随版本一起提供。检查这个的主要方法是输入 edit <functionname>;当仅显示注释时,该函数是 TMW 定义的内置函数,当它也显示 MATLAB 代码时,如 stack,它不是上述定义的内置函数。

内置函数的一个示例是 sum,其关联的 .m 文件如下所示:

%SUM Sum of elements.
%   S = SUM(X) is the sum of the elements of the vector X. If X is a matrix,
%   S is a row vector with the sum over each column. For N-D arrays, 
%   SUM(X) operates along the first non-singleton dimension.
%
%   S = SUM(X,DIM) sums along the dimension DIM. 
%
%   S = SUM(...,TYPE) specifies the type in which the 
%   sum is performed, and the type of S. Available options are:
%
%   'double'    -  S has class double for any input X
%   'native'    -  S has the same class as X
%   'default'   -  If X is floating point, that is double or single,
%                  S has the same class as X. If X is not floating point, 
%                  S has class double.
%
%   S = SUM(...,NANFLAG) specifies how NaN (Not-A-Number) values are 
%   treated. The default is 'includenan':
%
%   'includenan' - the sum of a vector containing NaN values is also NaN.
%   'omitnan'    - the sum of a vector containing NaN values
%                  is the sum of all its non-NaN elements. If all 
%                  elements are NaN, the result is 0.
%
%   Examples:
%       X = [0 1 2; 3 4 5]
%       sum(X, 1)
%       sum(X, 2)
%
%       X = int8(1:20)
%       sum(X)             % returns double(210), accumulates in double
%       sum(X,'native')    % returns int8(127), because it accumulates in
%                          % int8 but overflows and saturates.
%
%   See also PROD, CUMSUM, DIFF, ACCUMARRAY, ISFLOAT.

%   Copyright 1984-2015 The MathWorks, Inc.

%   Built-in function.

即从最后一行也可以看出,这是按照定义内置的。请注意,当输入 help sum 时,会看到第一个 'comment' 中包含的所有内容;从某种意义上说,空行会破坏帮助文件。因此,仅在命令行中键入 help sum 时不会显示版权和内置信息,因此要检查函数是否为内置,您需要 edit <functionname>.

免责声明:请不要这样做。

假设您自己的 stack.m 只在搜索路径中,因为它在当前文件夹中,那么最简单的解决方法是创建一些虚拟子文件夹,导航到它,执行 Matlabs stack函数(这是当前搜索路径中唯一的 stack)并向后导航。

这里我用magic来举例说明:

function a= magic
n=5;
cd dummy
a= magic(n);
cd ..

其中 dummy 是子文件夹的名称。