java - Octave的“javaMethod”的困难
问题描述
在这个问题中,我试图将 java 类导入Octave
. 在我的特定示例中,我正在(并且正在)使用javaplex
一组 java 工具,其中包含用于在Matlab
. 该问题的答案表明,而Matlab
您将执行以下操作:
import edu.stanford.math.plex4.*;
api.Plex4.createExplicitSimplexStream();
问题中提供的答案表明,这样做的方法Octave
是
javaMethod( 'createExplicitSimplexStream', 'edu.stanford.math.plex4.api.Plex4')
这工作得很好,但后来我遇到了一个奇怪的问题。还有一种方法叫做createVietorisRipsStream
. 在Matlab
中,我将使用如下行来运行它:
api.Plex4.createVietorisRipsStream(parameters);
所以我认为等效的命令Octave
是
javaMethod( 'createVietorisRipsStream', 'edu.stanford.math.plex4.api.Plex4')
但是,当我这样做时,我收到以下错误:
error: [java] java.lang.NoSuchMethodException: createVietorisRipsStream
我不确定为什么会出现这个错误,并且两者都在同一个 JAVA 文件('Plex4')中。createExplicitSimplexStream
我确实查看了 Plex4 文件,createVietorisRipsStream
我注意到两者之间有两个区别:
有两个实例
createExplicitSimplexStream
和六个实例createVietorisRipsStream
有一点说
<double[]>
。但是我不知道这是否相关(我没有读过或写过太多的java,到目前为止,我已经能够使用他们提供的教程来只使用Matlab,而不必深入了解) .
以下是 Plex4 文件中用于 a 的代码示例createExplicitSimplexStream
:
public static ExplicitSimplexStream createExplicitSimplexStream(double maxFiltrationValue) {
return new ExplicitSimplexStream(maxFiltrationValue);
}
以下是 Plex4 文件中用于 a 的代码示例createVietorisRipsStream
:
public static VietorisRipsStream<double[]> createVietorisRipsStream(double[][] points, int maxDimension, double maxFiltrationValue, int numDivisions) {
return FilteredStreamInterface.createPlex4VietorisRipsStream(points, maxDimension, maxFiltrationValue, numDivisions);
}
知道为什么我会收到我遇到的错误吗?
解决方案
正确阅读 Java 部分的 octave 文档,它只有 4 页,它很好地解释了这一点!
正如我在上一个问题的评论中提到的,使用参数调用 java 方法的方法是:
javamethod
(
name of method as a string
,
name of class fully qualified with packages as a string
,
method's first argument
,
method's second argument
,
... etc
)
这是调用“静态”方法的唯一方法;使用普通的“实例”方法,您可以使用javaMethod
java 对象本身并替换类的名称,或者像在 java 中一样简单地使用它,即objectname.methodname(arg1, arg2, ... etc)
我在这里实现了教程供您查看(pdf中的第14页)。(不要忘记先运行修改后的 'load_javaplex' 脚本)。
octave:2> max_dimension = 3;
octave:3> max_filtration_value = 4;
octave:4> num_divisions = 1000;
octave:5> point_cloud = javaMethod( 'getHouseExample', 'edu.stanford.math.plex4.examples.PointCloudExamples')
point_cloud =
<Java object: double[][]>
octave:6> stream = javaMethod( 'createVietorisRipsStream', 'edu.stanford.math.plex4.api.Plex4', point_cloud, max_dimension, max_filtration_value, num_divisions)
stream =
<Java object: edu.stanford.math.plex4.streams.impl.VietorisRipsStream>
octave:7> persistence = javaMethod( 'getModularSimplicialAlgorithm', 'edu.stanford.math.plex4.api.Plex4', max_dimension, 2)
persistence =
<Java object: edu.stanford.math.plex4.autogen.homology.IntAbsoluteHomology>
octave:8> intervals = persistence.computeIntervals(stream)
intervals =
<Java object: edu.stanford.math.plex4.homology.barcodes.BarcodeCollection>
(我没有更进一步,因为 plot_barcodes 也需要稍作修改;它只有几行,但在这里发布太多了,但推理是一样的)。
此外,如果您不确定类构造函数、类方法和静态与特定于实例的方法的含义,不幸的是,这更多地与 java 有关,尽管它应该是非常介绍性的东西。值得先阅读一下它。
祝你好运!
推荐阅读
- css - 当用户滚动时,如何使它看起来被内容覆盖?
- html - 如何创建一个改变页面内容的开关?
- python - 如何理解python中的None、[]、[1]?
- swift - 从多选择器行中检索值时遇到问题
- mysql - 我们如何检查 MySQL v5.6 中的会话是否使用 SSL 连接?
- java - 带有 JWT 的 Java Spring 多个 @Autowired MongoRepository 用法
- java - 如何使用java替换字符串之间存在的ascii字符
- javascript - 为什么这个解决方案不能使用 for 循环?
- php - SSL 设置后无法访问 Laravel 子目录项目
- google-apps-script - 嵌入式脚本(任务列表 API 示例)抛出“'Tasks' is not defined”错误(在脚本中运行时有效)