如何在Mathematica中为矩阵乘法重载Times和Plus操作符

3
我希望能够在Mathematica中为矩阵乘法重载TimesPlus。例如,让Times成为BitAnd,让Plus成为BitOr,然后进行矩阵乘法。
有没有简单的方法可以做到这一点,而不必重新编写自己的矩阵乘法?
谢谢。

请注意,重新定义内置的 Times 将破坏任何期望矩阵上的 Times 的标准行为的 Mathematica 函数。更安全的替代方法是定义 MyTimes 并使用符号说明包来赋予它自己的外观和快捷方式。 - Yaroslav Bulatov
3
重载的概念不是为其他数据类型提供运算符功能吗?在这种情况下,矩阵已经定义了乘法。那么,您想要失去此预定义含义,并用位与和位或行为覆盖它吗?为什么不只是使用后者的功能呢?或者您想要使用它们的符号?有更好的解决方案。 - Sjoerd C. de Vries
1个回答

4
问题是你想要改变什么-是 TimesPlus 的行为,还是 Dot。通常情况下,Block 技巧是最简单的方法。在这种情况下,由于 Dot 没有调用高级的 Plus 或者 Times,所以你可以这样做:
mat1 = {{1,2},{3,4}};
mat2= {{5,6},{7,8}};
Block[{Dot = Inner[BitAnd,#1,#2,BitOr]&},
  mat1.mat2]

{{3,0},{5,2}}

但请注意,这实际上是重新实现了矩阵乘法(使用Inner) - 没有其他方法,因为Dot是在内部实现的,不使用PlusTimes


5
在任何情况下都不应过度使用加号或乘号。Leonid Shifrin的方法是完成这个特定任务的好方法。虽然在一般情况下没有必要改变块内的点运算,因为你可以定义一个名为“myDot”的函数来替代。 - Daniel Lichtblau
@Daniel 感谢您阐明了这一点。我也犯过这种错误(重载Times或Plus)几次,尤其是在学习mma时,但我总觉得不太对劲。 - Leonid Shifrin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接