如何使用同名的新函数包装已存在的函数

时间:2012-08-02 16:13:28

标签: matlab wrapper built-in function-overriding

是否可以围绕与原始函数具有完全相同名称的函数创建包装器?

在用户想要对输入变量进行一些额外检查然后将它们传递给内置函数How to interrupt MATLAB IDE when it hangs on displaying very large array?

之前,这将非常有用。

2 个答案:

答案 0 :(得分:11)

实际上,除了slayton的答案,你不需要使用openvar。如果您定义一个与matlab函数同名的函数,它将影响该函数(即代之以调用)。

为了避免递归调用自己的函数,可以使用builtin从包装器中调用原始函数。

e.g。

outputs = builtin(funcname, inputs..);

简单示例,名为rand.m,位于matlab路径中:

function out = main(varargin)
disp('Test wrapping rand... calling rand now...');
out = builtin('rand', varargin{:});

注意,这仅适用于builtin找到的功能。对于那些没有的人,slayton的方法可能是必要的。

答案 1 :(得分:3)

是的,这是可能的,但需要一点黑客攻击。它要求您复制一些函数句柄。

使用问题中提供的示例,我将展示如何将函数openvar包装在用户定义的函数中,该函数检查输入变量的大小,然后允许用户取消对变量的任何打开操作。太大了。

此外,当用户双击Matlab IDE的“工作区”窗格中的变量时,这应该有效。

我们需要做三件事。

  1. 获取原始openvar函数
  2. 的句柄
  3. 定义调用openvar
  4. 的包装函数
  5. 将原始openvar名称重定向到我们的新功能。
  6. 示例函数

    function openVarWrapper(x, vector)
    
        maxVarSize = 10000;
        %declare the global variable
        persistent openVarHandle; 
    
        %if the variable is empty then make the link to the original openvar
        if isempty(openVarHandle)
            openVarHandle = @openvar;
        end
    
        %no variable name passed, call was to setup connection
        if narargin==0
            return;
        end
    
    
        %get a copy of the original variable to check its size
        tmpVar = evalin('base', x);        
    
        %if the variable is big and the user doesn't click yes then return
        if prod( size( tmpVar)) > maxVarSize
            resp = questdlg(sprintf('Variable %s is very large, open anyway?', x));
            if ~strcmp(resp, 'Yes')
                return;
            end
        end
    
        if ischar(x) && ~isempty(openVarHandle);
            openVarHandle(x);
         end
     end
    

    定义此功能后,您只需执行

    脚本即可
    • 清除名为openvar
    • 的所有变量
    • 运行openVarWrapper脚本以设置连接
    • 将原始openVar指向openVarWrapper

    示例脚本:

    clear openvar;
    openVarWrapper;
    openvar = @openVarWrapper;
    

    最后,当您想要清理所有内容时,您只需致电:

    clear openvar;