首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Renjin/Java -向量类到Java数组类

Renjin/Java -向量类到Java数组类
EN

Stack Overflow用户
提问于 2017-02-07 17:12:40
回答 1查看 167关注 0票数 0

我目前正在使用Ro.getElementAsDouble(index) (下面的代码)逐个将Ro中的值提取到LogNormArray (double[])中。但我担心一份拷贝是在浪费记忆。我是java的新手,所以如果我想错了,很抱歉。在C语言中,我会复制一个地址来“共享”数据,而不是处理整个数组。是否有类似的指针/地址传递工作流?

我正在用的玩具例子:

代码语言:javascript
运行
复制
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;
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-08 08:39:19

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

上面评估的结果总是AtomicVector的一个实例,一个由所有R值实现的接口,类型为double、character、整数、complex等。AtomicVector接口有一个toDoubleArray方法,它将复制或创建一个包含这些值的双数组。

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42095954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档