使用Mathematica,我需要优化一个定义的函数BinCounts
; 我希望最大化的参数定义bin分割点.
我认为问题在于Mathematica在给出数值之前根据参数扩展了目标函数,因此BinCounts
抱怨bin规范不是"包含实数值,无限和-Infinity的列表".
我认为以下是我正在尝试做的事情以及正在发生的事情的最小例子.我非常感谢有关如何解决这个问题的建议.
In[1]:= data = RandomReal[1, 30]; (* Make some test data. *)
In[2]:= f[a_, b_, c_] := BinCounts[data, {{0, a, b, c, 1}}] (* Shorthand to use below… *)
In[12]:= g[a_, b_, c_] := Max[f[a, b, c]] - Min[f[a, b, c]] (* Objective function. *)
In[13]:= NMaximize[{g[a, b, c], 0 < a < b < c < 1}, {a, b, c}] (* Try to oprimize. *)
During evaluation of In[13]:= BinCounts::cvals: The bin …
Run Code Online (Sandbox Code Playgroud) 这是我希望能够做到的一个例子(用Java):
interface MyInterface<E> {
public void doSomething(E foo);
}
class MyClass implements MyInterface<ClassA>, MyInterface<ClassB> {
public void doSomething(ClassA fooA) {
...
}
public void doSomething(ClassB fooB) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试实现它时,编译器告诉我,我只能实现MyInterface
一次MyClass
.我曾认为,MyInterface<ClassA>
与之相比,它被视为一种不同的类型MyInterface<ClassB>
,但显然不是.这似乎是非常有用的东西,所以我对错误感到惊讶.
更新:感谢您的帮助到目前为止.正如其中一条评论所指出的,以上是抽象的; 我试图解决的问题是实现Observer模式,使观察者类通过它实现的接口声明它所观察到的那些类,并处理它在特定于类的方法中观察到的对象的变化.使用这种方法的优点是,从接口可以清楚地看到一个类实现了它所观察的哪种类型的对象,并且编译器强制程序员明确地实现对所观察的那些类的实例的更改的处理.因此,上面的抽象代码可能实际上类似于以下内容:
interface IsObserverOf<E> {
public void observedDidChange(E foo);
}
class MyClass implements IsObserverOf<Database>, IsObserverOf<Spreadsheet> {
public void observedDidChange(Database database) {
...
}
public void observedDidChange(Spreadsheet spreadsheet) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,MyClass声明它观察数据库对象和Spreadsheet对象,并且编译器在理想的世界范围内要求必须实现两个不同的observeDidChange()方法.
谢谢.