2016-09-07 7 views
2

私は2つの小さくても非常に複雑な行列を掛けたいと思います。私はsympyを使用して、これをやった:まだ索引付けが可能な状態で評価を抑制する方法はありますか?

C=sympy.MatMul(A,B,hold=True) 

これは私に膨大な時間を節約するMATMULオブジェクトを与え、私はとにかくシンボリック式に興味がないんだけど、むしろ私が後で特定のポイントで評価したいですに。

これが私の計算の終わりであれば問題ありませんが、新しい方程式を定義するためにCの要素を使う必要がありますが、インデックスできません。

In [286]: C[0] 
Traceback (most recent call last): 

    File "<ipython-input-286-829e2440bf19>", line 1, in <module> 
    C[0] 

    File "C:\Anaconda3\lib\site-packages\sympy\matrices\expressions\matexpr.py", line 242, in __getitem__ 
    raise IndexError("Single index only supported for " 

IndexError: Single index only supported for non-symbolic matrix shapes. 

どういうわけかそのようなオブジェクトのインデックスを作成できますか?たとえば、メイプルでは、​​出力を抑制するセミコロンを使用できますが、結果のオブジェクトの構造に関する情報を保持してインデックスに登録できます。

答えて

3

Cの要素にインデックスを付けることができます。 C[0,0]。これにより、最初の行がリストとして表示されます。

row0 = [C[0, k] for k in range(C.shape[1])] 

次に例を示します。 xyはsympyシンボルです。

In [40]: A 
Out[40]: 
Matrix([ 
[2*x + 1, x + 3], 
[  -2,  3]]) 

In [41]: B 
Out[41]: 
Matrix([ 
[-3, 3], 
[ y, 2*y]]) 

In [42]: C = sympy.MatMul(A, B, hold=True) 

In [43]: C[0,0] 
Out[43]: -6*x + y*(x + 3) - 3 

In [44]: [C[0,k] for k in range(C.shape[1])] 
Out[44]: [-6*x + y*(x + 3) - 3, 6*x + 2*y*(x + 3) + 3] 
+0

ありがとうございます。私のC行列はベクトルです。私は列を索引付けする必要があることを認識していませんでした。 –

1

エラーを説明するためには、通常、単一のインデックスインデックス行列行単位:シンボリックマトリックスシンボルに対する

In [8]: M = Matrix([[1, 2], [3, 4]]) 

In [9]: M 
Out[9]: 
⎡1 2⎤ 
⎢ ⎥ 
⎣3 4⎦ 

In [10]: M[0] 
Out[10]: 1 

In [11]: M[1] 
Out[11]: 2 

In [12]: M[2] 
Out[12]: 3 

In [14]: M[3] 
Out[14]: 4 

は、これは、行、列インデックスとして計算されます。 Aは4列を有するため、例えば、

In [16]: MatrixSymbol('A', 3, 4)[0] 
Out[16]: A₀₀ 

In [17]: MatrixSymbol('A', 3, 4)[10] 
Out[17]: A₂₂ 

要素A[10]が自動的ので10は、第3行目の3列目で、A[2, 2]に変換される(すべてが0インデックスされていることを思い出してください)。 Aがm x nの場合、A[i]の列が(n % iがシンボリックである)行を表しているかどうかを知る方法がありません。おそらくSymPyをA[i]に戻してA[i//n,i%n]を象徴的に返すように変更することができますが、行列要素を行、列で明示的に参照する必要があるため、実際にそれを手動で行うことができます。また、この式には境界チェックがありません(i >= n*mの要素が範囲外の場合)。

厳密に言えば、Aの形状に関係なく常にA[0, 0]になる可能性があります。しかし、これは単一の特殊ケースになります。SymPyはこれを禁止しました。とにかく明示的なA[0, 0]

関連する問題