【问题标题】:How do I construct this matrix in an efficient way?如何以有效的方式构建此矩阵?
【发布时间】:2020-04-30 20:29:58
【问题描述】:

我有一个矩阵A,维度为(T,k)。我想为正整数mt1, t2 < T 构造以下块矩阵:

这里,Im 是维度为m 的单位矩阵,A[t,i]Im 是一个对角矩阵,所有对角元素都等于A[t,i]。有没有一种有效的方法来写这个,也许没有任何循环?这是我当前的代码(设置t2 = t, t1 = 0),但效率很低

B = np.zeros([k*m,t*m]) 
for i in range(filter_count):
    for j in range(t): 
        B[i*m:(i+1)*m,j*m:(j+1)*m] = np.diag(np.repeat([A[t-j,i]],m))

【问题讨论】:

  • 试用fliplr(A)I_m 的kronecker 产品查看numpy.kron 上的帮助

标签: python performance matrix vectorization


【解决方案1】:

尝试将fliplr(A) 的Kronecker 乘积与eye(m) 结合使用,例如:

import numpy as np

A = np.array([[1,2,3],[4,5,6]])
Im = np.eye(3)
R = np.kron(np.fliplr(A), Im)

print('A:\n', A)
print('Im:\n', Im)
print('R:\n', R)

打印出来的

A:
 [[1 2 3]
 [4 5 6]]
Im:
 [[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
R:
 [[3. 0. 0. 2. 0. 0. 1. 0. 0.]
 [0. 3. 0. 0. 2. 0. 0. 1. 0.]
 [0. 0. 3. 0. 0. 2. 0. 0. 1.]
 [6. 0. 0. 5. 0. 0. 4. 0. 0.]
 [0. 6. 0. 0. 5. 0. 0. 4. 0.]
 [0. 0. 6. 0. 0. 5. 0. 0. 4.]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多