有没有办法更新变量的值,这取决于另一个变量?
看看这个简单的例子:
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
答案 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