Mathematica变量共享内存问题~
mathematica吧
全部回复
仅看楼主
level 4
任道正 楼主
如果有一个矩阵mtx_a,对该矩阵进行切片处理并赋值,如:
mtx_a[[1;;-1;;2,1;;-1;;2]]=mtx_tmp;
接着打印矩阵mtx_a,可以观察到mtx_a中的部分元素已经变成了mtx_tmp,这说明对矩阵mtx_a的切片与矩阵mtx_a共享同一块内存,并没有为其切片分配新的内存空间;
如果我们令
mtx_b = mtx_a[[1;;-1;;2,1;;-1;;2]];
mtx_b = mtx_tmp
接着打印矩阵mtx_a,可以观察到mtx_a并无任何改变,说明mtx_b被分配了新的内容空间,故对mtx_b的任何赋值均不影响mtx_a;但如果我不想改mtx_b分配新的内存空间,而是想让其指向mtx_a[[1;;-1;;2,1;;-1;;2]]的内存空间,可通过对mtx_b赋值影响到mtx_a的值,应该怎么做呢?
2018年09月27日 08点09分 1
吧务
level 15
简单地说就是,似乎没有。
顺便,你第一段代码里的方法,应该是目前Mathematica里唯一的按地址修改列表元素的方法。(其他方法都是要先复制一份再改。)
顺便,可能有人会基于C语言的经验,认为SetDelayed(:=)做的是按址传递而Set(=)做的是按值传递,
这是错误的。这点只要测测效率就能证明:
a = 1;
b := a;
c = a;
Do[a, {10^7}] // AbsoluteTiming
Do[b, {10^7}] // AbsoluteTiming
Do[c, {10^7}] // AbsoluteTiming
(*
{0.368019, Null}
{1.006275, Null}
{0.374992, Null}
*)
2018年10月05日 18点10分 3
吧务
level 13
功能是可以实现的, 但和C中指针的概念有一点区别
例如:
a = {1, 2, 3}
b /: f_[v1___, b, v2___] /; (f =!= ClearAll) := f[v1, a[[1 ;; 2]], v2]
"劫持"掉所有函数中的b(如果不加黑名单就很难受了)
10/6/18 11:32:54 In[38]:= b = 0
10/6/18 11:32:54 Out[38]= 0
10/6/18 11:32:56 In[39]:= a
10/6/18 11:32:56 Out[39]= {0, 0, 3}
确保每个输入表达式为函数
If[! ValueQ[$Pre], $Pre = Identity]
2018年10月06日 03点10分 4
……只是模拟行为的话用SetDelayed就可以了吧?: a = {1, 2, 3}; a[[1 ;; 2]] := b
2018年10月06日 06点10分
@xzcyr ???lz不是想用b来表示a的一部分么?
2018年10月06日 06点10分
@隨意超 ……这是用b表示了a的一部分啊,“可通过对mtx_b赋值影响到mtx_a的值”这个要求也达成了。
2018年10月06日 07点10分
@xzcyr 理解你的意思了,第一次见这种操作. 不过这种办法有两个问题,会改动a的定义,无法分配子列表.
2018年10月06日 08点10分
1