2009-12-18 2 views
4

Я реализую TDMA в Python с помощью NumPy. Трехдиагональная матрица хранятся в трех массивах:Реализация алгоритма трехдиагональных матриц (TDMA) с NumPy

a = array([...]) 
b = array([...]) 
c = array([...]) 

Я хотел бы, чтобы эффективно рассчитать alpha -коэффициентов. Алгоритм выглядит следующим образом:

# n = size of the given matrix - 1 
alpha = zeros(n) 
alpha[0] = b[0]/c[0] 
for i in range(n-1): 
    alpha[i+1] = b[i]/(c[i] - a[i] * alpha[i]) 

Однако это не является эффективным из-за for цикла Python. Хотите, я хочу что-то вроде этого подхода:

# n = size of the given matrix - 1 
alpha = zeros(n) 
alpha[0] = b[0]/c[0] 
alpha[1:] = b[1:]/(c[1:] - a[1:] * alpha[:-1]) 

В этом последнем случае результат является неправильным, потому что NumPy сохраняет правую часть последнего выражения в temprorary массиве, а затем присваивает ссылки на его элементы в alpha[1:]. Поэтому a[1:] * alpha[:-1] - это всего лишь массив нулей.

Есть ли способ указать NumPy использовать значения alpha, рассчитанные на предыдущих шагах в пределах его внутреннего цикла?

Спасибо.

+0

это невозможно. см. http://stackoverflow.com/questions/1587367/python-numpy-tricky-slicing-problem для аналогичной проблемы. если вам действительно нужно увеличение скорости, попробуйте cython. – Autoplectic

ответ

2

По-видимому, нет возможности сделать это в Python без использования C или его pythonic вариантов.

2

Если его трехдиагональные системы, которые вы хотите решить, есть solve_banded() в numpy.linalg. Не уверен, что это то, что вы ищете.

+0

Я не думаю, что есть какое-либо условие для решения матричных матриц, в numpy или даже в scipy, нет sp.sparse, насколько я знаю. – fedvasu

+0

Я думаю, что это мой плохой, scipy.sparse существует (он не существует в моей системе, он существует в документах, поэтому он должен действительно существовать), но не solve_banded() в numpy.linalg, возможно, был, если присутствует в 2009 году, а не Теперь. – fedvasu

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