如何写保护Matlab语言?

ano*_*n01 9 syntax matlab function

Matlab允许您在没有警告的情况下覆盖内置函数.

例如,我max()用变量覆盖了函数,但是Matlab没有提醒我这个.只有在调用函数时才会抛出错误,并且无法帮助您查看实际问题:

min     = 0;
max     = 10;
x       = linspace(min,max,20);
y       = exp(x);
disp(['the value is: ', num2str(max(y))])
Run Code Online (Sandbox Code Playgroud)

错误信息:

Subscript indices must either be real positive integers or logicals.
Run Code Online (Sandbox Code Playgroud)

有没有办法在启动时或在设置文件中写保护所有Matlab语言以防止这种情况?

Lui*_*ndo 5

我不知道有什么方法可以做你想做的事。但是有一种方法可以检查特定函数是否被变量或其他函数遮蔽,使用which: 即分析 的输出which(fname, '-all'),其中fname是包含函数名称的字符串。

max函数为例:compare(无阴影)

>> clear all
>> fname = 'max';
>> which(fname, '-all')
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@logical\max)  % logical method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@char\max)     % char method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@double\max)   % double method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@uint8\max)    % uint8 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@uint16\max)   % uint16 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@uint32\max)   % uint32 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@uint64\max)   % uint64 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@int8\max)     % int8 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@int16\max)    % int16 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@int32\max)    % int32 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@int64\max)    % int64 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@single\max)   % single method
C:\Program Files\MATLAB\R2010b\toolbox\matlab\timeseries\@timeseries\max.m     % timeseries method
C:\Program Files\MATLAB\R2010b\toolbox\distcomp\parallel\@codistributed\max.m  % codistributed method
C:\Program Files\MATLAB\R2010b\toolbox\shared\statslib\@ordinal\max.m          % ordinal method
Run Code Online (Sandbox Code Playgroud)

与(阴影)

>> fname = 'max';
>> max = 10;
>> which(fname, '-all')
max is a variable.
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@logical\max)  % Shadowed logical method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@char\max)     % Shadowed char method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@double\max)   % Shadowed double method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@uint8\max)    % Shadowed uint8 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@uint16\max)   % Shadowed uint16 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@uint32\max)   % Shadowed uint32 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@uint64\max)   % Shadowed uint64 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@int8\max)     % Shadowed int8 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@int16\max)    % Shadowed int16 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@int32\max)    % Shadowed int32 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@int64\max)    % Shadowed int64 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@single\max)   % Shadowed single method
C:\Program Files\MATLAB\R2010b\toolbox\matlab\timeseries\@timeseries\max.m     % Shadowed timeseries method
C:\Program Files\MATLAB\R2010b\toolbox\distcomp\parallel\@codistributed\max.m  % Shadowed codistributed method
C:\Program Files\MATLAB\R2010b\toolbox\shared\statslib\@ordinal\max.m          % Shadowed ordinal method
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,which(fname, '-all')告诉您这max是一个隐藏多个方法的变量。

