如何对 Matlab 语言进行写保护?
How can I write-protect the Matlab language?
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 语言进行写保护以防止这种情况发生?
我不知道如何做你想做的事。但是有一种方法可以检查特定函数是否被变量或其他函数隐藏,使用which
:即分析[=20=的输出],其中 fname
是包含函数名称的字符串。
以max
函数为例:比较(无阴影)
>> 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
有(阴影)
>> 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
在第二种情况下,which(fname, '-all')
告诉您 max
是一个隐藏多个方法的变量。
因此,要测试是否正在发生阴影,
将 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'
所以我们需要求助于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
分析步骤1得到的字符串s
是否包含'% Shadowed'
。这很容易用 strfind
完成:即,如果有阴影,strfind(s, '% Shadowed')
将是非空的。
总结:
综合起来,
isShadowed = ~isempty(strfind(evalc('which(fname, ''-all'')'), '% Shadowed'));
returns 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
具有命名函数的示例:
在文件 std.m
中创建一个函数并将其放在您的路径中。这将影响 Matlab 的 std
函数。
>> fname = 'std';
>> isShadowed = ~isempty(strfind(evalc('which(fname, ''-all'')'), '% Shadowed'))
isShadowed =
1
现在删除函数文件(或从路径中删除其文件夹):
>> fname = 'std';
>> 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
截至 9/2015,我还没有找到一种方法 轻松 写保护原生 matlab functions/language,作为 setting/flag/etc 在启动时。
如果您关注某个特定函数,可以通过多种方式查看它们是否被隐藏,包括 Luis Mendo 的回答:which('name_of_function', '-all')
.
如果以后找到方法,我会很乐意接受这个答案!
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 语言进行写保护以防止这种情况发生?
我不知道如何做你想做的事。但是有一种方法可以检查特定函数是否被变量或其他函数隐藏,使用which
:即分析[=20=的输出],其中 fname
是包含函数名称的字符串。
以max
函数为例:比较(无阴影)
>> 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
有(阴影)
>> 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
在第二种情况下,which(fname, '-all')
告诉您 max
是一个隐藏多个方法的变量。
因此,要测试是否正在发生阴影,
将
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'
所以我们需要求助于
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
分析步骤1得到的字符串
s
是否包含'% Shadowed'
。这很容易用strfind
完成:即,如果有阴影,strfind(s, '% Shadowed')
将是非空的。
总结:
综合起来,
isShadowed = ~isempty(strfind(evalc('which(fname, ''-all'')'), '% Shadowed'));
returns 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
具有命名函数的示例:
在文件 std.m
中创建一个函数并将其放在您的路径中。这将影响 Matlab 的 std
函数。
>> fname = 'std';
>> isShadowed = ~isempty(strfind(evalc('which(fname, ''-all'')'), '% Shadowed'))
isShadowed =
1
现在删除函数文件(或从路径中删除其文件夹):
>> fname = 'std';
>> 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
截至 9/2015,我还没有找到一种方法 轻松 写保护原生 matlab functions/language,作为 setting/flag/etc 在启动时。
如果您关注某个特定函数,可以通过多种方式查看它们是否被隐藏,包括 Luis Mendo 的回答:which('name_of_function', '-all')
.
如果以后找到方法,我会很乐意接受这个答案!