2017-02-07 35 views
0

我目前使用Ro.getElementAsDouble(index)(代码如下)将Ro中的值逐个提取为LogNormArraydouble[])。但我担心副本会浪费内存。我非常喜欢java的新手,所以如果我不正确地考虑这个问题,我很抱歉。在C我会复制一个地址来“共享”数据,而不是应对整个数组。是否有类似的指针/地址传递工作流程?Renjin/Java - Vector class to Java array class

玩具实施例我正在使用:

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; 
    } 
} 

回答

2

。注意,矢量结果不能保证由阵列的支持。例如,语句engine.eval("1:10000")当前评估为IntSequence实例。但是这是一个可以改变的实现细节。

您的评估上面永远是AtomicVector一个实例,由类型的所有的R值实现的接口的结果双,字符,整数,复杂,等等。AtomicVector接口具有toDoubleArray方法将复制或创建一个包含值的双数组。

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

调用toDoubleArray()仍然可能会比上面的代码更有效,因为它仅涉及一个虚拟调度和多implementations依靠Arrays.copyOf(),比填充一个数组元素乘元素更快。

如果性能成为生死攸关的事情,那么您可以检查评估结果是否是DoubleArrayVector,然后致电toDoubleArrayUnsafe()。但是,你必须小心翼翼地发誓不要修改内容。

+1

谢谢,我真的在挖人净项目! – csta