Python ..创建一个矩阵

时间:2013-04-27 05:31:22

标签: python numpy

实际上下面的代码是做什么的? 特别是指数一......

据我了解, 对于“A,b = create_matrix_1(4,4)” 矩阵A是16 * 16; b是16 * 1

我在理解这个问题时遇到了一些麻烦。任何见解都将不胜感激

def create_matrix_1(n,m,force=0.0): 
    """ 
      Create a matrix associated with a tension force to a membrane. 
      The domain is represented by a 2D grid of size n*m 
    """ 

    hx = 1.0/(n-1) 
    hy = 1.0/(m-1) 

    hx2 = 1.0/hx**2 
    hy2 = 1.0/hy**2 

    x = linspace(0,1,n) 
    y = linspace(0,1,m) 

    A = lil_matrix((n*m, n*m)) 
    b = zeros(n*m) 
    for i in range(n): 
            for j in range(m): 
                    index = i + j*n 
                    if( i==0 or i==n-1 or j==0 or j==m-1): # Boundary nodes 
                            b[index] = saddle_function(x[i],y[j]) 
                            A[index,index] = 1.0 
                    else: # Interior Nodes 
                            b[index] = force 
                            A[index,index] = -2.0*(hx2 + hy2) 
                            A[index,index+1] = hx2 
                            A[index,index-1] = hx2 
                            A[index,index+n] = hy2 
                            A[index,index-n] = hy2 
    return A,b

1 个答案:

答案 0 :(得分:2)

  

根据我的理解,对于“A,b = create_matrix_1(4,4)”矩阵A.   是16 * 16; b是16 * 1

不一定:在上面的代码中,我们没有函数lil_matrixzeros的定义。 for循环之前的语句只表示当A作为元组传递给它时,lil_matrix等于函数(n*m, n*m)返回的值。另一方面,b等于函数zeros返回的值,当您传递给它n*m时。

然后是循环部分。 基本上,有两个嵌套循环,即有两个迭代器,i和j,它们分别从0增加到n-1和0到m-1;所以,假设n = 4且m = 4:

1)我们首先迭代j的所有值,i=0

Iteration    Value of index

1            0+0*4
2            0+1*4
3            0+2*4
4            0+3*4

2)现在,jj=0的所有j=m-1值都已循环显示,我们会​​增加i,然后我们再次遍历{的所有值{1}}:

j

3)然后我们为5 1+0*4 6 1+1*4 7 1+2*4 8 1+3*4 i=2等重复相同的周期,直至i=3

现在我们转到i=n-1if块。对于上述每个周期,如果我们有一个边界值,即elsei处于周期的第一次或最后一次迭代(例如j或{{1 } i,或j= 0),i=n-1j=m-1的值不再是此答案开头所描述的值,但是根据以A开头的行之后的两行进行更改。相反,bif的值不是边界值,而是内部节点,ij的值会根据{{之后的行更改1}}陈述。

Ab部分中的语句只会更改elseif的一些元素,这些元素是数组。查看代码,else必须是二维数组(矩阵),正如您在问题中正确指出的那样,A是一维数组(向量)。 (在Python中,顺便说一下,数组实际上是列表,但我将在这里使用通用术语数组)。在bA块中,我们都有b个关键字:例如if表示我们要修改的else的值是index的第N个值,其中b[index] = N.对于b,我们有两个值方括号,因为b是一个矩阵。顺便说一下,在我看来语法中有一个错误,因为当您在矩阵中选择单个值时,您不使用逗号,例如你不是写index而是A(逗号只能在定义矩阵时使用,而不能在选择其中一个值时使用)。但是,AA[x, y]首先使用此代码中未包含的函数创建,因此我们不仅仅了解更多信息。

除了A[x][y]A之外,您需要调查的另一个函数是b,因为它的定义未包含在此代码中:这在开始时使用创建变量lil_matrixzeros,然后在linspace块中使用。