所以,为了测试是否发生了阴影,

  1. 将 的输出分配which(fname, '-all')给变量。

    原则上,这可以作为s = which(fname, '-all');. 然而不幸的是,这会产生不同的输出;特别是,% ...删除了上面几行中的部分(表明是否有阴影):

    >> fname = 'max';
    >> s = which(fname, '-all')
    s = 
        'variable'
        'built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@logical\max)'
        'built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@char\max)'
        'built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@double\max)'
        'built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@uint8\max)'
        'built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@uint16\max)'
        'built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@uint32\max)'
        'built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@uint64\max)'
        'built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@int8\max)'
        'built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@int16\max)'
        'built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@int32\max)'
        'built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@int64\max)'
        'built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@single\max)'
        'C:\Program Files\MATLAB\R2010b\toolbox\matlab\timeseries\@timeseries\max.m'
        'C:\Program Files\MATLAB\R2010b\toolbox\distcomp\parallel\@codistributed\max.m'
        'C:\Program Files\MATLAB\R2010b\toolbox\shared\statslib\@ordinal\max.m'
    
    Run Code Online (Sandbox Code Playgroud)

    所以我们需要求助于evalc获得完整的输出:s = evalc('which(fname, ''-all'')');. 结果s是一个包含% ...由换行符分隔的所有行(包括部分)的长字符串:

    >> fname = 'max';
    >> s = evalc('which(fname, ''-all'')')
    s =
    max is a variable.
    built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@logical\max)  % Shadowed logical method
    built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@char\max)     % Shadowed char method
    built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@double\max)   % Shadowed double method
    built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@uint8\max)    % Shadowed uint8 method
    built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@uint16\max)   % Shadowed uint16 method
    built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@uint32\max)   % Shadowed uint32 method
    built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@uint64\max)   % Shadowed uint64 method
    built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@int8\max)     % Shadowed int8 method
    built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@int16\max)    % Shadowed int16 method
    built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@int32\max)    % Shadowed int32 method
    built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@int64\max)    % Shadowed int64 method
    built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\datafun\@single\max)   % Shadowed single method
    C:\Program Files\MATLAB\R2010b\toolbox\matlab\timeseries\@timeseries\max.m     % Shadowed timeseries method
    C:\Program Files\MATLAB\R2010b\toolbox\distcomp\parallel\@codistributed\max.m  % Shadowed codistributed method
    C:\Program Files\MATLAB\R2010b\toolbox\shared\statslib\@ordinal\max.m          % Shadowed ordinal method
    
    Run Code Online (Sandbox Code Playgroud)
  2. 分析s在步骤 1 中获得的字符串以查看它是否包含'% Shadowed'. 这很容易完成strfind:即,strfind(s, '% Shadowed')如果有阴影,它将是非空的。

总之

把这一切放在一起,

isShadowed = ~isempty(strfind(evalc('which(fname, ''-all'')'), '% Shadowed'));
Run Code Online (Sandbox Code Playgroud)

返回true如果包含在与可变名称的功能fname被遮挡,和false其它。

带有变量的示例

>> clear all
>> fname = 'max';
>> max = 10;
>> isShadowed = ~isempty(strfind(evalc('which(fname, ''-all'')'), '% Shadowed'))
isShadowed =
     1
>> clear max
>> isShadowed = ~isempty(strfind(evalc('which(fname, ''-all'')'), '% Shadowed'))
isShadowed =
     0
Run Code Online (Sandbox Code Playgroud)

具有命名函数的示例

在文件中创建一个函数std.m并将其放置在您的路径中。这将影响 Matlab 的std功能。

>> fname = 'std';
>> isShadowed = ~isempty(strfind(evalc('which(fname, ''-all'')'), '% Shadowed'))
isShadowed =
     1
Run Code Online (Sandbox Code Playgroud)

现在删除函数文件(或从路径中删除其文件夹):

>> fname = 'std';
>> isShadowed = ~isempty(strfind(evalc('which(fname, ''-all'')'), '% Shadowed'))
isShadowed =
     0
Run Code Online (Sandbox Code Playgroud)

匿名函数示例

>> std = @(x) x+1;
>> fname = 'std';
>> isShadowed = ~isempty(strfind(evalc('which(fname, ''-all'')'), '% Shadowed'))
isShadowed =
     1
>> clear std
>> isShadowed = ~isempty(strfind(evalc('which(fname, ''-all'')'), '% Shadowed'))
isShadowed =
     0
Run Code Online (Sandbox Code Playgroud)


ano*_*n01 1

截至 2015 年 9 月,我还没有找到一种方法来轻松编写保护本机 matlab 函数/语言,作为启动时的设置/标志/等。

如果您担心某个特定函数,可以通过多种方法来查看它们是否被隐藏,包括 Luis Mendo 的答案:which('name_of_function', '-all')

如果将来找到方法,我很乐意接受这个答案!