如何编写保护Matlab语言?
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
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
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的行为。一旦某个函数被覆盖,这将非常有用。是的,我知道。你想要达到的目标会很有趣