小编Pax*_*a99的帖子

在 Cython 中使用智能指针来动态分配数组

我正在为带有签名的函数调用编写 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 …

memory arrays smart-pointers cython

5
推荐指数
1
解决办法
1422
查看次数

使用Java对象模仿Matlab结构

这是我的问题(大图).我有一个使用大而复杂的项目(我的意思是包含多层嵌套结构)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)

java matlab interop

3
推荐指数
1
解决办法
796
查看次数

标签 统计

arrays ×1

cython ×1

interop ×1

java ×1

matlab ×1

memory ×1

smart-pointers ×1