继续我的matrix multiplication question,我希望在mma中以显式可见形式显示以下表达式:
即使在我给出a11,...,b11,......明确数字的情况下,我仍然希望它以未评估的形式成为(0&& 1)||(1&& 1)。有人可以帮忙吗?
答案 0 :(得分:3)
使用
Inner[And, Array[Subscript[a, ##] &, {2, 2}],
Array[Subscript[b, ##] &, {2, 2}], Or] // MatrixForm
修改即可。跟进了你之前的问题,我想你可能会考虑
Inner[HoldForm[And[##]] &, amat,
bmat, HoldForm[Or[##]] &] // MatrixForm
答案 1 :(得分:2)
(0&&1)||(1&&1)
没有评估,所以我没有看到问题。对于True
和False
您是否尝试过使用HoldForm?
答案 2 :(得分:2)
我不认为这是一个非常好的主意(重载内部功能和所有内容;而且&&&&而不是BitAnd,你想在之前的问题中使用它),但你问了它,你得到了它:
CircleTimes[a_?MatrixQ, b_?MatrixQ] :=
Inner[HoldForm[BitAnd[##]] &, a, b, HoldForm[BitOr[##]] &]
Unprotect[BitAnd];
Unprotect[BitOr];
BitAnd /: Format[BitAnd[a_, b_]] := a && b;
BitOr /: Format[BitOr[a_, b_]] := a || b;
Protect[BitAnd];
Protect[BitOr]
mat1 = Array[Subscript[a, #1, #2] &, {2, 2}];
mat2 = Array[Subscript[b, #1, #2] &, {2, 2}];
将操作定义为CircleTimes的优点是您可以免费获得CircleTimes符号和运算符。
答案 3 :(得分:2)
实现此目的的一种方法是定义自己的矩阵包装器。包装器方法的优点是可以在不影响任何其他功能的情况下重载任意数量的内置函数。
让我们首先定义一个名为myMatrix
的包装器,它使用MatrixForm
显示自己:
Format[myMatrix[m_]] ^:= MatrixForm[m]
接下来,我们会在Times
作用于myMatrix
时重载myMatrix[m1_] myMatrix[m2_] ^:= myMatrix[Inner[And, m1, m2, Or]]
运算符:
^:=
请注意,这两个定义都使用myMatrix
将规则作为up-values附加到m1 = myMatrix[Array[Subscript[a, Row[{##}]]&, {2, 2}]]
。这对于确保常规内置定义不受影响至关重要。
有了这些定义,我们现在可以实现预期目标。为了演示,让我们定义两个矩阵:
m2 = myMatrix[Array[Subscript[b, Row[{##}]]&, {2, 2}]]
Row[{m1, m2}] == m1 m2
现在可以生成所请求的“明确可见的表单”:
Times
...或者,如果您希望在等式的左侧明确引用With[{m1 = m1, m2 = m2}, HoldForm[m1 m2] == m1 m2]
:
Evaluate[First /@ {m1, m2}] = RandomInteger[1, {2, 2, 2}];
接下来,我们将为每个矩阵元素分配随机布尔值:
With[{m1 = m1, m2 = m2}, HoldForm[m1 m2] == m1 m2]
...然后再次使用分配生成明确可见的表单:
{{1}}