从一个矩阵定义一个对角矩阵

2024-04-25 14:47:41 发布

您现在位置:Python中文网/ 问答频道 /正文

如何从矩阵a构造对角矩阵D 对角线矩阵D的第一个元素必须是矩阵A的次对角线上所有元素的乘积,对角线矩阵D的第二个元素必须是矩阵A的次对角线上除第一个元素外所有元素的乘积,对角线矩阵D中的第三个元素必须是除第一个元素和第二个元素外矩阵A的次对角线中所有元素的乘积,。。。。,对角矩阵D的最后一个元素必须是1


Tags: 元素矩阵乘积对角对角线
1条回答
网友
1楼 · 发布于 2024-04-25 14:47:41

这里有一种方法:

def subdiag_prod_(a):
    sub_diag = np.diagonal(a, offset=-1)
    mask = np.triu(np.ones((sub_diag.shape*2))).astype('bool')
    m = sub_diag[:,None].T * mask
    ma = np.ma.array(sub_diag[:,None].T * mask, mask=~mask)
    diag = np.prod(ma, axis=1).data
    out = np.diag(diag)
    last_row = np.zeros([out.shape[0]+1]*2)
    last_row[:out.shape[0], :out.shape[1]] += out
    return last_row

a = np.random.randint(1,5,(10,10))

array([[2, 2, 1, 4, 3, 1, 3, 1, 4, 4],
       [2, 2, 2, 1, 1, 2, 3, 2, 2, 2],
       [4, 2, 2, 4, 2, 1, 3, 3, 3, 4],
       [2, 3, 3, 1, 1, 1, 4, 2, 3, 4],
       [3, 3, 1, 1, 2, 1, 3, 4, 4, 3],
       [1, 4, 4, 1, 1, 4, 1, 1, 1, 4],
       [4, 2, 3, 2, 1, 4, 4, 1, 3, 2],
       [4, 2, 2, 4, 4, 4, 1, 4, 3, 1],
       [1, 3, 1, 1, 2, 2, 2, 3, 4, 1],
       [1, 3, 2, 2, 3, 4, 1, 3, 2, 1]])

subdiag_prod(a)

array([[288.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.],
       [  0., 144.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,  72.,   0.,   0.,   0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,  24.,   0.,   0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0.,  24.,   0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.,  24.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.,   0.,   6.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.,   0.,   0.,   6.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   2.,   0.],
       [  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   1.]])

详细信息

第一步是使用np.diagonal进行ndarray的次对角线:

sub_diag = np.diagonal(a, offset=-1)
# array([2, 2, 3, 1, 1, 4, 1, 3, 2])

我们可以使用np.tril创建一个mask,然后我们可以使用它以指定的方式获取次对角线元素i的乘积:

mask = np.triu(np.ones((sub_diag.shape*2))).astype('bool')

现在我们可以创建一个掩码数组,使用上面的ndarray作为掩码,将掩码和次对角线相乘:

mask = np.ma.array(sub_diag[:,None].T * mask, mask=~mask)

现在我们可以取屏蔽数组的行积:

d = np.prod(ma, axis=1).data
# array([288, 144,  72,  24,  24,  24,   6,   6,   2])

然后简单地用它建立一个二元矩阵:

out = np.diag(d)
last_row = np.zeros([out.shape[0]+1]*2)
last_row[:out.shape[0], :out.shape[1]] += out

相关问题 更多 >