gpt4 book ai didi

matlab - MATLAB变量传递和延迟分配

转载 作者:太空宇宙 更新时间:2023-11-03 20:08:05 25 4
gpt4 key购买 nike

我知道在Matlab中,当一个新的变量被分配给一个现有的变量时,会有一个“懒惰”的评价。例如:

array1 = ones(1,1e8);
array2 = array1;

除非修改 array1的元素,否则 array2的值不会复制到 array2
由此,我假设Matlab中的所有变量实际上都是值类型,并且都是按值传递的(尽管使用了延迟计算)这也意味着变量是在调用堆栈上创建的。
好吧,我不是在判断它处理变量的方式,尽管我从未见过第二种编程语言这样做我的意思是,对于像数组这样的大型数据结构,将其视为值类型并按值传递似乎不是一个好主意虽然懒散的评估节省了空间和时间,但对我来说似乎很奇怪您可能有一个用于对导致内存不足错误的变量进行变异(而不是初始化或赋值)的表达式据我所知,在C语言中数组名实际上是指针,在Fortran中,数组是通过引用传递的大多数现代语言都将数组作为引用类型。
那么,有谁能告诉我为什么Matlab使用这样一种不那么常见的方法来实现数组呢在Matlab中,堆上没有或不能创建任何东西,这是真的吗?
顺便问一下,我问过一些有经验的Matlab用户他们只是说,一旦变量被创建,他们就永远不会更改它,并使用函数调用来创建新变量这意味着所有可变数据都是不可变的用这种方式编程有什么得失吗?

最佳答案

你在用一种令人困惑的方式表达你的问题,使用来自编程语言的术语,比如C和FORTRAN,在应用到其他语言时会产生误导。
通过值或引用传递的变量与具有值语义或引用语义的变量之间存在区别。
在C语言中,变量可以按值传递,也可以使用指针按引用传递。
MATLAB没有指针不管告诉你什么,MATLAB总是按值传递变量因为它没有指针,所以询问它是按值传递变量还是按引用传递变量是没有意义的——它必须按值传递。
然而,MATLAB变量可以有值语义或引用语义在MATLAB中,具有引用语义的变量称为句柄变量。
强调-即使变量是按值传递的,它也可以有值或引用语义。
创建常规变量时:

>> a = 1;

变量 a具有值语义这意味着,如果从中创建另一个变量,然后更改原始变量,则新变量不会更改。
>> b = a;
>> b
b =
1
>> a = 2;
>> b
b =
1

但是,如果您创建一个图,例如:
>> f = figure;

变量 f具有引用或句柄语义这意味着,如果从中创建另一个变量,然后更改原始变量,则新变量也会更改。
>> get(f, 'Name')
ans =
''
>> g = f;
>> set(f, 'Name', 'hello')
>> get(g, 'Name')
ans =
hello

使用MATLAB OO类定义自己的变量类型时,可以通过从内置类继承类来指定该类的对象是否具有值或引用/句柄语义。
值类实例的对象的行为与上面的 handle类似;句柄类实例的对象的行为与上面的 a类似。
它们都是按价值传递的。
我猜您的问题的根本原因是:但是我建议您研究一下如何创建handle类它们可能会为您提供您希望实现的可变行为(即,能够传递它,复制它而不显著增加内存,并且它总是指同一个底层事物)。
如果你所说的“有经验的MATLAB用户”只使用值变量,那么他们会损失很多——使用句柄变量通常要方便得多实际上,我敢打赌,他们在使用它们时并没有意识到这一点——几乎所有的MATLAB句柄图形都依赖于句柄变量,如上面的 f
我相信以上是对MATLAB变量语义的完整解释还有一些其他的皱纹会让人困惑,但它们与上述并不矛盾:
尽管MATLAB有传递值行为(如上所述,这与变量是否具有值或引用语义不同),但它也有延迟或写时复制行为您在问题中描述了这一点,所以您显然了解它在做什么,但它只是一个优化,与传递行为或变量语义是一个独立的问题。
正如@Bernhard在评论中提到的,如果您使用类似于 f的语法而不是更普通的 x = myfun(x)来实现函数,那么在某些情况下(特别是在 y = myfun(x)中对 x执行的操作),MATLAB可以对您的代码执行就地优化(即重写原始变量而不是生成临时副本)必须能够在适当的地方完成,如算术或三角函数,而不是矩阵运算,如 myfun会改变维度)但是,这只是一个优化,它不会改变变量的语义。
PS还有一件事-不要再考虑堆栈和堆了;在MATLAB中并没有真正的模拟,因为你不能真正控制变量存储在内存的哪个区域。

关于matlab - MATLAB变量传递和延迟分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38113315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com