2016-08-27 9 views
6

괜찮은 크기 (2000 * 2000)의 행렬을 가지고 있고 행렬의 요소에 기호식을 사용하고 싶습니다. 즉, .9**b + .8**b + .7**b ...은 요소의 예입니다. 행렬은 아주 희소합니다.Python 변수가 들어있는 (희소) 행렬을 저장합니다.

중간 계산을 합산하여 이러한 행렬을 만듭니다. 나중에 읽을 수 있도록 디스크에 저장하고 다른 값으로 b으로 평가하고 싶습니다.

나는 sympy로 놀았지만 정확하게해야 할 일은하지만 단순한 추가 작업을하기에는 천천히 느리다. 내가 읽은 바에 따르면 theano 또는 tensorflow가 Tensors와 함께이 작업을 수행 할 수 있지만 Tensor에 기호를 삽입하는 방법을 알 수 없었습니다.

누구든지이 작업에 가장 적합한 도구에 관해 올바른 방향을 제시 할 수 있습니까? 나는 파이썬에 있기를 원하지만, 파이썬 밖에서 뭔가 좋은 일을한다면 좋을 것입니다.

+0

SparseMatrix를 사용하고 있습니까? – asmeurer

+0

예. Matrix 및 SparseMatrix를 사용해 보았습니다. 둘 다 작동하지만 그들은 느리게 사용할 수 있습니다 :(이것은. 내가 뭘하려고하는지입니다 :'A_sy = sy.SparseMatrix (900,900,0)''b = sy.abc.b''A_sy + = arr ** b'. 이 경우'arr'은 900 x 900 numpy 배열입니다. 추가 작업을하기 전에 arr을 sparse 형식으로 변환하려고 시도했지만 도움이되지 않습니다. 그것은 놀랍도록 느립니다. 추가 작업을하려면 1-2 분이 소요됩니다. 그러한 추가 사항을 수천 번씩해야 할 필요가 있습니다. – adamwlev

+0

@asmeurer 만약 당신이 여전히 이것에 대해 생각하고 있다면, 그것에 대해 걱정하지 말라고 말하게하십시오 - 나는 내 문제를 과소 평가했고 주위에서 일을 발견했습니다. 주의와 일! – adamwlev

답변

0

문제는 아마도 상징적 인 힘을 얻고 있다는 사실에서 비롯된 것일 수 있습니다. 그러나 어떤 이유로 든 SymPy는 상징적 인 힘을위한 명시적인 형식을 찾으려고합니다. 예 :

In [12]: x = Symbol('x') 

In [13]: print(Matrix([[1, 2], [3, 4]])**x) 
Matrix([[-2*(5/2 + sqrt(33)/2)**x*(-2/((-3/2 + sqrt(33)/2)*(-1/2 + sqrt(33)/6)**2*(sqrt(33)/4 + 11/4)) + 1/(-1/2 + sqrt(33)/6))/(-sqrt(33)/2 - 3/2) + 2*(-sqrt(33)/2 + 5/2)**x/((-3/2 + sqrt(33)/2)*(-1/2 + sqrt(33)/6)*(sqrt(33)/4 + 11/4)), -4*(5/2 + sqrt(33)/2)**x/((-3/2 + sqrt(33)/2)*(-1/2 + sqrt(33)/6)*(-sqrt(33)/2 - 3/2)*(sqrt(33)/4 + 11/4)) - 2*(-sqrt(33)/2 + 5/2)**x/((-3/2 + sqrt(33)/2)*(sqrt(33)/4 + 11/4))], [(5/2 + sqrt(33)/2)**x*(-2/((-3/2 + sqrt(33)/2)*(-1/2 + sqrt(33)/6)**2*(sqrt(33)/4 + 11/4)) + 1/(-1/2 + sqrt(33)/6)) - (-sqrt(33)/2 + 5/2)**x/((-1/2 + sqrt(33)/6)*(sqrt(33)/4 + 11/4)), 2*(5/2 + sqrt(33)/2)**x/((-3/2 + sqrt(33)/2)*(-1/2 + sqrt(33)/6)*(sqrt(33)/4 + 11/4)) + (-sqrt(33)/2 + 5/2)**x/(sqrt(33)/4 + 11/4)]]) 

실제로 원하는 것입니까? 당신은 b의 가치를 미리 알고 있습니까? MatPow(arr, b)을 사용하여 식으로 평가되지 않은 상태로 남겨 둘 수 있습니다.