我正在将一些特征矩阵转换为PyObject&#39>:
typedef Matrix<double, Dynamic, Dynamic, RowMajor> RMatrix;
static PyObject * myfunc(PyObject * self, PyObject * args)
{
double scalar;
RMatrix mat_1;
RMatrix mat_2;
// some works
PyObject * py_scalar = PyFloat_FromDouble(scalar);
npy_intp size_1[2] = {(npy_intp)mat_1.rows(), (npy_intp)mat_1.cols()};
PyObject * py_mat_1 = PyArray_SimpleNewFromData(2, size_1, NPY_DOUBLE, mat_1.data());
npy_intp size_2[2] = {(npy_intp)mat_2.rows(), (npy_intp)mat_2.cols()};
PyObject * py_mat_2 = PyArray_SimpleNewFromData(2, size_2, NPY_DOUBLE, mat_2.data());
PyObject * tuple = PyTuple_New(3);
PyTuple_SetItem(tuple, 0, py_scalar);
PyTuple_SetItem(tuple, 1, py_mat_1);
PyTuple_SetItem(tuple, 2, py_mat_2);
return tuple;
}
问题是,C ++中的mat_1(0,0)
与Python中的mat_1[0,0]
不同(mat_2
中也是如此),而其他条目则没问题。在我看来,第一个条目是未初始化的,具有不寻常的值,如2.41e-316。是什么原因?
更新:问题的原因应该是在退出函数时内存被破坏。创建一个新数组(PyArray_FromAny
)并复制数据(memcpy
)解决了这个问题。