1

arr形状(N, D, M, D)D2 または 3の大きな numpy 配列があります。配列は、次元と次元でブロック化(D,D)された行列のブロックと考えることができます。これらの各行列の行列式を取得したいと思います。NM(D,D)

out = np.empty((N,M))
for i in xrange(N):
    for j in xrange(M):
        out[i,j] = np.linalg.det(arr[i,:,j,:])

唯一の問題は、np.linalg.det小さな行列を特殊なケースにしないことと、各ブロックの完全な BLAS 呼び出しと LU 因数分解を行うことです。実際、私の最近の Core i7 システムでは、2 行 2 列のマトリックスnp.linalg.detに約 40us かかります。このフラグメントのパフォーマンスを改善するためのオプションは何ですか?

4

2 に答える 2

3

ダフィーモのポイントを明確にするために、ベクトル化されnumpyた操作を使用して、独自の関数でブロック構造を簡単に活用できます。これにより速度が向上するかどうかは、M と N の大きさによって異なります。

>>> a = numpy.arange(2 * 2 * 2 * 2).reshape(2, 2, 2, 2)
>>> a[:,0,:,0] * a[:,1,:,1] - a[:,1,:,0] * a[:,0,:,1]
array([[-4, -4],
       [-4, -4]])
>>> a = numpy.arange(2 * 3 * 2 * 3).reshape(2, 3, 2, 3)
>>> a[:,0,:,0] * a[:,1,:,1] * a[:,2,:,2] + \
    a[:,0,:,1] * a[:,1,:,2] * a[:,2,:,0] + \
    a[:,0,:,2] * a[:,1,:,0] * a[:,2,:,1] - \
    a[:,0,:,0] * a[:,1,:,2] * a[:,2,:,1] - \
    a[:,0,:,1] * a[:,1,:,0] * a[:,2,:,2] - \
    a[:,0,:,2] * a[:,1,:,1] * a[:,2,:,0]
array([[0, 0],
       [0, 0]])
于 2012-10-25T16:20:35.640 に答える
1

2x2 または 3x3 行列の行列式を計算するために LU 分解は必要ありません。式はよく知られています。独自の関数を作成して呼び出してみませんか?

于 2012-10-25T11:57:06.447 に答える