我们知道,赋值等过程中使用 MatrixForm
往往会导致后续的计算失效。比如:
对于这个问题,最正统的解决办法当然是在赋值等计算过程中不使用 MatrixForm
,而只在显示时以 MatrixForm
呈现[1]。典型的方案是在输出部分才加上 MatrixForm
包装。不过对于既有代码的问题,一个个手动修改可能略显麻烦,这时可以借助 EchoFunction
在实现类似效果的同时保持代码结构基本不变:
要将既有代码调整为这种方式,只需简单的文本替换就可以实现目标。
不过,本文要主要要谈的并不是这类传统解决方案,而是通过给 Mathematica 系统打上补丁来实现几乎零修改的解决方案。
我们知道,MatrixForm
这类格式封装,当它位于结果的最外层时,Out
输出历史中不会对其进行储存[2]。事实上,所有在 $OutputForms
中的格式封装都具有这样的性质。
受此启发,我们不妨把这个性质推广到赋值的情况上来,即这类格式封装出现在赋值运算的右侧时不会将其记录到赋值中。事实上,通过重载 Set
的定义很容易实现这一功能:
1 | GeneralUtilities`BlockProtected[{Set}, |
效果如图:
参考: