如何对 Matlab 语言进行写保护?

2024-03-10

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 http://es.mathworks.com/help/matlab/ref/which.html:即分析输出which(fname, '-all'), where 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是一个隐藏多个方法的变量。

因此,要测试是否发生阴影,

  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'
    

    所以我们需要求助于evalc http://es.mathworks.com/help/matlab/ref/evalc.html获得完整的输出: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
    
  2. 分析字符串s步骤1中获取的内容,看是否包含'% Shadowed'。这很容易完成strfind http://es.mathworks.com/help/matlab/ref/strfind.html:即,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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对 Matlab 语言进行写保护? 的相关文章

  • 如何获取函数内的函数对象(Python)

    我想要有类似的东西 def x print get def name 但不一定知道名字x 理想情况下它会返回 x 其中 x 是函数的名称 您可以使用 Python 的内置检查库来完成此操作 如果您想处理更复杂的情况 您可以阅读更多其文档 但
  • 两个向量之间的欧氏距离(单行矩阵)

    我有两个向量 单行矩阵 假设我们已经知道长度len A x1 x2 x3 x4 x5 B y1 y2 y3 y4 y5 计算它们之间的欧几里德距离最快的方法是什么 我的第一次尝试是 diff A B sum 0 for column 1 l
  • 在 C++ 中,为什么我们不能使用 > 和 < 来比较迭代器? [复制]

    这个问题在这里已经有答案了 我被问过这个问题 我真的不知道为什么 如果你有指针int x 您可以将指针与 gt and lt 因为它代表内存位置 例如0x0000 0x0004 0x0008等等 我知道迭代器和指针是不同的 但它们的行为方式
  • MATLAB:具有复数的 printmat

    我想使用 MATLAB 的printmat显示带有标签的矩阵 但这不适用于复数 N 5 x rand N 1 y rand N 1 z x 1i y printmat x y z fftdemo N 1 2 3 4 5 x y x iy O
  • 如何将二进制值列表转换为int32类型?

    我在 MATLAB 工作区中有一个小端格式的二进制数列表 我想将它们转换为 int32 a是由 0 和 1 组成的双向量 如下所示 a 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1
  • wordpressfunctions.php - 为每个帖子类别使用不同的页面模板

    我想连接到 save post 函数 找出帖子所属的类别 然后为每个类别中的帖子分配不同的页面模板 我已经尝试了大约 30 个不同的版本 但都没有成功 有人可以帮我指出正确的方向吗 add action save post assign c
  • 就地改变 numpy 函数输出数组

    我正在尝试编写一个对数组执行数学运算并返回结果的函数 一个简化的例子可以是 def original func A return A 1 A 1 为了加速并避免为每个函数调用分配新的输出数组 我希望将输出数组作为参数 并就地更改它 def
  • 在 R 中使用整数值代替数值(例如 1L 与 1)作为常量的好处

    在 R 源代码中 大多数 但不是全部 函数使用整数值作为常量 colnames lt function x do NULL TRUE prefix col if is data frame x do NULL return names x
  • 使用符号求解器仅求解某些变量

    我正在尝试在 MATLAB 中求解包含 3 个变量和 5 个常量的方程组 是否可以使用solve求解三个变量 同时保持常量为符号而不用数值替换它们 当您使用SOLVE http www mathworks com access helpde
  • Ruby 试图掌握一种新的表示法。 (inject(:) 与 select(and:even?);为什么有 &?)

    所以 我刚刚了解到 而不是写这样的东西 1 2 3 4 5 inject x y x y gt 15 我可以写 1 2 3 4 5 inject gt 15 我还了解到 而不是写 1 2 3 4 5 select x x even gt 2
  • 如何告诉 mex 链接到 /usr/lib 中的 libstdc++.so.6 而不是 MATLAB 目录中的 libstdc++.so.6?

    现在 MATLAB 2012a 中的 mex 仅正式支持 gcc 4 4 6 但我想使用 gcc 4 7 风险自负 现在如果我直接用 mex 编译一些东西 它会抱怨 usr lib gcc i686 linux gnu 4 7 cc1plu
  • 函数名前的星号有什么作用?

    我对在大多数具有我不熟悉的函数声明的 C 程序中看到的内容感到困惑 void func name void param 什么是 暗示该功能 我的理解 在变量类型中的特点是它创建一个指向另一个变量的指针 因此它可以跟踪后一个变量存储在内存中的
  • 大括号语法 ${var%.*} 是什么意思?

    我正在查看一些旧代码并遇到了以下语法 extractDir downloadFileName tmp 我发现搜索的唯一信息是指命令列表 但这只是一个变量 这个大括号语法在 bash 中意味着什么 在这种背景下 它是一个参数替换 http w
  • Swift 完成处理程序语法

    此代码用于回答此处的问题 如何在 Swift 中发出 HTTP 请求 https stackoverflow com questions 24016142 how to make an http request in swift let u
  • Python Tkinter,停止线程函数

    我目前正在为 3D 打印机开发 GUI 并且遇到如何停止线程函数的问题 我希望能够单击 GUI 中具有另一个功能的按钮 该按钮将阻止线程函数通过串行端口发送 G 代码字符串 目前 该函数已合并线程 以允许在打印期间触发其他函数 我非常感谢有
  • 理解高斯混合模型的概念

    我试图通过阅读在线资源来理解 GMM 我已经使用 K 均值实现了聚类 并且正在了解 GMM 与 K 均值的比较 以下是我的理解 如有错误请指出 GMM 类似于 KNN 在这两种情况下都实现了聚类 但在 GMM 中 每个簇都有自己独立的均值和
  • 从函数体内访问函数对象的属性

    JavaScript 中的函数也是一个对象 并且可以具有属性 那么有没有办法从它自己的函数体内部访问它的属性呢 像这样 var f function console log some way to access f a f a Test f
  • 访问图像的 Windows“标签”元数据字段

    我正在尝试进行一些图像处理 所以现在我正在尝试读取图像 exif 数据 有 2 个内置函数可用于读取图像的 exif 数据 问题是我想读取图像标签 exifread and imfinfo这两个函数都不显示图像标签 Is there any
  • 什么是异地退货?

    什么是非本地退货 什么场景下有用 请举个例子来解释一下 这是一篇好文章 http yehudakatz com 2010 02 07 the building blocks of ruby 关于在 ruby 块的上下文中使用非本地返回 Ru
  • 有效地绘制大时间序列(matplotlib)

    我正在尝试使用 matplotlib 在同一轴上绘制三个时间序列 每个时间序列有 10 6 个数据点 虽然生成图形没有问题 但 PDF 输出很大 在查看器中打开速度非常慢 除了以栅格化格式工作或仅绘制时间序列的子集之外 还有其他方法可以获得

随机推荐