说我有一个维度k
。我正在寻找的是一个以k
作为输入并返回以下块矩阵的函数。
设I
为k维单位矩阵,0
为零维k维方阵
那是:
def function(k):
...
return matrix
function(2) -> np.array([I, 0])
function(3) -> np.array([[I,0,0]
[0,I,0]])
function(4) -> np.array([[I,0,0,0]
[0,I,0,0],
[0,0,I,0]])
function(5) -> np.array([[I,0,0,0,0]
[0,I,0,0,0],
[0,0,I,0,0],
[0,0,0,I,0]])
也就是说,输出是一个(k-1,k)矩阵,其中单位矩阵在对角元素上,零矩阵在其他地方。
我尝试了什么:
我知道如何创建任何单独的行,我只是想不出将其放入函数的方法,以便它需要一个维度k
,并吐出我需要的矩阵。
e.g。
np.block([[np.eye(3),np.zeros((3, 3)),np.zeros((3, 3))],
[np.zeros((3, 3)),np.eye(3),np.zeros((3, 3))]])
是k = 3
的理想输出scipy.linalg.block_diag似乎可能在正确的轨道上......
答案 0 :(得分:3)
IMO,np.eye
已经拥有了您需要的一切,因为您可以分别定义行数和列数
所以你的功能应该简单地看起来像
def fct(k):
return np.eye(k**2-k, k**2)
答案 1 :(得分:1)
如果我理解正确,这应该有效:
a = np.concatenate((np.eye((k-1)*k),np.zeros([(k-1)*k,k])), axis=1)
(至少,当我设置k=3
并与您提供的np.block(...)
表达式进行比较时,两个结果都相同)
答案 2 :(得分:0)
IIUC,您也可以尝试np.fill_diagonal
,以便创建正确的矩阵形状,然后填写对角线部分。
def make_block(k):
arr = np.zeros(((k-1)*k, k*k))
np.fill_diagonal(arr, 1)
return arr
答案 3 :(得分:-1)
您的问题有两种解释。一个是你基本上创建一个[[1,0,0],[0,1,0]]形式的矩阵,它可以在数学上表示为[I 0],另一个在每个元素包含它自己的numpy数组完全(这确实会降低计算能力但可能是你想要的)。
前者:
np.append(np.eye(k-1), np,zeros((k-1, 1)), axis=1)
后者(有点复杂):
I = np.eye(m) #Whatever dimensions you want, although probably m==n
Z = np.eye(n)
arr = np.zeros((k-1, k)
for i in range(k-1):
for j in range(k):
if i == j:
arr[i,j] = np.array(I)
else:
arr[i,j] = np.array(Z)
我真的不知道第二个是如何有用的,所以我认为你可能会对块矩阵的基本结构感到困惑,如果这是你想要的那样。通常[A b],例如,A是矩阵而b是矢量,通常被认为现在表示单个矩阵,为简单起见,仅存在块符号。希望这有帮助!