Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要构造一个特定的矩阵,其中一些元素本身就是矩阵[python]。块三对角矩阵_Python_Numpy - Fatal编程技术网

我需要构造一个特定的矩阵,其中一些元素本身就是矩阵[python]。块三对角矩阵

我需要构造一个特定的矩阵,其中一些元素本身就是矩阵[python]。块三对角矩阵,python,numpy,Python,Numpy,我有生成B和I的那部分代码: import numpy as np import scipy.sparse.linalg as sc size = 10 #1. create the matrix B and I def matrix(size): dx = size / (size - 1) B = np.identity(size ) * (-4) counter = 0 sizeCounter = size for i in range(1, s

我有生成B和I的那部分代码:

import numpy as np
import scipy.sparse.linalg as sc

size = 10

#1. create the matrix B and I
def matrix(size):
    dx = size / (size - 1)
    B = np.identity(size ) * (-4)
    counter = 0
    sizeCounter = size
    for i in range(1, size):
        B[i, counter] = 1
        B[counter, i] = 1
        counter += 1
    B[0,:]=0
    B[:,0]=0
    B[size-1,:]=0
    B[:,size-1]=0

    I=np.identity(size)
    I[0,:]=0
    I[:,0]=0
    I[size-1,:]=0
    I[:,size-1]=0


    return B,I

我想生成一个平方(大小^2)x(大小^2)矩阵M。所以如果大小是10,M将是100x100。M将在所附图片处填写以下表格。。我该怎么做?

您可以使用
np.concatenate
来构建矩阵矩阵的每一行

B, I = matrix(size)
A = np.zeros((size, size))

M = []
for i in range(size):
    if i == 0:
        M.append(np.concatenate([ B, I, np.tile(A, (1, size-2)) ], axis = -1 ))
    elif i == size-1:
        M.append(np.concatenate([ np.tile(A, (1, size-2)), I, B ], axis = -1))
    else:
        M.append(np.concatenate([ np.tile(A, (1, i-1)), I, B, I, np.tile(A, (1, size-i-2))], axis = -1))
M = np.concatenate(M, axis = 0)
使用列表理解:

M = np.concatenate([
        np.concatenate([ B, I, np.tile(A, (1, size-2)) ], axis = -1 ) if i == 0 else
        np.concatenate([ np.tile(A, (1, size-2)), I, B ], axis = -1) if i == size-1
        else np.concatenate([ np.tile(A, (1, i-1)), I, B, I, np.tile(A, (1, size-i-2))], axis = -1)
        for i in range(size)], axis = 0)

您可以使用
np.concatenate
构建矩阵矩阵的每一行

B, I = matrix(size)
A = np.zeros((size, size))

M = []
for i in range(size):
    if i == 0:
        M.append(np.concatenate([ B, I, np.tile(A, (1, size-2)) ], axis = -1 ))
    elif i == size-1:
        M.append(np.concatenate([ np.tile(A, (1, size-2)), I, B ], axis = -1))
    else:
        M.append(np.concatenate([ np.tile(A, (1, i-1)), I, B, I, np.tile(A, (1, size-i-2))], axis = -1))
M = np.concatenate(M, axis = 0)
使用列表理解:

M = np.concatenate([
        np.concatenate([ B, I, np.tile(A, (1, size-2)) ], axis = -1 ) if i == 0 else
        np.concatenate([ np.tile(A, (1, size-2)), I, B ], axis = -1) if i == size-1
        else np.concatenate([ np.tile(A, (1, i-1)), I, B, I, np.tile(A, (1, size-i-2))], axis = -1)
        for i in range(size)], axis = 0)

这里有三种可能性:

首先,构建构建模块:

我用
einsum
来写对角线

>>> import numpy as np
>>> 
>>> size = 6
>>> 
>>> O, B, I = OBI = np.zeros((3, size, size))
>>> np.einsum('ii->i', I[1:-1, 1:-1])[:] = 1
>>> np.einsum('ii->i', B[1:-1, 1:-1])[:] = -4
>>> np.einsum('ii->i', B[1:-2, 2:-1])[:] = 1
>>> np.einsum('ii->i', B[2:-1, 1:-2])[:] = 1
接下来,构建容器:

我正在使用
toeplitz
构建(标量)三对角矩阵

>>> from scipy import linalg
>>>
>>> T = np.zeros((size,), dtype=int)
>>> T[:2] = 1, 2
>>> T = linalg.toeplitz(T)
解决方案1:

使用
np.块进行组合

>>> M1 = np.block(list(map(list, OBI[T])))
解决方案2:

使用
重塑
组合:

>>> M2 = OBI[T].swapaxes(1, 2).reshape(size*size, size*size)
解决方案3:

使用
np.kron

>>> Tm1 = np.zeros((size,))
>>> Tm1[1] = 1
>>> Tm1 = linalg.toeplitz(Tm1)
>>> 
>>> M3 = np.kron(np.identity(size,), B) + np.kron(Tm1, I)

这里有三种可能性:

首先,构建构建模块:

我用
einsum
来写对角线

>>> import numpy as np
>>> 
>>> size = 6
>>> 
>>> O, B, I = OBI = np.zeros((3, size, size))
>>> np.einsum('ii->i', I[1:-1, 1:-1])[:] = 1
>>> np.einsum('ii->i', B[1:-1, 1:-1])[:] = -4
>>> np.einsum('ii->i', B[1:-2, 2:-1])[:] = 1
>>> np.einsum('ii->i', B[2:-1, 1:-2])[:] = 1
接下来,构建容器:

我正在使用
toeplitz
构建(标量)三对角矩阵

>>> from scipy import linalg
>>>
>>> T = np.zeros((size,), dtype=int)
>>> T[:2] = 1, 2
>>> T = linalg.toeplitz(T)
解决方案1:

使用
np.块进行组合

>>> M1 = np.block(list(map(list, OBI[T])))
解决方案2:

使用
重塑
组合:

>>> M2 = OBI[T].swapaxes(1, 2).reshape(size*size, size*size)
解决方案3:

使用
np.kron

>>> Tm1 = np.zeros((size,))
>>> Tm1[1] = 1
>>> Tm1 = linalg.toeplitz(Tm1)
>>> 
>>> M3 = np.kron(np.identity(size,), B) + np.kron(Tm1, I)