我正在为带有签名的函数调用编写 Python 包装器
double** foo(double** arrayIn, int dim1, int dim2);
并且需要arrayIn在我的 Python 包装器中构建。这里给出了一种可能的解决方案。但是,由于 Cython 包括对智能指针的支持,我更愿意实施该解决方案。一种方法是将malloc 和 unique_ptr 与自定义删除器结合使用。另一个(更简单的)解决方案是使用libcpp 中的分配器类。
import numpy as np
cimport numpy as np
from libcpp.memory cimport unique_ptr, allocator
def testArray(int dim1, int dim2):
cdef allocator[double *] ptr_al
cdef unique_ptr[double *] myptr
cdef np.ndarray arr
cdef double[:,:] carr
myptr.reset(ptr_al.allocate(dim1))
arr = np.ndarray((dim1,dim2),dtype=np.float64,order='C')
carr = arr
myptr.get()[0] = &carr[0,0]
myptr.get()[1] = &carr[1,0]
myptr.get()[2] = &carr[2,0]
Run Code Online (Sandbox Code Playgroud)
此代码编译并正确执行(使用 Cython …
这是我的问题(大图).我有一个使用大而复杂的项目(我的意思是包含多层嵌套结构)Matlab结构.这可以预见得很慢(特别是在尝试加载/保存时).我试图通过将其中一些结构转换为Java对象来改善运行时.问题在于,这些Matlab结构中的数据是在很多地方访问的,因此任何需要重写访问语法的内容都是令人望而却步的.因此,我需要的Java对象为紧密地模仿尽可能Matlab的结构,行为特别是当它涉及到访问存储在其中的数值(值仅在一个地方设置,所以缺乏运营商的在Java中重载设置不是考虑因素).
我遇到的问题(小图片)在于从这些结构的数组中访问数据.例如,
person(1)
.age = 20
.name
.first = 'John'
.last = 'Smith
person(2)
.age = 25
.name
.first = 'Jane'
.last = 'Doe'
Run Code Online (Sandbox Code Playgroud)
Matlab将允许您执行以下操作,
>>age = [person(1:2).age]
age =
20 25
Run Code Online (Sandbox Code Playgroud)
试图用Java完成同样的事情,
>>jperson = javaArray('myMatlab.Person', 2);
>>jperson(1) = Person(20, Name('John', 'Smith'));
>>jperson(2) = Person(25, Name('Jane', 'Doe'));
>>age = [jperson(1:2).age]
??? No appropriate method or public field age for class myMatlab.Person[]
Run Code Online (Sandbox Code Playgroud)
有什么办法可以让Java对象模仿这种行为吗? 我的第一个想法是简单地扩展Person []类,但这似乎不可能,因为它是最终的.我的第二种方法是创建一个包含PersonList的包装类,但是我不相信这会因为调用而起作用
wrappedPerson(1:2)
Run Code Online (Sandbox Code Playgroud)
将被解释为对wrappedPerson类的构造函数调用或尝试访问不存在的WrappedPerson数组的元素(因为java不会让我覆盖"()"运算符).任何见解将不胜感激.
我用于java类的代码是
public class Person {
int _age;
ArrayList<Name> _names;
public …Run Code Online (Sandbox Code Playgroud)