【问题标题】:how to overload Times and Plus for matrix multiplication in mathematica如何在mathematica中重载Times和Plus以进行矩阵乘法
【发布时间】:2011-03-10 05:30:01
【问题描述】:

我想重载TimesPlus 用于mathematica 中的矩阵乘法,例如让TimesBitAnd,Plus 为BitOr,然后进行矩阵乘法。

有没有办法以简单的方式做到这一点,而无需重写我自己的矩阵乘法?

谢谢。

【问题讨论】:

  • 请注意,重新定义内置 Times 将破坏任何期望矩阵上 Times 的标准行为的 Mathematica 函数。更安全的选择是定义 MyTimes 并使用 Notation 包赋予它自己的外观和快捷方式
  • 重载的想法不是为其他数据类型提供运算符功能吗?在这种情况下,已经为矩阵定义了 Times。那么,您是否想失去这个预定义的含义并用 BitAnd 和 BitOr 行为覆盖它?你为什么不直接使用后面的功能呢?或者你想使用他们的符号吗?有更好的解决方案。

标签: wolfram-mathematica


【解决方案1】:

问题是您想要改变什么 - TimesPlusDot 的行为。通常,Block 技巧通常是最简单的方法。在这种情况下,由于Dot不会调用高层PlusTimes,你可以这样做:

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

【讨论】:

  • 在任何情况下都不应该超载 Plus 或 Times。 Leonid Shifrin 的方法是完成这项特殊任务的好方法。虽然在 Block 中更改 Dot 对于一般用途来说并不是真正必要的,因为您可以定义 myDot 或类似的东西。
  • @Daniel 感谢您说清楚。我过去曾几次(主要是在我学习 mma 时)这样做(重载 Times 或 Plus)而感到内疚,但我总是对此有一种不好的感觉。
猜你喜欢
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 2012-03-05
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
相关资源
最近更新 更多