通过圣人中的标量乘以矩阵的矩阵

时间:2012-01-01 02:24:44

标签: 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: 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. 为什么它说不支持2x2矩阵的乘法?
  2. 当我用标量对矩阵进行多次复制时,为什么会出现这种乘法?
  3. 我可以在没有diagonal_matrix作弊的情况下通过标量对矩阵进行多次复制吗?

2 个答案:

答案 0 :(得分:2)

你说得对,这是正确的,但作为替代品,

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

都适合我。如果你需要做很多事情:

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

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

答案 1 :(得分:1)

我想只有一个特殊情况缺失尚未实施。为什么不从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]])