2017-02-07 9 views
0

настоящее время я использую Ro.getElementAsDouble(index) (код находится ниже) для извлечения значения в Ro по одному в LogNormArray (double[]). Но я беспокоюсь, что копия растрачивает память. Я очень новичок в java, так что извиняюсь, если я думаю об этом неправильно. В C я бы скопировал один адрес, чтобы «делиться» данными, а не копировать весь массив. Есть ли аналогичный рабочий процесс, передающий указатель/адрес?Renjin/Java - вектор класс 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, интерфейс реализуется всеми значениями R типа двойной, символ, целое число, комплекс и т.д. Интерфейс AtomicVector имеет toDoubleArray метод, который будет копировать или создайте двойной массив, содержащий значения.

toDoubleArray() не возвращает ссылку на массив, даже если вектор поддерживается массивом, потому что объекты Renjin Vector должны быть неизменными, чтобы они могли делиться между потоками.

Вызов toDoubleArray(), вероятно, по-прежнему будет более эффективным, чем ваш код, потому что он включает только одну виртуальную диспетчеризацию, а многие implementations полагаются на Arrays.copyOf(), которая быстрее, чем заполнение массива по элементам.

Если производительность становится вопросом жизни или смерти, то вы можете проверить, является ли результат оценки DoubleArrayVector, а затем вызывает toDoubleArrayUnsafe(). Но тогда вы должны розовым - поклясться, чтобы не изменять содержимое.

+1

Спасибо, и я действительно копаю проект Renjin! – csta