我试图用值填充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
或您喜欢的任何其他数据抽象。