2017-01-04 2 views
1

В настоящее время я реализую небольшой конечный элемент sim. используя Python/Numpy, и я ищу эффективный способ создания глобальной матрицы жесткости:Выполнение создания разреженной (жесткости) матрицы

1) Я думаю, что создание разреженной матрицы из матриц жесткости меньшего элемента должно выполняться с использованием coo_matrix(). Однако могу ли я расширить существующий coo_matrix, или я должен создать его из окончательных списков i, j и v?

2) В настоящее время я создаю списки i и j из матрицы жесткости элемента меньшего размера, используя списки и конкатенацию их. Есть ли лучший способ создать эти списки?

3) Создание вектора данных: Тот же вопрос, являются ли списки python предпочтительными по сравнению с векторами numpy из-за возможностей легкого расширения?

4) Конечно, я открыт для любых советов :). Спасибо!

Вот небольшой пример моего текущего плана, чтобы сделать глобальную сборку ясно, что я намерен:

import numpy as np 
from scipy.sparse import coo_matrix 

#2 nodes, 3 dof per node 
locations = [0, 6] 
nNodes = 2 
dof =3 
totSize = nNodes * dof 
Ke = np.array([[1,1,1, 2,2,2], 
       [1,1,1, 2,2,2], 
       [1,1,1, 2,2,2], 
       [2,2,2, 3,3,3], 
       [2,2,2, 3,3,3], 
       [2,2,2, 3,3,3]]) 

I = [] 
J = [] 
#generate rowwise i and j lists: 
i = [ idx + u for i in range(totSize) for idx in locations for u in range(dof) ] 
j = [ idx + u for idx in locations for u in range(dof) for i in range(totSize) ] 
I += i 
J += J 

Data = Ke.flatten() 

cMatrix = coo_matrix((Data, (i,j)),) 
+0

Это 'i' на линии, которая вычисляет' j' переписывает в 'i', которая рассчитывалась на линии раньше. – Divakar

+0

@ Дивакар да? Вы имеете в виду «i» в понимании списка? В python 3, понимание не имеет проблемных областей ... –

+0

@ juanpa.arrivillaga А я вижу. Да, я нахожусь на python2.7 и переписываю на 'i' на этом этапе. – Divakar

ответ

1

В этом посте я хотел бы попытаться сосредоточиться на вопросе производительности, характерный для создания списков i, j и, наконец, матрица cMatrix.

В соответствии с этими правилами, вы в основном выполняете элементные дополнения locations и range(dof). Перейдя на NumPy, мы могли бы использовать broadcasting. Наконец, чтобы снова смоделировать для range(totSize) в этих соображениях, мы могли бы tile окончательный результат добавления с np.tile. Мы будем использовать его как его сплющенную версию для индексирования в столбцы разреженной матрицы и ее транспонированную сплющенную версию для строк.

Таким образом, реализация будет выглядеть примерно так -

idx0 = (np.asarray(locations)[:,None] + np.arange(dof)).ravel() 
J = np.tile(idx0[:,None],totSize) 
cMatrix = coo_matrix((Data, (J.ravel('F'),J.ravel())),) 
Смежные вопросы