zer*_*ord 5 matlab wolfram-mathematica lazy-evaluation delayed-execution
所以,我最近从Mathematica转换为Matlab,虽然Matlab具有Mathematica的大部分有用功能,但我无法弄清楚如何执行相当于Mathematica的延迟设置操作':=',它将变量赋值给a懒散的时尚.
例如,在Mathematica中:
y = 2;
x:= y;
y = 3;
X
将x的值赋予3,而我在Matlab中获得相同行为的唯一方法是:
y = 2;
x = @()(y);
y = 3;
X()
虽然在技术上回答了我的问题,但它是一个非常特别的工作,需要将x作为一个函数来处理.
那么有更自然的方法来做到这一点是Matlab吗?
编辑:
我的ad-hoc解决方案仅在y是句柄类的字段时才起作用,为了清楚起见,我把它留在了代码之外(它应该是someclass.y).我的问题的答案最好不会有这个限制,但如果确实如此,我仍然会接受.
惰性求值主要用于函数式编程语言,MATLAB是基于过程/ OOP的.因此,相当于SetDelayed不存在.如果您尝试使用已经证明的匿名函数,它将无法正常工作,正如Amro已经指出的那样.
但是,如果您可以访问符号计算工具箱,那么您可以使用一些可以被视为等效的东西:=(如果您问我,那么就是一个脆弱的等价物).这是一个例子:
syms x y z; %#Declare x, y and z as symbolic variables
x=y+2; %#Define some value for x
f=@(x)x.^2; %#Define an anonymous function.
f(x)
ans =
(y + 2)^2
%#Check with z
f(z)
ans =
z^2
Run Code Online (Sandbox Code Playgroud)
您可以看到它使用的是实际定义f,并且不会捕获x数值示例中的定义.您还可以更改的定义x说,x=1/y和f(x)现在将使用目前的定义x.请注意,这f只是一个函数句柄,将采用数字/符号参数.例如,
f(1:5)
ans =
1 4 9 16 25
Run Code Online (Sandbox Code Playgroud)
它不相似的部分:=是它仅对表达式中存在的术语应用定义而不会更深入(即,它不会评估由于第一个而导致的不同变量集的定义评价).这并不奇怪,因为MATLAB不是基于规则的语言.为了说明我的观点:
y=z^3; %#Define y
f(x)
ans =
(y + 2)^2 %#The definition for y is not used.
Run Code Online (Sandbox Code Playgroud)
而Mathematica会给你(z^3+2)^2.
Clear[y, z, x, f]
f[x_] := x^2;
y := z^3; x := y + 2;
f[x]
Out[1]= (2 + z^3)^2
Run Code Online (Sandbox Code Playgroud)
最好是你接受了两种语言的差异,并试图坚持每种语言中的惯用语.试图否认它并像另一个一样编程可能会让你的生活变得悲惨(例如,从C背景开始并坚定地For在Mathematica中编写循环).