Clojure:调用超类方法
我有一个无法解决的大问题,我真的没有发现错误 我想使用此功能:Clojure:调用超类方法,clojure,clojure-java-interop,Clojure,Clojure Java Interop,我有一个无法解决的大问题,我真的没有发现错误 我想使用此功能: (defn atomic-apache-peak-value [x] (let [lamb ((x :parameters) 0) x0 ((x :parameters) 1) f (D2Sigmoid. lamb x0) optimizer (BrentOptimizer. 0.0001 0.0001) maxeval (MaxEval. 1000)
(defn atomic-apache-peak-value [x]
(let [lamb ((x :parameters) 0)
x0 ((x :parameters) 1)
f (D2Sigmoid. lamb x0)
optimizer (BrentOptimizer. 0.0001 0.0001)
maxeval (MaxEval. 1000)
of (UnivariateObjectiveFunction. f)
goal (GoalType/MINIMIZE)
interval (SearchInterval. x0 (* 2 x0))]
(-> (.optimize optimizer maxeval of goal interval)
(.getPoint))))
Apache的测试代码示例如下:
(来源:)
因此,我尝试使用Clojure和另一个函数复制代码:
(defn atomic-apache-peak-value [x]
(let [lamb ((x :parameters) 0)
x0 ((x :parameters) 1)
f (D2Sigmoid. lamb x0)
optimizer (BrentOptimizer. 0.0001 0.0001)
maxeval (MaxEval. 1000)
of (UnivariateObjectiveFunction. f)
goal (GoalType/MINIMIZE)
interval (SearchInterval. x0 (* 2 x0))]
(-> (.optimize optimizer maxeval of goal interval)
(.getPoint))))
Clojure告诉我“没有找到匹配的方法:针对类进行优化…BrentOptimizer”
我试着在let中一行一行地计算代码,结果成功了,所以问题是优化
该方法在我导入的超类上实现
[org.apache.commons.math3.optim.univariate UnivariateOptimizer BrentOptimizer UnivariateObjectiveFunction SearchInterval]
[org.apache.commons.math3.optim BaseOptimizer MaxEval]
它不会改变任何事情
你认为我是不是有语法问题,有bug,或者只是用了一种错误的方法
谢谢
编辑:
忘了提到
(.optimize optimizer)
版本从Apache引发异常,但已找到。所以我不认为Clojure找不到源代码。
也许有语法问题
还尝试了不带括号的Goaltype/MINIMIZE
编辑2:
最终工作代码
(defn atomic-apache-peak-value [x]
(let [lamb ((x :parameters) 0)
x0 ((x :parameters) 1)
f (D2Sigmoid. lamb x0)
optimizer (BrentOptimizer. 0.0001 0.0001)
maxeval (MaxEval. 1000)
of (UnivariateObjectiveFunction. f)
goal GoalType/MINIMIZE
interval (SearchInterval. x0 (* 2 x0))]
(-> (.optimize optimizer (into-array OptimizationData [maxeval of goal interval]))
(.getPoint))))
好的,让我们创建一个正确的答案。从Clojure调用Java方法时,查找方法的实际签名很重要。仅仅从Java示例代码复制可能并不总是有效的。这主要是由于瓦尔加。Clojure中的Java互操作要求程序员在涉及vararg时做一些额外的工作 您尝试调用的
optimize
方法的签名是:
public UnivariatePointValuePair optimize(OptimizationData... optData)
throws TooManyEvaluationsException
请注意…
,这意味着该方法接受0个或多个优化数据类型的参数。在Java中,只要foo、bar和baz类实现了OptimizationData
接口,这个方法就可以作为optimize(foo、bar、baz)
调用
然而,vararg的这种处理主要是由Java编译器完成的。在封面下,该方法实际上需要一个类型为OptimizationData[]
-array ofOptimizationData
的参数。Java编译器生成将参数打包到数组中的代码,程序员不必担心
但是当从Clojure调用这些方法时,程序员必须创建数组。在Clojure编译器看来,该方法的签名似乎是optimize(OptimizationData[]optData)
在Clojure中创建一个数组不需要花费很多时间。一种方法是使用into array
函数。以下显示了必要的位和块:
(import '(org.apache.commons.math3.optim OptimizationData))
(.optimize (into-array OptimizationData [optimizer maxeval of goal interval]))
此外,不需要在GoalType/MINIMIZE
周围加括号。括号表示列表,列表在Clojure中作为函数调用进行计算。这里我们不需要调用GoalType/MINIMIZE
函数,我们只需要该值。好的,让我们创建一个正确的答案。从Clojure调用Java方法时,查找方法的实际签名很重要。仅仅从Java示例代码复制可能并不总是有效的。这主要是由于瓦尔加。Clojure中的Java互操作要求程序员在涉及vararg时做一些额外的工作
您尝试调用的optimize
方法的签名是:
public UnivariatePointValuePair optimize(OptimizationData... optData)
throws TooManyEvaluationsException
请注意…
,这意味着该方法接受0个或多个优化数据类型的参数。在Java中,只要foo、bar和baz类实现了OptimizationData
接口,这个方法就可以作为optimize(foo、bar、baz)
调用
然而,vararg的这种处理主要是由Java编译器完成的。在封面下,该方法实际上需要一个类型为OptimizationData[]
-array ofOptimizationData
的参数。Java编译器生成将参数打包到数组中的代码,程序员不必担心
但是当从Clojure调用这些方法时,程序员必须创建数组。在Clojure编译器看来,该方法的签名似乎是optimize(OptimizationData[]optData)
在Clojure中创建一个数组不需要花费很多时间。一种方法是使用into array
函数。以下显示了必要的位和块:
(import '(org.apache.commons.math3.optim OptimizationData))
(.optimize (into-array OptimizationData [optimizer maxeval of goal interval]))
此外,不需要在GoalType/MINIMIZE
周围加括号。括号表示列表,列表在Clojure中作为函数调用进行计算。这里我们不需要调用GoalType/MINIMIZE
函数,我们只需要该值。您是否尝试删除GoalType/MINIMIZE
周围的括号?嗯。。查看javadoc,您可能需要类似于(.optimize(进入数组优化数据[optimizer maxeval of goal interval]))的内容。你需要导入org.apache.commons.math3.optim.optimization数据,然后丢失GoalType/MINIMIZE
哦,我的天啊,非常感谢,它成功了。不知道绑定优化数据。。。要优化数据[]!祝您愉快您是否尝试删除GoalType/MINIMIZE
周围的括号?嗯。。查看javadoc,您可能需要类似于(.optimize(进入数组优化数据[optimizer maxeval of goal interval]))的内容。你需要导入org.apache.commons.math3.optim.optimization数据,然后丢失GoalType/MINIMIZE
哦,我的天啊,非常感谢,它成功了。不知道绑定优化数据。。。要优化数据[]!祝你有美好的一天