1

私は、小さな行列 (それらの多く) のマイナーを計算する numpy/cython プログラムを作成しています。

私の現在の関数は次のようになります (行 ii、列 jj までのマット wrt のマイナーを計算します):

cdef float minor(np.ndarray[DTYPE_t, ndim = 2] mat,int ii,int jj): 
    rows = range(mat.shape[0])
    col = range(mat.shape[0])
    del rows[ii]
    del col[jj]

    cdef np.ndarray[DTYPE_t, ndim = 2] rM = (mat[rows])[:,col]

    cdef float val =  (-1)**(ii+jj) * np.linalg.det(rM)

    return val

少しベンチマークした後、ライン

cdef np.ndarray[DTYPE_t, ndim = 2] rM = (mat[rows])[:,col]

かなり時間がかかります。2 次元配列から 1 つの行と 1 つの列を削除するより良い方法はありますか?

あなたの、

cp3028

4

1 に答える 1

1

からメモリをコピーしているようです。(mat[rows])[:,col]割り当てとコピーは遅いプロセスです。チャンクをコピーしてコピーの行列式を計算する代わりに、その場でnp.linalg.degチャンクに対して関数呼び出しを行うことはできませんか?mat

于 2012-05-30T13:14:23.980 に答える