2

有什么方法可以更新变量的值,这取决于另一个变量?

看这个简单的例子:

代码:

variable1 = 1;

variable2 = 2 * variable1

variable1 = 3;

variable2

输出:

variable2 =

     2


variable2 =

     2

我希望,在更改变量 1 的值后,变量 2 会发生变化,而无需像这样重新定义它:

代码:

variable1 = 1;

variable2 = 2 * variable1

variable1 = 3;

variable2 = 2 * variable1

输出:

variable2 =

     2

variable2 =

     6
4

6 回答 6

1

如果你真的想要,你不应该这样做,你可以把variable2etc 变成函数,并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脚本的东西。同样,如果您在一个函数中,您可以使用嵌套函数可以访问和修改其父级中的所有变量的事实:

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

    function updateVars
        variable2 = 2 * variable1;
    end
end
于 2013-06-04T18:46:06.753 回答
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
于 2013-06-04T21:49:26.327 回答
1

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

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

variable1 = 1;
update_vars

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

于 2013-06-04T14:40:45.770 回答
0

您可以使用 eval 函数:

variable2 = eval('2*eval(''variable1'')')
于 2013-06-04T15:48:06.987 回答
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)
于 2013-06-04T15:02:27.837 回答
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
于 2013-06-08T05:04:10.233 回答