我试图用值填充RealVector(来自Apache Commons Math)。我尝试使用该类的append方法,但实际上并没有添加任何内容。因此,现在我使用的是double[],它工作正常,但我事先不知道数组需要多大。

private void runAnalysis() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    Double attr;
    double[] data = new double[100]; // TODO: bad.

    int i = 0;
    for (Method m : ParseTree.class.getMethods()) {
        if (m.isAnnotationPresent(Analyze.class)) {
            attr = (Double) m.invoke(this);
            analysis.put(m.getAnnotation(Analyze.class).name(), attr);
            data[i++] = attr * m.getAnnotation(Analyze.class).weight();
        }
    }

    weightedAnalysis = new ArrayRealVector(data);
}


我该如何处理?这是我的想法:


遍历该类并使用批注对方法进行计数,然后使用该大小初始化数组。但是,这将需要一个额外的循环,并且反射是性能密集的。 (对?)
为数组选择任意大小,如果空间用完,则将其加倍。缺点:需要更多代码行
使用List<Double>,然后以某种方式将Double对象放回到doubles中,以便可以将它们放入RealVector中。为列表使用更多的内存。
只需为起始数组选择一个很大的大小,并希望它永远不会溢出。缺点:这是在请求arrayindexoutofbound错误。
还是我只是使用append(double d)错误?

私人void runAnalysis()引发IllegalArgumentException,IllegalAccessException,InvocationTargetException {
    双属性
    weightedAnalysis =新的ArrayRealVector(data);

for (Method m : ParseTree.class.getMethods()) {
    if (m.isAnnotationPresent(Analyze.class)) {
        attr = (Double) m.invoke(this);
        analysis.put(m.getAnnotation(Analyze.class).name(), attr);
        weightedAnalysis.append(attr * m.getAnnotation(Analyze.class).weight());
    }
}


}

最佳答案

RealVector.append()不会修改矢量,而是构造一个新的矢量:
[RealVector.append()的Java文档(http://commons.apache.org/math/apidocs/org/apache/commons/math/linear/RealVector.html#append(double))说明:

append

RealVector append(double d)
Construct a vector by appending a double to this vector.
Parameters:
d - double to append.
Returns:
a new vector


请注意,使用RealVector构造向量是相当昂贵的操作,因为append()将需要一遍又一遍地复制元素(即,按照您解释的方式在O(n^2)时间内运行构造数组。

我建议仅在构造过程中使用java的ArrayList<Double>,然后简单地转换为RealVector或您喜欢的任何其他数据抽象。

10-05 21:33