Matlab R2014a - 在调用函数后定义变量

时间:2014-08-21 09:55:58

标签: matlab

在matlab脚本中,是否可以在调用函数后定义变量? (即脚本找到带有未定义变量的函数,查找变量初始化并在之后执行函数)

我需要这个,因为我有大量的变量和函数,我不想按顺序排序,但是以适合我的问题的方式排序。

E.g。

mean(x);
x = [1, 2, 3];

由于

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]

因此,虽然技术上可以在使用后定义变量,但您真的不想这样做。