Я пытаюсь создать обертку в Cython для библиотеки, которая использует матрицы Eigen :: Matrix3d. Как установить отдельный элемент/коэффициент объекта Matrix3d?Установить коэффициент/элемент Eigen :: Matrix3d в Cython
Я знаю, я могу получить значение с помощью метода coeff(row, col)
, но не смог найти никакой функции set_coeff(row, col, value)
- или как бы то ни было, это можно назвать - для установки значения.
После объявления matrix3D с
cdef decl_eigen.Matrix3d t = decl_eigen.Matrix3d()
Я хочу, чтобы установить значение, но ни одна из следующих конструкций не работает в Cython:
t << 1,2,3,4,5,6,7,8,9
t(0,0) = 1
t[0][0] = 1
и я не могу использовать конструктор со значениями, потому что, насколько мне известно, их не существует.
Вот файлы я пришел так далеко:
decl_eigen.pxd:
cdef extern from "Eigen/Dense" namespace "Eigen":
cdef cppclass Vector3d:
Matrix3d() except +
double coeff(int row, int col)
decl_foo.pxd:
cimport decl_eigen
cdef extern from "../foo.hpp" namespace "MyFoo":
cdef cppclass Bar:
Bar() except +
void transform(decl_eigen.Matrix3d &transformation)
foo.pyx :
import decl_eigen
cimport decl_foo
cdef class Bar:
cdef decl_foo.Bar *thisptr
def __cinit__(self):
self.thisptr = new decl_foo.Bar()
def __dealloc__(self):
del self.thisptr
def transform(self, transformation):
cdef decl_eigen.Matrix3d t = decl_eigen.Matrix3d()
for i in range(3):
for j in range(3):
k = i*3 + j
# Set the coefficient of t(i,j) to transformation[k], but how????
self.thisptr.transform(t)
Спасибо.
У меня нет опыта работы с cython, поэтому, пожалуйста, несите меня. Существует 'data()' [function] (http://eigen.tuxfamily.org/dox/classEigen_1_1PlainObjectBase.html # a4663159a1450fa89214b1ab71f7ef5bf), который дает вам доступ к указателю на данные. Затем вы можете выполнить математику, чтобы назначить требуемое значение. Кроме того, вы указываете, что 'cdef decl_eigen.Matrix3d t = decl_eigen.Matrix3d ()' не работает, а затем имеет 'cdef decl_eigen.Matrix3d t = decl_eigen.Matrix3d ()' в 'foo.pyx'. Это верно? –
Спасибо Ави за то, что он указал на эту несогласованность. Декларация 'cdef' действительно работает. Я немного перефразировал свой вопрос. – HaM
Предложение Avi работает со следующими изменениями: – HaM