2017-02-07 78 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