Matrix 用sage中的标量乘以矩阵的矩阵

Matrix 用sage中的标量乘以矩阵的矩阵,matrix,matrix-multiplication,sage,Matrix,Matrix Multiplication,Sage,我已经创建了一个由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: unsupp

我已经创建了一个由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'
这看起来很奇怪,因为整型环上2乘2密集矩阵的完整矩阵空间是子矩阵的父矩阵(
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
以下是问题:

  • 为什么它说2x2矩阵的乘法不受支持
  • 当我将矩阵乘以标量时,为什么会出现这种乘法
  • 我可以将矩阵乘以一个标量而不使用
    对角矩阵

  • 你说得对,这应该行得通,但作为替代品

    sage: (3 * identity_matrix(2)) * a
    sage: a * (3 * identity_matrix(2))
    
    两者都为我工作。如果您需要经常这样做:

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

    您可以将其视为bug,也可以将其视为尚未实现的功能(与误导性错误消息结合)。我已经在上报告过了。

    我想只是缺少了一个尚未实施的特殊案例。为什么不使用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]])
    

    你试过把常数放在前面吗?@ChristianJonassen,是的,
    3*a
    a*3