1

我需要分别通过 JNI 将一维和二维 Javadouble元素数组与 ALGLIBreal_1d_arrayreal_2d_arrayC/C++ 进行转换。目前,流程如下:

  1. 使用 JNIGetDoubleArrayElements()获取jdoubleC/C++ 中的连续向量。在我的机器上,这总是产生一个副本,即 JNI 将此调用的最后一个参数 , 设置jboolean isCopyJNI_TRUE

  2. 分配一个 C/C++ 向量double并从 JNI 向量中复制元素jdouble到它。请注意,一般情况下,无法保证jdouble类型与类型相同double,因此在double逐个复制数组元素时需要强制转换为。(有没有一种干净的方法来确定它jdouble确实与 相同double,无论是在编译时还是运行时?)

  3. 分别实例化 ALGLIBreal_1d_arrayreal_2d_array。据我从 ALGLIB 代码中可以看出,这会创建一个ae_matrix由数组内部保存的维度 (0, 0)。

  4. 使用该方法将数组元素从 C/C++ 连续向量复制double到 ALGLIB 数组setcontent()。据我从代码中可以看出,这会ae_matrix适当地调整内部保存的大小并将元素一个一个地复制到该矩阵中。看起来在二维矩阵的情况下,第一维是指向 的线性向量的指针向量double,因此元素不连续地存储在一维数组的数组中(类似于 Java)。

  5. 使用 ALGLIB 使用实数数组执行所需的计算。

  6. 要通过 JNI 将结果复制回 JAVA 数组,请反转该过程。ALGLIB 实数数组的元素只能通过方法访问。对于一维数组,有一种getcontent()方法可以返回指向 的连续向量的指针double。对于二维数组,通过operator []它返回一个指向连续行的指针。和以前一样,使用带有强制转换的一对一元素副本jdouble

如您所见,其中涉及大量复制。对于小型阵列,这没什么大不了的,但对于较大的阵列,这在内存和 CPU 方面会变得相当昂贵。

有没有办法在不依赖 ALGLIB 内部结构的知识(可能会发生变化)的情况下加快速度?

4

0 回答 0