如何在函数中对列表/矩阵排序?SortA报错解决方案
在Maple函数中实现同步排序的解决方案
你猜的完全正确!SortA和SortD这类原地修改变量的操作确实没法直接在函数里用——Maple的函数(用Func定义的)默认限制了这类有副作用的操作,因为函数设计上更倾向于无副作用的纯逻辑,所以才会抛出「Invalid in a function or current expression」的错误。
不过有两种靠谱的办法能实现你要的同步排序需求,我给你详细说下:
方案一:用排序索引实现无副作用的同步排序(推荐)
这是最稳妥的做法,核心思路是先拿到数组a的排序索引,再用这个索引重新排列a和b,全程不会修改原变量的内容,完全符合函数的设计原则。
代码示例:
Define test()= Func Local a, b, sortIndices; a := [1 5 2 0 4]; b := [1 2 3 4 5]; # 获取a升序排序对应的位置索引 sortIndices := sort(indices(a)[2], (i,j)->a[i] < a[j]); # 根据索引重新生成排序后的a和b a := a[sortIndices]; b := b[sortIndices]; Return colAugment(a,b); EndFunc
逻辑拆解:
indices(a)[2]会提取数组a的所有位置索引(这里就是[1,2,3,4,5]);- 用
sort配合自定义比较器,根据a中对应位置的数值大小来排序索引,得到的sortIndices就是a升序排列时的位置顺序; - 最后用这个索引数组去取
a和b的元素,就实现了和SortA完全一样的同步排序效果。
这个方案的返回结果就是你想要的[0 1 2 4 5; 4 1 3 5 2],而且没有副作用,代码逻辑也更清晰。
方案二:声明可修改的局部变量(不推荐)
如果你一定要用SortA这类原地修改函数,可以在声明局部变量的时候加上:=,标记它是可被修改的「assignable变量」。不过这种方式会引入副作用,函数逻辑复杂时容易出bug,所以只建议临时用用。
代码示例:
Define test()= Func Local a:=, b:=; # 用:=声明变量允许被原地修改 a := [1 5 2 0 4]; b := [1 2 3 4 5]; SortA a,b; Return colAugment(a,b); EndFunc
这样修改后,SortA就能正常在函数里运行了,但还是更推荐第一种方案哦。
内容的提问来源于stack exchange,提问作者cherryblossom
相关产品推荐
相关产品推荐

