Jos*_*mon 8 java matlab jar matlab-deployment matlab-compiler
我有一个Matlab代码,最后计算索引向量.我使用库编译器将matlab代码编译为java包.jar文件.我导出了jar文件,以便为我的主Java项目运行它.包类的名称是Epidemic.我导入了jar文件(将其添加为外部jar).在主代码中,我尝试创建我的类的对象(在jar文件中).我已经将该类的名称定义为Epidemic.因此,我的代码:
import epidemic.Epidemic;
...
public static void main(String[] args) throws IOException {
List<Double> list1 = new ArrayList<Double>();
List<Double> list2 = new ArrayList<Double>();
Epidemic object = new Epidemic();
object.epidemic(list1, list2);
System.out.println(list1);
}
Run Code Online (Sandbox Code Playgroud)
我使用project-> Libraries右键单击add external jars将.jar文件添加到java项目中.Netbeans自动检测对象的方法.但是我收到以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError:
com/mathworks/toolbox/javabuilder/internal/MWComponentInstance
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:367)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at twittertrendsetters.TwitterTrendSetters.main(TwitterTrendSetters.java:70)
Caused by: java.lang.ClassNotFoundException:
com.mathworks.toolbox.javabuilder.internal.MWComponentInstance
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 13 more
Run Code Online (Sandbox Code Playgroud)
这是什么问题?我应该添加其他东西以使罐子正常工作吗?
编辑:我将位于MATLABROOT/toolbox/javabuild/jar/javabuild.jar中的.jar文件添加到我的类路径和它似乎工作的类.现在我面临另一个问题.当我打印基于html docs的list1获取matlab .m文件的输出时,我得到一个空的arrayList.Matlab函数返回一个双精度数组Nx1.我如何正确地解析它到java arrayList.
我的matlab代码:
function eP = epidemic() // zero input
graph = dlmread('graph.edges'); //a graph
graph_ids=importdata('cms_V3_id.txt'); // indexes of the graph
for index = 1:length(graph)
grph(index,1) = find(graph_ids == graph(index,1));
grph(index,2) = find(graph_ids == graph(index,2));
end
grph(:,3)= graph(:,3);
grph(end + 1, :, :) = [max(max(grph)) max(max(grph)) 1 ];
grph = spconvert(grph);
[S, prev] = brutte_topk2(grph, 3707); //function approximate pagerank result
eP = graph_ids(S); // returning a list of indexes
Run Code Online (Sandbox Code Playgroud)
我试着用你的方法.我创建了一个OBject表并将结果解析为它.
Epidemic object = new Epidemic();
Object[] result;
result = object.epidemic(1);
System.out.println((Double)result[0]);
Run Code Online (Sandbox Code Playgroud)
但是我得到javabuilder.MWNumericArray无法强制转换为java.lang.Double.当我打印reuslt
您需要向Java项目类路径添加两件事:
$MATLABROOT\toolbox\javabuilder\jar\javabuilder.jar
,否则安装相应的MCR运行时(可免费使用),并在类似的路径中找到JAR文件.请参阅此处获取完整说明.
为了完整起见,下面是一个工作示例.
假设我们有以下MATLAB函数返回一个数字数组.
function list = epidemic()
list = randi(100, [1, 10]);
end
Run Code Online (Sandbox Code Playgroud)使用applicationCompiler
MATLAB应用程序,创建一个新项目来构建"Java包".将上述函数添加到项目中,设置类和方法名称,然后构建包.我们应该得到一个JAR文件,说:Epidemic.jar
接下来,我们创建一个Java程序来测试上面的包.例如:
import java.util.*;
import com.mathworks.toolbox.javabuilder.*; // MATLAB Java Builder
import Epidemic.*; // our compiled package
public class TestEpidemic {
public double[] getArray() throws MWException {
Epidemic obj = null;
Object[] out = null;
double [] arr = null;
try {
obj = new Epidemic();
out = obj.epidemic(1); // request one output
arr = (double[]) ((MWArray)out[0]).getData();
} catch (MWException e) {
System.out.println("Exception: " + e.toString());
} finally {
MWArray.disposeArray(out);
obj.dispose();
}
return arr;
}
public static void main (String[] args) {
try {
TestEpidemic e = new TestEpidemic();
double[] arr = e.getArray();
for(double x : arr) {
System.out.println(x);
}
} catch (Throwable t) {
t.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)最后我们编译并运行测试程序:
javac.exe -classpath "%MATLABROOT%\toolbox\javabuilder\jar\javabuilder.jar";.\Epidemic.jar TestEpidemic.java
java.exe -classpath .;"%MATLABROOT%\toolbox\javabuilder\jar\javabuilder.jar";.\Epidemic.jar TestEpidemic
Run Code Online (Sandbox Code Playgroud)
你应该看到一个印有10个双号的数组.
如果JAR文件包含main方法,则它只能返回退出代码.返回值的类型是整数.如果使用,您可以实现此目的System.exit(returnCode)
.
如果你的意思是你有另一个项目要嵌入这个项目,你必须摆脱正确的依赖关系,只需从你想要的JAR中调用方法.