2013-04-27 3 views
-2

, что на самом деле следующий код делает? .. В частности, индекс один ...Python .. создать матрицу

Для моего понимания, для «A, B = create_matrix_1 (4,4) " матрица А равна 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 

ответ

2

Для моего понимания, для "A, B = create_matrix_1 (4,4)" матрицы А составляет 16 * 16; Ь 16 * 1

Не обязательно: в коде выше мы не имеем определения функций lil_matrix и zeros. Операторы перед циклом for говорят только, что A равно значению, возвращаемому функцией lil_matrix, когда значения (n*m, n*m) передаются ему как кортеж. С другой стороны, b равен значению, возвращаемому функцией zeros, когда вы передаете ему n*m.

Затем есть секция петли. В принципе, существует 2 вложенных цикла, то есть два итератора, i и j, которые увеличиваются соответственно от 0 до n-1 и от 0 до m-1; поэтому, если предположить, п ​​= 4 и т = 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) Теперь, когда все j значений, от j=0 к j=m-1, были циклическим через, мы увеличиваем i, и мы снова перебирать все значения j:

5   1+0*4 
6   1+1*4 
7   1+2*4 
8   1+3*4 

3) Затем мы повторяем тот же цикл i=2, i=3 и т.п., до i=n-1.

Теперь мы добираемся до if и else блоков. Для каждого из циклов, описанных выше, если у нас есть граничное значение, то есть либо i или j находятся на первой или последней итерации цикла (например, либо i или j являются = 0 или i=n-1 или j=m-1), то значения A и b - это уже не те, которые описаны в начале этого ответа, но изменены в соответствии с двумя строками после строки, начинающейся с if. Если вместо этого значения i или j не являются граничными значениями, а являются внутренними узлами, значения A и b изменяются в соответствии с строками после инструкции else.

Оба заявления в if и в разделе else изменить только некоторые из элементов A и b, которые являются массивами. Если посмотреть на код, A должен быть двумерным массивом (матрицей), как вы правильно указали в своем вопросе, а b - одномерный массив (вектор). (В Python, кстати, массивы - это фактически списки, но я буду использовать здесь общий термин array).Как в блоке if, так и в else мы имеем ключевое слово index: например. b[index] означает, что значение b, которое мы изменяем, является N-м значением b, где index = N. Для A мы имеем два значения в квадратных скобках, так как A является матрицей. Кстати, по моему мнению, ошибка в синтаксисе, поскольку, когда вы выбираете одно значение в матрице, вы не используете запятую, например. вы не пишете A[x, y], а A[x][y] (запятая может использоваться только при определении матрицы, а не при выборе одного из ее значений). Однако как A, так и b создаются в первую очередь с использованием функций, не включенных в этот код, поэтому мы не знаем намного больше.

Кроме lil_matrix и zeros, другой функции, которую нужно исследовать, потому что его определение не входит в этот код, является linspace: используется в начале создания переменных x и y, которые затем используются в блок if.

Смежные вопросы