是否可以围绕与原始函数具有完全相同名称的函数创建包装器?
在用户想要对输入变量进行一些额外检查然后将它们传递给内置函数How to interrupt MATLAB IDE when it hangs on displaying very large array?
之前,这将非常有用。答案 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的“工作区”窗格中的变量时,这应该有效。
我们需要做三件事。
openvar
函数openvar
openvar
名称重定向到我们的新功能。示例函数
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;