为何Mathematica中SparseArray不替换函数传入的变量?
Mathematica中SparseArray定义函数时参数不替换的问题分析
先复现你遇到的异常代码:
In[132]:= M[d_] = Normal[SparseArray[{1, 1} -> d]] Out[132]= {{d}} In[133]:= M[1] Out[133]= {{1}} In[134]:= M[d_] = SparseArray[{1, 1} -> d] Out[134]= {0}[{d}] In[136]:= M[1] // Normal Out[136]= {{d}}
问题原因
这是Mathematica中SparseArray的延迟求值特性导致的:
- 第一个定义里,
Normal会立即触发SparseArray的求值过程,把函数参数d和规则里的d绑定,调用M[1]时能正常替换参数值。 - 直接赋值SparseArray时,Mathematica不会立即求值SparseArray内部的规则,只是把
SparseArray[{1, 1} -> d]作为带模式的表达式存储。当调用M[1]时,仅完成了函数头部d_与1的匹配,但SparseArray内部的d仍是未被替换的原始符号,所以执行Normal后得到的还是{{d}}。
解决方法
用Evaluate强制SparseArray在定义时完成参数绑定:
M[d_] = Evaluate[SparseArray[{1, 1} -> d]]
此时调用M[1] // Normal就能得到预期的{{1}}。
内容的提问来源于stack exchange,提问作者Sergey Slizovskiy
相关产品推荐
相关产品推荐

