Показать в явном виде в Mathematica - PullRequest
2 голосов
/ 10 марта 2011

Продолжая мой вопрос умножения матриц , я хочу показать следующее выражение в явном виде для просмотра в mma:

the form I want to show in mma

Даже если в случае, когда я даю явные числа a11, ..., b11, ..., я все же хочу, чтобы это было (0 && 1) || (1 && 1) в неоцененной форме. Может ли кто-нибудь помочь, пожалуйста?

Ответы [ 4 ]

3 голосов
/ 10 марта 2011

Использование

Inner[And, Array[Subscript[a, ##] &, {2, 2}], 
  Array[Subscript[b, ##] &, {2, 2}], Or] // MatrixForm

enter image description here

Редактировать .Разобравшись с вашим предыдущим вопросом, я думаю, вы могли бы рассмотреть

Inner[HoldForm[And[##]] &, amat, 
  bmat, HoldForm[Or[##]] &] // MatrixForm

enter image description here

2 голосов
/ 10 марта 2011

Один из способов добиться этого - определить собственную матрицу обертка . Преимущество такого подхода заключается в том, что вы можете перегружать столько встроенных функций, сколько захотите, не влияя на другие функции.

Давайте начнем с определения оболочки, называемой 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}]]

mathematica output

m2 = myMatrix[Array[Subscript[b, Row[{##}]]&, {2, 2}]]

mathematica output

Запрошенная «явно видимая форма» теперь может быть сгенерирована следующим образом:

Row[{m1, m2}] == m1 m2

mathematica output

... или, если вы предпочитаете явно указывать Times в левой части уравнения:

With[{m1 = m1, m2 = m2}, HoldForm[m1 m2] == m1 m2]

mathematica output

Далее мы назначим случайные логические значения для каждого из элементов матрицы:

Evaluate[First /@ {m1, m2}] = RandomInteger[1, {2, 2, 2}];

... и затем сгенерируйте явно видимую форму еще раз с назначениями на месте:

With[{m1 = m1, m2 = m2}, HoldForm[m1 m2] == m1 m2]

mathematica output

2 голосов
/ 10 марта 2011

Я не думаю, что это действительно хорошая идея (перегрузка внутренних функций и всего остального; & & is is, а не 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}];

output of newly defined CircleTimes

Преимущество определения операции как CircleTimes состоит в том, что вы получаете символ и оператор CircleTimes бесплатно.

2 голосов
/ 10 марта 2011

(0&&1)||(1&&1) не оценивает, поэтому проблемы не вижу. Для True и False пробовали ли вы использовать HoldForm?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...