Один из способов добиться этого - определить собственную матрицу обертка . Преимущество такого подхода заключается в том, что вы можете перегружать столько встроенных функций, сколько захотите, не влияя на другие функции.
Давайте начнем с определения оболочки, называемой myMatrix
, которая отображает себя, используя MatrixForm
:
Format[myMatrix[m_]] ^:= MatrixForm[m]
Далее мы перегрузим оператор Times
, когда он действует на myMatrix
:
myMatrix[m1_] myMatrix[m2_] ^:= myMatrix[Inner[And, m1, m2, Or]]
Обратите внимание, что оба определения используют ^:=
для присоединения правил к myMatrix
в качестве повышающих значений. Это крайне важно для обеспечения того, чтобы обычные встроенные определения не затрагивались иным образом.
Вооружившись этими определениями, мы теперь можем достичь желаемой цели. Чтобы продемонстрировать, давайте определим две матрицы:
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]