5

所以,我最近从 Mathematica 转换到了 Matlab,虽然 Matlab 具有 Mathematica 的大部分有用功能,但我不知道如何执行 Mathematica 的延迟集合操作 ':=' 的等效项,它为变量分配一个值懒惰的时尚。

例如,在 Mathematica 中:

y = 2;

x := y;

y = 3;

X

将 x 的值设为 3,而我在 Matlab 中获得相同行为的唯一方法是:

y = 2;

x = @()(y);

y = 3;

X()

在技​​术上回答我的问题时,这是一个非常临时的工作,需要将 x 视为一个函数。

那么有没有更自然的方法来做到这一点是Matlab?

编辑:

我的临时解决方案仅在 y 是句柄类的字段时才有效,为了清楚起见,我将其从代码中省略(它应该是 someclass.y)。最好我的问题的答案不会有这个限制,但如果有的话我仍然会接受。

4

2 回答 2

5

惰性求值主要用于函数式编程语言,而 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   

您可以看到它使用 的实际定义,并且没有像在您的数值示例中那样f捕获 的定义。x您还可以更改xto say的定义x=1/yf(x)现在将使用 的当前定义x。请注意,这f只是一个函数句柄,将采用数字/符号参数。例如,

f(1:5)

ans =

     1     4     9    16    25

它不相似的部分是它仅对:=表达式中存在的术语应用定义并且没有更深入(即,它不评估可能由于第一个结果而出现的不同变量集的定义评估)。这并不奇怪,因为 MATLAB 不是基于规则的语言。为了说明我的观点:

y=z^3; %#Define y
f(x)

ans = 
(y + 2)^2 %#The definition for y is not used.

而 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

最好是接受这两种语言的差异,并尝试坚持每种语言的惯用语。试图否认它并像另一个一样编程可能会让你的生活变得悲惨(例如,从 C 背景开始,并坚定地For在 Mathematica 中编写循环)。

于 2011-07-29T22:30:20.203 回答
3

实际上,您提出的解决方案没有按预期工作:

y = 2;
x = @()(y);
y = 3;
x()

当您定义匿名函数时,它会创建一个闭包并捕获/复制当时的值y(现在它有自己的副本y)。然后,如果您更改y外部的,它不会影响在闭包中创建的那个,因此在您的示例中,最后一个值不会2返回3

我能想到的唯一方法是将变量封装在闭包中并公开 set/get 方法(就像在 OOP 中一样)

IMO、MATLAB 和 Mathematica 有两种截然不同的语言,因此我会采用 MATLAB 方式,而不是尝试模拟其他语言的功能(这通常不是最好的做法)

于 2011-07-29T21:37:35.530 回答