我正在尝试使用scipy or numpy
创建以下类型的矩阵。
A_1 = diag(0.5, 0, 0, ...., 0)
A_k = diag(0,0, ..., 1, 0, 0, ....,0) for each 1 < k < N
A_N = diag(0, 0, ...., 0, 0.5)
基本上A_k
是一系列对角矩阵,使得每个A_k
在对角线的第k个位置具有1,并且1 <1。 k&lt; N和A_1
是一个对角矩阵,在其他地方的(1,1)位置零点为0.5,A_N
是一个对角矩阵,在(N,N)位置为0.5,其他地方为零。 / p>
我知道我可以使用scipy
中的稀疏矩阵,我知道如何创建每个单独的矩阵。但是如何创建整个矩阵系列作为可以根据k
调用的函数?
更明确地针对N = 4.
A_1 = diag(0.5, 0, 0, 0)
A_2 = diag(0, 1, 0, 0)
A_3 = diag(0, 0, 1, 0)
A_4 = diag(0, 0, 0, 0.5)
答案 0 :(得分:1)
A_k = np.zeros((n,n))
A_k[k,k] =1
如果=.5
或k==0
,请或k==n-1
或者我错过了一些细微差别?
要使其稀疏,请使用正确大小的lil
。虽然为单个对角线值指定coo
输入也很容易。
答案 1 :(得分:1)
这是一种方法 -
def diag_ndarray(N):
# Initialize o/p array
out = np.zeros((N,N,N))
# Get n-dimensional indices for assigning non-zero values
idx = np.tile(np.arange(N),3).reshape(3,-1)
# Setup non-zero values and assign with subscripted indexing
out[tuple(idx)] = np.hstack((0.5,[1]*(N-2),0.5))
return out
更简单的版本 -
def diag_ndarray_v2(N):
out = np.zeros((N,N,N))
r = np.arange(N)
out[r,r,r] = np.hstack((0.5,[1]*(N-2),0.5))
return out
带有线性索引的更短版本 -
def diag_ndarray_v3(N):
out = np.zeros((N,N,N))
out.ravel()[np.arange(N)*(1+N*(N+1))] = np.hstack((0.5,[1]*(N-2),0.5))
return out
示例运行 -
In [128]: diag_ndarray(N=4)
Out[128]:
array([[[ 0.5, 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ]],
[[ 0. , 0. , 0. , 0. ],
[ 0. , 1. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ]],
[[ 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ],
[ 0. , 0. , 1. , 0. ],
[ 0. , 0. , 0. , 0. ]],
[[ 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0.5]]])