Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写保护Matlab语言?_Matlab_Function_Syntax - Fatal编程技术网

如何编写保护Matlab语言?

如何编写保护Matlab语言?,matlab,function,syntax,Matlab,Function,Syntax,Matlab允许您覆盖内置函数,而无需任何警告 例如,我用一个变量覆盖了函数max(),但Matlab没有提醒我这一点。只有在调用函数时才会引发错误,并且不会帮助您看到实际问题: min = 0; max = 10; x = linspace(min,max,20); y = exp(x); disp(['the value is: ', num2str(max(y))]) 错误消息: Subscript indices must either be r

Matlab允许您覆盖内置函数,而无需任何警告

例如,我用一个变量覆盖了函数
max()
,但Matlab没有提醒我这一点。只有在调用函数时才会引发错误,并且不会帮助您看到实际问题:

min     = 0;
max     = 10;
x       = linspace(min,max,20);
y       = exp(x);
disp(['the value is: ', num2str(max(y))])
错误消息:

Subscript indices must either be real positive integers or logicals.

有没有一种方法可以在启动时对所有Matlab语言进行写保护,或者在设置文件中防止这种情况发生?

我不知道怎么做。但是有一种方法可以检查特定函数是否被变量或其他函数隐藏,即:分析
的输出,其中(fname,'-all')
,其中
fname
是包含函数名的字符串

max
函数为例:比较(无阴影)

带(阴影)

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

所以,为了测试是否有阴影出现

  • 的输出(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'
    
    所以我们需要求助于获取完整的输出:
    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
    
  • 分析在步骤1中获得的字符串
    s
    ,查看它是否包含
    “%Shadowed”
    。这很容易做到:也就是说,
    strfind(s,'%Shadowed')
    如果有阴影,则它将是非空的

  • 总之

    >> 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
    
    >> 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
    
    总而言之

    isShadowed = ~isempty(strfind(evalc('which(fname, ''-all'')'), '% Shadowed'));
    
    如果变量
    fname
    中包含名称的函数被隐藏,则返回
    true
    ,否则返回
    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
    
    >> 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
    
    具有命名函数的示例

    >> 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
    
    >> 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
    
    在文件
    std.m
    中创建一个函数,并将其放置在路径中。这将影响Matlab的
    std
    函数

    >> fname = 'std';
    >> isShadowed = ~isempty(strfind(evalc('which(fname, ''-all'')'), '% Shadowed'))
    isShadowed =
         1
    
    现在删除函数文件(或从路径中删除其文件夹):

    匿名函数示例

    >> 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
    
    >> 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
    

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

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


    如果将来能找到一种方法,我将欣然接受这个答案

    有趣的问题。如果键入
    max=3
    ,您想要什么?一个错误,什么都没有,一个警告?您总是可以通过使用
    builtin
    来确保运行内置函数,就像这样
    x=builtin('max',[-4,3])
    ,但这当然非常麻烦。一定不要!!好。。。覆盖时出现错误/警告会更好。交互式编辑器中的通知也是如此。很高兴了解
    内置功能,但我可能只是更改变量名。我想这是不可能的。也许只有在Matlab中重载每一个基本类时,我才不推荐这样做。当你做错事时,它会使Matlab变得无用。但是,如果t已经存在,则始终可以使用
    >exist可能的\u var\u name
    检查t<代码>>>存在的东西是什么
    告诉你它从哪里来或者是什么。+1表示存在。虽然这些工具可以帮助避免这个问题(如果我不确定的话,我通常会做
    可能的帮助\u var\u name
    ),但函数没有写保护让我有些困扰!当我在脚本和命令窗口之间进行大量工作时,这也是一个问题,事情变得有点复杂。@Studiegriffin如果您预期以后会覆盖它,您可以及时保存
    内置的句柄;)谢谢你,路易斯。这是一个很好的信息,但它并不完全是我想要的:/。我希望有一个优雅的解决方案,比如一个'-nowrite'标志或者我可以改变的偏好,可以修改matlab的行为。一旦某个函数被覆盖,这将非常有用。是的,我知道。你想要达到的目标会很有趣