在matlab脚本中,是否可以在调用函数后定义变量? (即脚本找到带有未定义变量的函数,查找变量初始化并在之后执行函数)
我需要这个,因为我有大量的变量和函数,我不想按顺序排序,但是以适合我的问题的方式排序。
E.g。
mean(x);
x = [1, 2, 3];
由于
答案 0 :(得分:2)
免责声明 :我认为你想要做的是一个非常糟糕的做法。如果你发现自己需要这样做,你的代码会尖叫重构。
是的,有可能。有两种方法。
使用try-catch
声明:
try
x_mean = mean(x)
catch exception
if isequal(exception.identifier, 'MATLAB:UndefinedFunction')
x = [1,2,3];
x_mean = mean(x);
else
rethrow(exception);
end
end
解释:如果mean(x)
失败,代码将进入catch
分支。然后它验证错误是否发生,因为缺少变量,如果是这种情况,则定义变量x
并重新运行该函数。有一点需要注意:Matlab对缺少变量和缺少函数使用相同的标识符。
使用exist
功能:
if exist('x') == 1 %// the function have several return values
x_mean = mean(x);
else
x = [1, 2, 3];
x_mean = mean(x);
end
解释:exist
函数将验证工作空间中是否存在名为x
的变量。如果它确实存在,它将返回1并且您可以执行您的功能。如果它不存在,那么您可以先声明它,然后运行mean
。请参阅文档here。
我的两分钱:再一次,这是实现目标的可怕方式。通过这种方式,你将得到纯意大利面条代码。调试将是一场噩梦。维持这将是一场噩梦。有99%的可能性有更好的方法来做你想要的。这只是投入时间和思考的问题。即使是个人项目或快速解决作业/任务的脚本,您也可以通过正确的方式学习更多内容。
答案 1 :(得分:1)
如果我理解你的问题是正确的,那么可以通过一些丑陋的黑客来完成。 可以使用以下类:
classdef AdvancedFunctionHandle
properties(GetAccess = 'private', SetAccess = 'private')
handle
variables
end
methods
function obj = AdvancedFunctionHandle(fct, varargin)
if ~isa(fct,'function_handle')
error('The function must be a function handle!');
end
argins = numel(varargin);
variables = cell(1,argins);
for i = 1:argins
if ~ischar(varargin{i})
error('The variables must be represented by a string variabel name!');
end
if (~isvarname(varargin{i}) )
error('The variables must be a string representing a legal variabel name!');
end
variables{i} = varargin{i};
end
obj.handle = fct;
obj.variables = variables;
end
function val = subsindex(obj)
val = obj.calculate();
end
function val = calculate(obj)
try
vars = cell(1,numel(obj.variables));
for i = 1:numel(obj.variables)
v = evalin('base',obj.variables{i});
if isa(v,'AdvancedFunctionHandle')
vars{i} = v.calculate();
else
vars{i} = v;
end
end
val = obj.handle(vars{:});
catch
val = obj;
end
end
function display(obj)
disp([func2str(obj.handle),'(',strjoin(obj.variables,','),')']);
end
end
end
我也为它做了一个小测试脚本:
clear
m = AdvancedFunctionHandle(@mean,'x');
s = AdvancedFunctionHandle(@(n)sum(1:n),'m');
m.calculate
x = [1,2,3];
s.calculate
我希望这能解决你的问题。 请注意,由于类引用了基本工作空间,因此从函数运行时,或者运行它的脚本是从函数运行时,它将不起作用。
答案 2 :(得分:0)
我不明白你想要实现什么,但是如果你想在使用它们之后定义它们,我认为它们必须是函数。
示例文件:
function myfun()
mean(getX)
function X = getX
X = [1 2 3]
因此,虽然技术上可以在使用后定义变量,但您真的不想这样做。