1

スカラー用の C 関数のライブラリがあります。

double f(double x, double y, double z) {
    result = x + 2*y - 3*z;
    return result;
}

これらの関数を numpy 配列で使用したいのですが、何らかの方法で操作をベクトル化し、f配列要素ごとに複数の C 呼び出しを回避したいと考えています。私が見つけたほとんどの例は、配列 (f(double *x)またはf(double x[])) を既にサポートしている関数用です。

ここで正しいアプローチは何ですか?f配列をサポートするように書き直しますか? (ライブラリにはたくさんの関数があります。) おそらく関数ポインタを使用して、C ラッパーを作成しますか? または、ctypes、cython などは、より単純な代替手段を提供しますか?

これはおそらく何百回も尋ねられているので、適切なドキュメントへのポインタだけでも役に立ちます.

4

1 に答える 1

2

個人的には、配列を使用するように関数を書き直すことが、最善かつ最もクリーンな方法だと思います。ただし、代替手段は前述のラッパーですが、元の関数をインライン関数として使用します。

// Function
inline double f(double x, double y, double z) {
    return x + 2*y - 3*z;
}

// Wrapper
void fWrapper(double *x, double *y, double *z, double *ret, int N) {
    int i;

    for (i = 0; i < N; i++) {
        ret[i] = f(x[i], y[i], z[i]);
    }
}

これで、コンパイラは関数呼び出しを関数のコードに置き換える必要があります。

于 2012-04-23T09:17:55.490 に答える