首页 > 解决方案 > 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我注意到两者之间有两个区别:

  1. 有两个实例createExplicitSimplexStream和六个实例createVietorisRipsStream

  2. 有一点说<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);
}

知道为什么我会收到我遇到的错误吗?

标签: javamatlaboctave

解决方案


正确阅读 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
)

这是调用“静态”方法的唯一方法;使用普通的“实例”方法,您可以使用javaMethodjava 对象本身并替换类的名称,或者像在 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 有关,尽管它应该是非常介绍性的东西。值得先阅读一下它。

祝你好运!


推荐阅读