2

C++ ライブラリの Python ラッパーを作成したいと考えています。std::vector から python リストへの自動変換、およびその逆の自動変換があれば、それは素晴らしいことです。残念ながら、このコードを Interface-file に追加すると、実行時にエラーが発生します。

%typemap(in) std::vector<float> value (std::vector<float> vIn) {
    int iLen = PySequence_Length($input); 
    for(unsigned int i = 0; i < iLen; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
            vIn.push_back((float)PyFloat_AsDouble(o) );
        }
    }
    $1 = vIn;
}
%typemap(out) std::vector<float> {
    std::vector<float> vOut = $1;
    int iLen = vOut.size();
    $result = PyList_New(iLen);
    for(unsigned int i = 0; i < iLen; i++) {
        double fVal = vOut.at(i);
        PyObject *o = PyFloat_FromDouble((double) fVal);
        PyList_SetItem($result, i, o);
    }
}

クラスヘッダー:

class TrainingSet {
    private:
        std::vector<std::vector<float> > m_vInputList;
        std::vector<std::vector<float> > m_vOutputList;
    public:
        void AddInput(const std::vector<float> &vIn);
    // ..

Python コード:

trainSet = TrainingSet()
trainSet.AddInput([0.5, 0.5, 0.5])

エラー:

File "runSOMNet.py", line 9, in <module>
trainSet.AddInput([0.5, 0.5, 0.5])
File "/home/dgrat/annetgpgpu/build/ANNet/ANPyNetCPU.py", line 674, in AddInput
def AddInput(self, *args): return _ANPyNetCPU.TrainingSet_AddInput(self, *args)
NotImplementedError: Wrong number or type of arguments for overloaded function      'TrainingSet_AddInput'.
Possible C/C++ prototypes are:
ANN::TrainingSet::AddInput(std::vector< float,std::allocator< float > > const &)
ANN::TrainingSet::AddInput(float *,unsigned int const &)
4

2 に答える 2

3

std_vector.iSWIGのライブラリは、 std::vector.

http://www.swig.org/Doc2.0/Library.html#Library_stl_cpp_library

知りたいテンプレートのインスタンス化について SWIG に伝える必要があるだけです。

%include "std_vector.i"

namespace std {
    %template(FloatVector) vector<float>;
}

次の Python コードは機能しますが、配列のコピーが発生することに注意してください。

for x in range(0, 3):
    list[x] = x
myModule.myFunction(list)

コピーを発生させずに同じことを行うには、SWIG で生成されたプロキシ オブジェクト コンストラクターを使用してリストを作成します。

list = myModule.FloatVector()
for x in range(0, 3):
    list[x] = x
myModule.myFunction(list)
于 2013-05-13T18:22:17.393 に答える