0

我目前正在使用Ro.getElementAsDouble(index)(代码如下)将值Ro一一提取到LogNormArraydouble[])中。但我担心副本会浪费内存。我是java的新手,如果我不正确地考虑这个问题,我深表歉意。在 CI 中,会复制一个地址来“共享”数据,而不是复制整个数组。是否有类似的指针/地址传递工作流程?

我正在使用的玩具示例:

import java.util.Arrays;
import javax.script.*;
import org.renjin.sexp.*;
import org.renjin.script.*;

public class VectorRenjin {
  public static void main(String[] args) throws Exception {
    double[] LogNormArray = new double[10];
    Vector Ro = LogNormalRand(10,0.0,1.0);
    System.out.println("draws from log-normal " + Ro);
    for(int i=0;i< Ro.length();i++) LogNormArray[i] = Ro.getElementAsDouble(i);
    System.out.println("draws from log-normal " + Arrays.toString(LogNormArray));
  }
  public static Vector LogNormalRand(int n,double a, double b) throws Exception{
    // create a script engine manager:
    RenjinScriptEngineFactory factory = new RenjinScriptEngineFactory();
    ScriptEngine engine = factory.getScriptEngine();
    engine.put("n",n);
    engine.put("a",a);
    engine.put("b",b);
    Vector res = (Vector)engine.eval("rlnorm(n,a,b)");
    return res;
  }
}
4

1 回答 1

2

请注意,向量结果不能保证由数组支持。例如,该语句engine.eval("1:10000")当前计算为IntSequence实例。但这是一个可能发生变化的实现细节。

上面评估的结果始终是 的实例AtomicVector,该接口由 double、字符、整数、复数等类型的所有 R 值实现。AtomicVector 接口具有 toDoubleArray方法,该方法将复制或创建包含值的双精度数组.

toDoubleArray()即使 Vector 由数组支持,也不返回对数组的引用,因为 Renjin Vector 对象是不可变的,因此它们可以在线程之间共享。

调用toDoubleArray()可能仍然比您上面的代码更有效,因为它只涉及一个虚拟调度,并且许多实现依赖于 Arrays.copyOf() ,这比逐个元素地填充数组要快。

如果性能成为生死攸关的问题,那么您可以检查评估结果是否为 DoubleArrayVector,然后调用toDoubleArrayUnsafe()。但是你必须发誓不要修改内容。

于 2017-02-08T08:39:19.023 回答