GP/Pari中能否通过传引用修改容器(矩阵)的大小?
在GP/Pari中通过传引用修改容器大小的问题
问题原因分析
GP/Pari的传引用(~符号)仅支持修改容器已有元素的值,但当你执行x=concat(x,2)这类操作时,本质是创建了一个全新的容器对象,然后将参数x重新绑定到这个新对象上——原容器(比如示例中的v)的引用并未被更新,所以原变量不会发生变化,这是符合GP/Pari设计逻辑的行为。
可行的传引用实现方式
如果要通过传引用直接修改原容器的大小,不要使用concat生成新对象,而是直接扩展原容器的长度并赋值新元素:
数组示例
v=[1]; r(~x)=x[#x+1]=2; # #x获取当前元素数量,直接给下一个位置赋值 r(~v); v # 结果为 [1,2]
矩阵示例(行矩阵扩展列)
m=[1,2]; add_col(~m)=m[, #m[1]+1] = 3; # 为新列赋值 add_col(~m); m # 结果为 [1,2,3]
传值重新赋值的场景
如果一定要使用concat,则只能通过传值调用,再将返回的新容器重新赋值给原变量:
r(x)=concat(x,2); v=r(v); # v更新为 [1,2]
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

