произведение трех матриц заканчивается нечетной блочной матрицей? - PullRequest
4 голосов
/ 15 июня 2011

В следующем бите кода Mathematica

a1 = {{0, -I}, {I, 0}}
a2 = {{0, 1}, {1, 0}}
a3 = {{1, 0}, {0, -1}}
c = I*a1*a2 // MatrixForm
d = c*a3 // MatrixForm

Отображение d отображается в виде матрицы два на два, где элементы 1,1 и 2,2 сами являются матрицами 2x2, тогда как я ожидаюэто будет простая старая матрица скаляров 2х2?

Ответы [ 2 ]

5 голосов
/ 15 июня 2011

Это одна из классических ошибок в Mathematica.

Оболочка экрана MatrixForm имеет более высокий приоритет, чем оператор Set (=).

Предполагая (исходя из выбора тегов), что вы намеревались использовать матричное умножение Dot (.) вместо Times (*), я бы написал

a1 = {{0, -I}, {I, 0}}
a2 = {{0, 1}, {1, 0}}
a3 = {{1, 0}, {0, -1}}
(c = I a1.a2) // MatrixForm
(d = c.a3) // MatrixForm

, который возвращает для c и d соответственно:

(1  0
 0  -1)

(1  0
 0  1)

Edit:
Я забыл упомянуть, если вы введете

c = I a1.a2 // MatrixForm

Затем быстрый взгляд на FullForm из c покажет вам, в чем проблема:

In[6]:= FullForm[c]
Out[6]//FullForm= MatrixForm[List[List[1,0],List[0,-1]]]

Вы можете видеть, что у него есть Head[c] == MatrixForm, и поэтому он не будет хорошо играть с другими матрицами.

5 голосов
/ 15 июня 2011
use () to protect expression from MatrixFrom which is a wrapper.
use '.' for matrix multiplication. Not '*'

a1 = {{0, -I}, {I, 0}}
a2 = {{0, 1}, {1, 0}}
a3 = {{1, 0}, {0, -1}}
(c = I a1.a2) // MatrixForm
(d = c.a3) // MatrixForm

Это вывод, который я получаю для d:

(1  0
 0  1)
...