我正在尝试填写 RealVector (来自 Apache Commons Math)和值。我尝试使用类(class)的 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)
错误的?private void runAnalysis() 抛出 IllegalArgumentException、IllegalAccessException、InitationTargetException { 双重属性; 加权分析 = new 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() 不会修改 vector ,而是构造一个新 vector : [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
构造 vector 是一项相当昂贵的操作,因为append()需要一遍又一遍地复制元素(即以您解释的方式构造数组,运行时间为 O(n^2)
。
我建议简单地使用java的ArrayList<Double>
在构造过程中,然后简单地转换为 RealVector
或您喜欢的任何其他数据抽象。
关于Java:设置未知数量条目的数组长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1834428/