Умножить матрицу матриц на скаляр в шалфее

Я создал матрицу 2x2 из матриц 2x2:

a = matrix([[matrix([[ 1,  2], [ 3,  4]]),
             matrix([[ 5,  6], [ 7,  8]])],
            [matrix([[ 9, 10], [11, 12]]),
             matrix([[13, 14], [15, 16]])]])

Когда я умножаю его на число (например, введите a*3), возникает следующая ошибка:

TypeError: unsupported operand parent(s) for '*':
           'Full MatrixSpace of 2 by 2 dense matrices over Integer Ring' and
           'Full MatrixSpace of 2 by 2 dense matrices over Integer Ring'

Это выглядит странно, потому что Full MatrixSpace of 2 by 2 dense matrices over Integer Ring является родителем подматриц (parent(a[0,0])), и я могу без проблем их умножить:

sage: a[0,0]*a[0,0]
[ 7 10]
[15 22]

Любая из следующих команд работает нормально:

sage: a[0,0]*3
sage: a[0,0]*a[0,0]
sage: a[0,0]*a
sage: a*a
sage: a[0,0]*3*a
sage: diagonal_matrix([3]*2)*a    # I don't want do this every time!

но это не так:

sage: a*3            #TypeError
sage: a[0,0]*a*3     #TypeError

Итак, вот вопросы:

  1. почему написано, что умножение матриц 2х2 не поддерживается?
  2. почему это умножение появляется, когда я умножаю матрицу на скаляр?
  3. могу ли я умножить матрицу на скаляр без чита diagonal_matrix?

person Maksim Zholudev    schedule 01.01.2012    source источник
comment
Вы пытались просто поставить константу впереди?   -  person Christian Neverdal    schedule 01.01.2012
comment
@ChristianJonassen, да, результат одинаков как для 3*a, так и для a*3   -  person Maksim Zholudev    schedule 01.01.2012


Ответы (2)


Вы правы, это должно работать, но в качестве замены,

sage: (3 * identity_matrix(2)) * a
sage: a * (3 * identity_matrix(2))

оба работают на меня. Если вам нужно сделать это много:

sage: id = identity_matrix(2)
sage: 3 * id * a

Вы можете рассматривать это как ошибку или как еще не реализованную функцию (в сочетании с вводящим в заблуждение сообщением об ошибке). Я сообщил об этом в системе отслеживания ошибок Sage.

person John Palmieri    schedule 17.05.2012

Я предполагаю, что отсутствует только особый случай, который еще не реализован. Почему бы не использовать многомерные массивы из numpy?

sage: import numpy
sage: x = numpy.arange(16)
sage: x.shape = (2,2,2,2)
sage: x
array([[[[ 0,  1],
         [ 2,  3]],
        [[ 4,  5],
         [ 6,  7]]],
       [[[ 8,  9],
         [10, 11]],
        [[12, 13],
         [14, 15]]]])

sage: 3*x
array([[[[ 0,  3],
         [ 6,  9]],
        [[12, 15],
         [18, 21]]],
       [[[24, 27],
         [30, 33]],
        [[36, 39],
         [42, 45]]]])

sage: x[0,0]
array([[0, 1],
       [2, 3]])

sage: x[0,0] * x[1,0]
array([[ 0,  9],
       [20, 33]])

sage: x[0,0].dot(x[1,0]) 
array([[10, 11],
       [46, 51]])
person Harald Schilly    schedule 17.05.2012