如何在matlab中更新变量?

时间:2013-06-04 14:32:31

标签: matlab variables hyperlink refresh

有没有办法更新变量的值,这取决于另一个变量?

看看这个简单的例子:

CODE:

variable1 = 1;

variable2 = 2 * variable1

variable1 = 3;

variable2

输出:

variable2 =

     2


variable2 =

     2

我想,在更改variable1的值之后,variable2会更改而不需要像这样重新定义:

CODE:

variable1 = 1;

variable2 = 2 * variable1

variable1 = 3;

variable2 = 2 * variable1

输出:

variable2 =

     2

variable2 =

     6

6 个答案:

答案 0 :(得分:1)

据我所知,这不能在MATLAB中自动完成。

我会创建一个执行所有更新的脚本,并在每次更改variable1时调用它。

variable1 = 1;
update_vars

这是我能想到的最佳方式。它易于编写,易于阅读。

答案 1 :(得分:1)

如果你真的想要,你不应该,你可以将variable2等用于函数,并使用evalin获取variable1的当前值:

variable2 = @() 2 * evalin('caller', 'variable1')
variable1 = 1;
variable2() % output: 2
variable1 = 15;
variable2() % output: 30

这是一个相当丑陋的解决方案,我不会自己使用它。如果您的代码在函数中,则有一个稍微好一点的解决方案(从某种意义上说它不使用eval):

function [ ... ] = myFun( ... )
variable1 = 1;
variable2() % output: 2
variable1 = 15;
variable2() % output: 30
    function v2 = variable2; v2 = 2 * variable1; end
end

不过,我个人会使用类似Robert P的update_vars脚本。再次,如果您在函数中,您可以使用nested functions可以访问和修改其父级中的所有变量的事实:

function [ ... ] = myFun( ... )
variable1 = 1;
updateVars();
variable2 % 2
variable1 = 15;
updateVars();
variable2 % 30

    function updateVars
        variable2 = 2 * variable1;
    end
end

答案 2 :(得分:1)

正如其中一条评论中提到的那样(不太具体),通过创建具有“即时”计算的依赖属性的类,可以实现这种行为。一个例子:

classdef ReplaceWithAMeaningfulName < handle
    properties (Dependent)
        data % The property that holds the instance's main value
    end

    properties (Dependent, SetAccess = private) % Only get-access, please
        someCalculatedValue % Something calculated
    end

    properties (Access = private)
        m_data % The private storage for data property
    end

    methods
        function self = ReplaceWithAMeaningfulName(data)
            % Constructor
            if nargin > 0
                self.data = data;
            end
        end

        % Property accessors for data property
        function set.data(self, value)
            assert(isnumeric(value), [mfilename ':InvalidValue'], ...
                'Value for property ''data'' must be numeric.');
            self.m_data = value;
        end

        function value = get.data(self)
            value = self.m_data;
        end

        % Property accessor for your calculated value
        function value = get.someCalculatedValue(self)
            value = self.data * 2;
        end
    end
end

现在,您可以按如下方式使用它

>> x = ReplaceWithAMeaningfulName(123);
>> x.someCalculatedValue

ans =

   246

>> x.data = 500;
>> x.someCalculatedValue

ans =

        1000

答案 3 :(得分:0)

为什么你不想使用某个功能?

function [Out1, Out2] =  setVariables(Arg1);
   Out1 = Arg1;
   Out2 = 2*Arg1;
end


[Variable1, Variable2] = setVariables(2)

或使用syms(当然这也可以通过功能完成)

syms Variable2(d);
Variable2(d) = 2*d;

Variable2(Variable1)

答案 4 :(得分:0)

您可以使用评估功能:

variable2 = eval('2*eval(''variable1'')')

答案 5 :(得分:0)

通过将variable2从常规变量更改为嵌套函数,可以非常接近。在Matlab中,变量和函数调用具有相同的语法(“统一访问原则”的变体),因此您可以直接替换。这适用于您的情况,因为Matlab中的嵌套函数是一个“闭包”,因为它可以访问封闭工作空间中所有变量的实时更新值。

这仅适用于函数内部,而不适用于脚本或命令行。

function foo

v1 = 1;

% Define v2 in terms of the "live" v1 value
function v2_val = v2()
v2_val = 2 * v1;
end

v2  % evaluates to 1
v1 = 3;
v2  % evaluates to 6

end