2017-02-07 14 views
0

Roの値を1つずつLogNormArraydouble[])に抽出するために、現在Ro.getElementAsDouble(index)(コードは以下)を使用しています。しかし、私はコピーがメモリを浪費していることを心配しています。私はこれについて間違って考えているなら、私は非常に多くのJavaの初心者です。 C言語では、配列全体に対処する代わりに、単一のアドレスをコピーしてデータを「共有」します。類似のポインタ/アドレスを渡すワークフローはありますか?Renjin/Java - VectorクラスからJava配列クラス

玩具例は、私が働いている:ベクトル結果が配列に連動することが保証されていないことを

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のインスタンスになり、double型、文字、整数、錯体、等のすべてのR値によって実装されるインターフェースAtomicVectorインターフェースコピーまたはあろうtoDoubleArray方法を有しています値を含むdouble配列を作成します。

toDoubleArray()ベクトルが配列によってサポートされていても、Renjin Vectorオブジェクトはスレッド間で共有できるように不変であるため、配列への参照は返されません。

toDoubleArray()を呼び出すのは、仮想ディスパッチが1つしかなく、多くのimplementationsが配列を要素ごとに塗りつぶすよりも速いArrays.copyOf()に依存しているため、上記のコードよりも効率的です。

パフォーマンスが死亡した場合は、評価結果がDoubleArrayVectorであるかどうかを確認してから、toDoubleArrayUnsafe()を呼び出してください。しかし、あなたは内容を変更しないように誓いを立てなければなりません。

+1

ありがとうございました。私はRenjinプロジェクトを本当に掘り下げています! – csta

関連する問題