DK写在前面:

是因为供给在1个Android项目中使用神经互连网,而通过测试发掘多少个Github上开源项指标教练效益便是比不上Matlab的工具箱好,所以就想在Android上使用Matlab神经互联网代码(但是。。。)

写那篇著作的主要指标是记录二次java调用matlab
打包的jar进度,也参照了累累英特网的稿子,因为步骤同样,所以里面一部分截图就引述英特网的了,以备以往查看。

本条标题大要管理了二日,原本估量陆个小时的。。。

文章分为二大多,一是matlab景况和包装步骤的牵线,二是在装置有matlab和未有安装matlab的机器上,调用和周转matlab打包的
jar 方法。

进度境遇了繁多花招坑以及观察相关资料的对菜鸟不团结,所以就把经过记录下来希望能给后来者一些协助

 

那么些科目从0早先讲如何在Android App中应用Matlab的神经互连网代码

先是有的:

整整经过差不离能够分成这么几步:

matlab景况设置和打包jar文件:

  1. 第一你要在Matlab中写一个完好无损的神经网络
    1. 获得样本
    2. 样本导入
    3. 神经互联网建立模型
    4. 神经网络练习
    5. 神经互联网测试(优化建立模型)
  2. 下一场您要在Matlab中重写3个神经网络,第三个神经互联网的特别之处是
    1. 率先那一个神经网络必须写成函数,具体有多少个细节
    2. 把第贰个神经网络的教练结果net网络保存成mat文件
    3. 把相关必要用的但不可能直接写入代码的数量也保留成mat文件(譬喻数据归一化的参数)
    4. 接下来在函数中把地方多少个mat文件导入,基本上正是1个完好的神经网络模型了
    5. 再增添二个神经网络计算语句,并把结果再次回到,那个函数就完事了
  3. 下一场把这几个Matlab神经互联网函数进行包装,打包的结果是三个jar包
  4. 接下来把这么些jar包连同另贰个jar包一块导入Andorid工程,并累加为外部重视
  5. 末段在Android工程中写二个专门调用那个jar包接口代码的函数,传入输入变量,再次回到计算结果
  6. ()

本次试验所用的软件及版本为:matlab 20一七b, jkd 1.八;

 

一、matlab 20一7b和jdk 一.8的设置配置步骤,不在赘述。

壹.在Matlab中写1个一体化的神经互连网

二、脚本编撰和打包jar

一.1.收获样本就隐瞒了

贰.一张开matlab主程序,展现matlab主页面,在左臂是matlab当前文件夹目录,中间为命令窗口,左侧是办事空间,如图:

一.二.样本导入

永利开户送38元体验金 1

什么样导入数据吧,一般matlab中有通用的多寡存款和储蓄格式,那正是Mat格式,可是自个儿并不知道怎么编写这几个格式

能够点击左侧当前文件夹窗口上方的Logo,更动matlab当前文件夹;

在作者发觉有法子能够把txt中的数据导入进去之后小编就选定它了,因为这种格式也十一分方便自个儿用android输出,相当于说它是一种相比通用的音信置换格式

2.贰 新建 .m 扩展名的剧本文件

切实的操作方法特别轻便:

新建脚本有三种艺术,一是一贯点击ribbon分界面菜单栏的新建开关,在下拉列表中,选拔脚本;②是在左边当前文件夹目录树中,右键,选拔新建脚本命令,三种艺术是如出一辙的。

  1. 您在txt中按这种格式保存数据:每行用回车隔绝,每列用空格隔绝
  2. 然后您在matlab中load这些文件,就能够获得三个数量的矩阵了

贰.三 编写函数

代码如下:

双击张开新建的台本文件,再输入脚本,在此试验借用了互连网的一小段代码,“短小精悍”,就拿来主义了。

 

%画图 自定义函数drawplot 参数 x y 
   function drawplot(x, y) 
    plot(x, y); %%使用matlab函数plot()作图
    grid on %网格显示
    xlabel('X轴值')
    ylabel('Y轴值')
    title('Java调用MatLab作图例子') 
alldata = load(‘alldata.txt’);
alldata = alldata(:,:);

 

 

直白将上述代码复制粘贴到剧本文件中;

1.3. 一.4. 一.5.
那多少个进度照着代码修改依然相比较轻便的
(纵然matlab很久没用让本人登时读得稍微困难。。。),稍微提这么几点:

2.4 打包jar

  1. (把精华书目《MATLAB神经互连网二15个案例分析》的源码包放到办事路径再开始展览阅读修改)
  2. 输出数据须要张开一下矩阵调换
  3. 选取newff工具函数来创设神经互连网,使用matlab内部的工具箱(其实便是库函数)来建立模型、磨炼和计量,不要求团结写逻辑代码
  4. 个中各样矩阵的调换感到不是很习贯,能够参见一下干活空间里的变量状态,恐怕一步步打字与印刷一些变量的结果来看

在指令窗口中输入deploytool(可在输入多少个字母后,按tab键,有代码提醒),弹出Matlab
Compiler窗口:

 

 永利开户送38元体验金 2

clc;
clear;
 
%导入300组数据
alldata = load(‘alldata.txt’);
alldata = alldata(:,:);
 
%输入输出数据
input = alldata(:,2:33);
outputtemp = alldata(:,1);
%输出数据需要处理一下
output = zeros(300,2);%预先分配内存
for i=1:300
    switch outputtemp(i)
        case 0
            output(i,:) = [1 0];%意思是如果数据结果是0,则输出层的状态是[1 0],或者用第一个输出节点表示
        case 1 %能直接识别带小数位的数据
            output(i,:) = [0 1];
    end
end
 
%从中随机抽取280组数据作为训练数据,20组数据作为预测数据
k = rand(1,300);
[m,n] = sort(k);
 
input_train = input(n(1:280),:)’;
output_train = output(n(1:280),:)’;
 
input_test = input(n(281:300),:)’;
output_test = output(n(281:300),:)’;
 
%输入输出数据进行归一化处理
[inputn,inputps] = mapminmax(input_train);
[outputn,outputps] = mapminmax(output_train);
 
%网络结构构建32-6-2
net=newff(inputn,outputn,6);
 
%网络参数配置(迭代次数,学习率,目标)
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
net.trainParam.goal=0.0004;
 
%网络训练
net=train(net,inputn,outputn);
 
%BP网络预测
%预测数据归一化
inputn_test=mapminmax(‘apply’,input_test,inputps);
 
%网络预测输出
an=sim(net,inputn_test);
 
%网络输出反归一化
BPoutput=mapminmax(‘reverse’,an,outputps);
 
%结果分析
figure(1)
plot(BPoutput,’:og’)
hold on
plot(output_test,’-*’);
legend(‘预测输出’,’期望输出’)
title(‘BP网络预测输出’,’fontsize’,12)
ylabel(‘函数输出’,’fontsize’,12)
xlabel(‘样本’,’fontsize’,12)
%预测误差
error=BPoutput-output_test;
 
figure(2)
plot(error,’-*’)
title(‘BP网络预测误差’,’fontsize’,12)
ylabel(‘误差’,’fontsize’,12)
xlabel(‘样本’,’fontsize’,12)
 
figure(3)
plot((output_test-BPoutput)./BPoutput,’-*’);
title(‘神经网络预测误差百分比’)
 
errorsum = sum(abs(error))

分选 Library Compiler ,弹出如下窗口:

 

永利开户送38元体验金 3

最终输出的结果还足以,就算准确率一般,因为样本太少
。不过还可以够经受,是可以表达的结果:

 按图中标注的数字顺序依次选用和输入jar包名称、类名和选取脚本文件,最终单击
package按键,在弹出的保留工程窗口选拔保存地方和填写工程名称,打包成功截图如下:

永利开户送38元体验金 4.png)

永利开户送38元体验金 5

 永利开户送38元体验金 6

贰.5打包成功之后,会扭转下图所示的几个文本夹,具体各类文件夹的成效,未有追究,我们只需从下图
for_testing 文件夹,找到大家须要的在上贰.三手续中命名的 jar 包就可以。

 

永利开户送38元体验金 7

 

永利开户送38元体验金 8

贰.在Matlab中重写那几个神经网络,为导出jar包做计划

到此,matlab将脚本文件打包成可被 java 调用的 jar 的步子已经做到。

贰.1.率先那些神经网络必须写成函数

 

在matlab写贰个函数的进程是那样的

第2有的:

  1. 在干活空间中右键新建函数,重命名后打开,正是这么
    永利开户送38元体验金 9.png)永利开户送38元体验金 10
  2. matlab中的函数在此地一同趁热讲了(自个儿复习三回)

    一. 全部函数有贰头一尾两句固定的宣示,头是以function开首,然后是:重回值

    函数名(函数参数),尾是end,虽然一开始看得不适应,但是习惯还是很好理解的,跟其他的语言差不多
    1.  返回值可以没有,那就是直接 函数名(函数参数)
    2.  返回值可以有多个,参数也可以有多个,他们的形式是这样:function
        \[x,y,z\]=sphere(theta,phi,rho)
    3.  注意Matlab中不会对函数类型进行声明,所以很多时候你在写函数的时候一开始就要对输入参数进行一个检查 
    
    1. 接下来上面接着是法定注释,第1句是摘要,之后是事无巨细表达,这一个东西会在预览的时候显得
    2. 接下去正是函数体了,你能够做各个业务,逻辑语句、调用其余函数
    3. 末段在end以前你必要定义再次回到值,matlab在这块有一点特别,你绝不显示地内定return哪个变量,因为你首先句评释里有再次回到值变量,所以假设您的函数内容中有其1变量,那么最后试行到end的时候就能自行回到这几个变量那时候的情状
    4. —–调用函数——
    5. 调用函数的格局跟函数声称的第二句是一毛同样的:[出口参数表]永利开户送38元体验金,=函数名(输入参数表)
    6. 调用函数时,输入和输出参数的依次应与函数定义时的一样,数目一定不可能多于函数定于中的,可能能够轻松
    7. 为啥能够轻松,因为在函数内部能够由此nargin()和nargout()获取函数被调用时用户钦赐的输入、输出参数个数。所以要是那一个函数里边有针对性不一致的有限输入少于输出的情状张开if
      else的话,就足以自动适应
  3. 这就是说在这里,笔者的输出是3个int,输入是七个行矩阵,可能说3个数组,作者的函数开头就这样写了:
    function
    output =
    annforecastthi(input_test)

该有的分为二种意况下调用艺术:一是在设置有对应版本的
matlab 软件的机器上调用 ,2是在装置matlab compiler runtime (简称
mcr,下文所提到的 mcr,都指该软件) 的机器上调用。

 

预备所需的 jar:除了在上一些关联的 matlab 打包生成的 jar 之外
,还亟需在 matlab 设置目录下的
javabuilder.jar,其所在地点如下图(本机安装目录是 c:/Program
Files/MATLAB):

二.二.然后为了不在那个函数里对神经互联网举行演练(因为matlab的设定正是无力回天把磨练函数编写翻译成Jar包),须求把原先神经互联网中陶冶好的net保存成mat文件再在那边直接导出

(注意:无论是不是在装置 matlab 的机械上调用 matlab 所打包的 jar,都要保管
jdk 版本与位数与 matlab 所必要的同样)

  1. 把从前神经互连网中磨炼好的net保存成mat文件
    特别轻松。直接在运算甘休后再工作空间中右键net变量,保存为mat文件就足以了
  2. 接下来导入的时候有一点点有一些麻烦
    1. 实质上load
      mat文件有二种艺术,一种是命令行形式,1种是函数格局。三种方式效果上没什么分歧,不过推荐在函数里用函数格局
    2. 以导入1个结构体(归1化参数)为例:
      1. 指令行格局 :load
        anninputps
        inputps;
      2. 函数方式:
        永利开户送38元体验金 11
    3. 而导入net数据的时候还要麻烦一些:
      1. 命令行形式:load
        annnet
        net;
      2. 函数格局:(前边还要加一句把结构体转型成互连网格式)
        永利开户送38元体验金 12
  3. 那边须求导入八个mat文件,三个net和多个归壹化参数(前边要用来反归1化)

永利开户送38元体验金 13

 

 

至于为什么无法把神经网络的陶冶函数编写翻译成jar包

一:在设置了对应版本的 matlab 软件的机器上调用打包的 jar  :

MATLAB官方论坛中看到这样一个回答:
You will not be able to compile any function which trains the network (like ADAPT). Though the link does not explicitly list these funcions (like ADAPT), they fall under the ‘All other command line functionality’.
However, you can deploy a M function code which uses a pre-trained network. I believe the SIM function will deploy fine.
The workflow I see is:
1. In MATLAB, train you network using test input/output
2. Save the network (mat file?)
3. Create a deployable function which then uses the pretrained network for new data. The network itself would not change/adapt/train in this function
4. Compile and deploy the above function
大意:MATLAB compile不支持对神经网络工具箱中涉及到训练的函数命令进行编译,只能编译那些用在已训练好的网络上的函数命令

一、在设置了对应版本的 matlab 机器上调用打包的 jar
时,一般情状下,无需再布局 matlab
情形,因为我们在设置时,软件自行在情状变量 Path
下配置了相关计划,大家只须求检查一下,是或不是留存相关配置就能够,即使未有matlab 配置,手动增添就能够:

于是化解办法便是在matlab下磨炼好网络,将net保存为mat文件,然后再写三个m文件,load进mat文件

配置为:

 

C:\Program Files\MATLAB\R2017b\runtime\win64;

2.三.提起底回来总计结果,第二个神经网络模型也是神经互连网总结函数就做到了

C:\Program Files\MATLAB\R2017b\bin;

output=find(BPoutput(:,1)==max(BPoutput(:,1)));

那七个布局还有各类须要,runtime要在前(根据拂到的别的文章中注明,算计的,没有实际测试)。

全套函数是这般:

2、 java 工程调用

 

在 myeclipse 中新建 java
工程,就要本有的涉及的一个jar包加多到工程引用,并将以下代码写在测试类的
main
方法中,下边包车型客车代码中的类名与小说第二有的打包截图有所不1致,读者在按以下代码运营时,应依据代码前边的评释,修改为实在
jar 包中的类名和艺术名。

function output = annforecastthi(input_test)
%ANNFORECAST
%   输入长度为32的行矩阵,输出为1或2
 
A = load(‘annnet.mat’);
B = fieldnames(A);
net = A.(B{1});
net = network(net);
 
C = load(‘anninputps.mat’);
D = fieldnames(C);
inputps = C.(D{1});
 
E = load(‘annoutputps.mat’);
F = fieldnames(E);
outputps = E.(F{1});
 
%BP网络预测
%预测数据归一化
inputn_test=mapminmax(‘apply’,input_test’,inputps);
 
%网络预测输出
an=sim(net,inputn_test);
 
%网络输出反归一化
BPoutput=mapminmax(‘reverse’,an,outputps);
 
%结果分析
%根据网络输出找出数据属于哪类
output=find(BPoutput(:,1)==max(BPoutput(:,1)));
 
end
public static void main(String[] args) {
  MWNumericArray x = null; // 存放x值的数组
  MWNumericArray y = null; // 存放y值的数组
  plotter plot = null; // 自定义plotter实例,即打包时所指定的类名,根据实际情况更改

  int n = 20;//做图点数
  try {
   int[] dims = {1, n};
   x = MWNumericArray.newInstance(dims, MWClassID.DOUBLE, MWComplexity.REAL);
   y  = MWNumericArray.newInstance(dims, MWClassID.DOUBLE, MWComplexity.REAL);

   //定义 y = x^2
   for(int i = 1; i <= n; i++) {
    x.set(i, i);
    y.set(i, Math.pow(i, 2));
   }

   //初始化plotter
   plot = new plotter();

   //做图
   plot.drawplot(x, y);// 在脚本文件中的函数名,根据实际情更改
   plot.waitForFigures();// 不调用该句,无法弹出绘制图形窗口

  } catch (Exception e) {
   // TODO: handle exception
  } finally {
   MWArray.disposeArray(x);
   MWArray.disposeArray(y);
   if(plot != null) {
    plot.dispose();
   }
  }

}

 

代码运维成功,即弹出如下窗口:

三.把那个Matlab神经网络函数打包成3个jar包导出

永利开户送38元体验金 14

3.1.吐槽

 

三.贰.安装java开拓条件

二:在未设置 matlab软件,但安装了 mcr 的机器上调用打包的 jar:

  1. 设置java开垦条件是很简短的事务,平常的步子是如此
    1. 去陶文的官方网站下新型的jdk文件
      1. 挑选windows陆13位的下载
      2. 不用选jre,分化是jre只可以用来运维,无法用来编写翻译,它也比jdk要小多数
      3. 其一网址下东西或然异常的慢,这年能够自行检索一些网盘里提供的
    2. 点击这一个jdk.exe文件举办安装,安装进度没什么好说的
    3. 设置完好像说未来的jdk不配备情形变量也没涉及,但原先的要布局意况变量,那就布置吧,那一个会独自在后头写
  2. 下一场笔者骨子里是前边就有安装的,不过在前边生成Jar包的时候出现了难题
    1. 通过排查,开采是jdk的本子相对matlab版本太高了:近来本身的这些matlab20壹5b对应的是jdk7,所以作者明日jdk8都不得以。(仿照效法:matlab
      201四a 用jdk一.七;matlab 2013a 用jdk一.陆)
    2. 于是乎就只可以降落jdk版本了,怎么着下降吗,其实很简短,你的种类中是足以而且安装八个jdk版本的不会争执,最终你期望编写翻译的时候用哪些版本,就在景况变量里安顿哪些版本,非常便于
      永利开户送38元体验金 15.png)永利开户送38元体验金 16
    3. 可是下载的时候也会超过个难点,因为官方网站找不到旧版本的下载,作者正是搜索了一个然后安装,安装完修改了弹指间境况变量,最后ok了

 在未有设置相应版本的 matlab 机器上调用 matlab jar时,应当设置 mcr
蒙受。

 

1、安装 mcr

三.3.铺排情形变量

得到 mcr 安装包有三种渠道,

配备JAVA蒙受变量

(一)从 matlab 官方网址下载对应版本的 mcr。

  1. 现实的做法是:

这一次测试所用的 matlab 软件为
2017b版,故在官网(

永利开户送38元体验金 17

    1. 自小编的计算机——属性——高等设置——高档——情况变量
    2. 在系统变量里增多3个键值对:JAVA_HOME(大小写不灵敏),和jdk安装后的职位路线(为javac.exe所在目录D:\Program
      Files\Java\jdk1.6.0_13\bin的上一层)
    3. 永利开户送38元体验金 18.png)永利开户送38元体验金 19
    4. 铺排完以往这样能够表明
    5. 永利开户送38元体验金 20.png)永利开户送38元体验金 21
  1. 别的说一点是,尽管配置了这么些java
    path,但Eclipse和AS中还有独立的布置:
    Eclipse:Window -> Preferences->Java -> Compiler 设置
    “Compiler compliance level” 为 一.陆 (相应版本)
    AS:点击File,选择Other Settings,选择Default Project ,Structure…

在下载实现后获得以MC卡宴_R2017b_win64_installer.exe命名的安装文件,在安装此前,要先解压所下载的文件,即便是以
exe
结尾的文书,但照样可解压,假若不解压,在安装进程中只怕会合世难题(亲测)。

配置path

设置到位后会,会将 C:\Program Files\MATLAB\MATLAB
Runtime\v93\runtime\win6四 增加到 Path
景况变量中,倘若未有,需求增添该配置。

  1. 也是在系统变量里增多
  2. 变量名是path,值是【.;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;D:\Program
    Files\MATLAB\R2015b\bin】
  3. 今昔本人其实是那样的,居然也能够,不是很懂
    【%Java_Home%\bin;%Java_Home%\jre\bin;C:\ProgramData\Oracle\Java\javapath;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program
    Files (x86)\Calibre2\;C:\Program
    Files\MATLAB\R2015b\runtime\win64;C:\Program
    Files\MATLAB\R2015b\bin;C:\Program
    Files\MATLAB\R2015b\polyspace\bin;C:\Program
    Files\MATLAB\MATLAB Runtime\v90\runtime\win64】

 

配置CLASSPATH

(2)从已安装 matlab
的目录下拷贝;其所在的目录为:(该种安装格局未测试)

  1. 也是在系统变量里增多
  2. 变量名是path,值是【.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;D:\Program
    Files\MATLAB\R2015b\toolbox\javabuilder\jar\javabuilder.jar;%JAVAHOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar】
  3. 现今自己实在是这么的,居然也得以,不是很懂【.;%Java_Home%\bin;%Java_Home%\lib\dt.jar;%Java_Home%\lib\tools.jar】

 %matlab安装目录%\R2017b\toolbox\compiler\deploy\win64

 

 永利开户送38元体验金 22

三.四.打包的操作

找到该公文后,在设置以前,应当先解压该该文件(尽管是以.exe结尾的文本,但照旧可解压,假使不解压,安装进程中有非常的大或然出现难点)

在20一伍版本中操作跟后边版本的也会有非常大的不等(跟20一三都不雷同,前边的也分别不一样样orz),就只说在这么些版本中的步骤

设置到位后会,会将 C:\Program Files\MATLAB\MATLAB
Runtime\v93\runtime\win6四 增加到 Path
碰着变量中,即便未有,须求加多该配置。

  1. 在命令行区域输入指令:deploytool,弹出对话框,然后您选用第多少个library
    compiler
    永利开户送38元体验金 23.png)永利开户送38元体验金 24
  2. 于是乎张开了八个大分界面,在这几个分界面里要做伍件事
    1. 1这选择java
    2. 二那一点击加多你的那几个m函数(2边沿这一个框保持原样,不用打钩)
    3. 三那块一般都会改1您认为符合的名字
    4. 重在四那势供给把您m函数中load的数据文件一块加进去
    5. 点击开头打包
  3. 永利开户送38元体验金 25.png)永利开户送38元体验金 26
  4. 装进须求一些年华,甘休后假使成功就能够在工作空间路线下生成贰个品类,项目中能找到输出Jar文件,那么些正是我们的要的
    永利开户送38元体验金 27.png)永利开户送38元体验金 28 

 2、java 调用

四、把jar导入工程中

该有的与第3局部中的java调用一样,一样出现上文出现的绘图结果窗口。

  1. 除去刚才转换的那个Jar包之外,还索要导入另一个Jar包,这一个jar包便是MATLAB中带的jarbuild.jar
    这些包,一般路线是E:\Program
    Files\MATLAB\R2013a\toolbox\javabuilder\jar 
     (MATLAB解析jar包文件)
  2. 用AS往Android工程导入JA汉兰达包的步子是那般的
    1. 将jar文件复制、粘贴到app的libs目录(app—src—main—libs)中(此时虽说jar已经复制黏贴过来了,但是还未导入,所以看不到jar中带有的内容。而已导入的jar,则能够观看jar中内容)
    2. 右键点击jar文件,并点击弹出美食做法中的“Add As
      Library”,将jar文件作为类库增添到花色中
    3. 删除jar包 的步骤
      1. 入选项目
      2. 点击 File——>Project structure——>module——>app
      3. 挑选 “dependencies”,选拔你要刨除的jar包,点击减号
  3. 用Eclipse往JAVA工程导入JA宝马7系包的步子是如此的
    1. 在java工程下新建五个lib文件夹(不新建也行,只是为着标准),直接把jar包拖入这么些文件夹
    2. 右键,加多依赖
    3. 永利开户送38元体验金 29.png)永利开户送38元体验金 30

 

 

 至此,完成。

伍、写多少个特其余工具方法作为调用Matlab函数的接口,传入输入变量,重返总括结果

 

怎么写:

  1. 导入甘休后,你能阅览实际是这么的
  2. 因此你写接口的话特别轻便
    1. 先new一个以此类,然后调用类的那几个办法,输入输出
    2. 向来截至

下一场写的话必要小心那样几点:

  1. (参数和再次来到值的数据类型什么的,matlab 的援救文书档案matlab builer for
    JA中说得很详细)
  2. 必须catch一下MWException,这个是matlab里边的
  3. 输入:
    1. 你的matlab函数是那样写的:output = annforecastthi(input_test)
    2. 您的函数里是把输入当成贰个大小为3二的行矩阵来用的,所以日常想在这应当是输入1个数组
    3. 只是依据代码提醒,你会开采不完全部都以如此,而是:第3个参数是输出数码个数,之后是二个个的输入数据,输入数据能够直接是八个数组
  4. 输出:
    1. 如出一辙,小编在matlab函数里写的输入是一个int值,为①如故二
    2. 而是在此地,你的输出是2个Object[
      ],假诺出口唯有五个的话,那便是result[0]
    3. 除此以外假设result[0]回到的是二个数组,能够通过如下的情势深入分析(供参谋)
      1. MWNumericArray a = new
        MWNumericArray(Double.valueOf(result[0].toString()),MWClassID.DOUBLE);
      2. MWNumericArray temp = (MWNumericArray)result[0];
      3. float [][] weights=(float[][])temp.toFloatArray();

 

public class TestMatlab {
       public static void main(String[] args){
              try {
                     ANNMatlab annMatlab = new ANNMatlab();
                      double[] array = {74.5,75.5 ,83.3 ,93.4 ,93.9 ,90.1 ,86.1 ,… };
                     Object result[]=annMatlab.annforecastthi( 1,array);
                     //函数第一个参数是输出数据个数,之后的就是是输入数据。
                                     System.out.println("result=="+result[ 0]);
              } catch (MWException e) {
                     e.printStackTrace();
              }
       }
}

 

然后在JAVA项目中运作,得到了不易的输入

永利开户送38元体验金 31

永利开户送38元体验金 32.png)

而是当把那个项目放在Android项目中运作的时候,开掘崩溃并且报错了

 

 

陆、Android项目中不或然直接使用Matlab中导出的jar包

基于前文的正确操作到这一步的时候,你会意识Android项目如故崩溃了,并且报那样的错

【java.lang.UnsatisfiedLinkError: Failed to find the required library
libmwmclmcrrt.so.9.0 on java.library.path. 】

以此漏洞非常多的乐趣是:在java路线上缺少那么些so文件

其一java路线能够经过【System.out.println(System.
getProperty(“java.library.path”));
】那句代码打字与印刷,小编那边打字与印刷结果是zycn根文件夹,也正是漫天项指标根文件夹

而这么些libmwmclmcrrt.so.九.0又是何等呢

  1. so文件和dll文件都以动态链接库(说白了便是一对库函数),dll文件是windows系统中应用的,而so文件是Linux系统中应用的
  2. 而那个libmwmclmcrrt.so.九.0大概是matlab代码要求的,不过怎么需求吗?不应该解决之后都会有吧?
    1. 索求引擎上有的贫乏.so文件的难题发出在Linux系统下,然后他们的化解办法都以1个,重新配置情形变量,因为周围在linux上安排那一个情状变量很轻松出难点()()()()()()
    2. 搜索引擎上还有缺乏dll文件的,一部分是情况变量的布署难点,1部分是亟需手动安装有个别800多M的文书(要是您要在并未有设置matlab的机器上用java调用那几个jar包,怎么做?也是足以的,可是,可是你要先在机器上安装matlab提供的MATLAB
      Compiler Runtime (MCTucson) ,它的安装文件在D:\program
      files\study\MATLAB\R2007b\toolbox\compiler\deploy\win3贰下(你的安装目录下)文件名MC汉兰达Installer.exe)()()
    3. 但这里因为在java项目中能成功运维,在android中非常,所以自然会想到是android系统的情状变量配置难题也许说便是跟android系统有关

新兴在matlab官方论坛和stackoverflow上转移了下首要词【直接matlab+android】,有找到对于那么些主题材料的一直表明,还有曲线救国的措施。相关的标题还广大,看来是多多益善人都超越了那几个难题

 

The .jar files that Compiler SDK generates cannot be run on Android. The .jar has a small interface to call upon the machine code library that is MCR, and otherwise the .jar contains encrypted data files. The encrypted data files are the "compiled" .m code, which is not compiled to java, but rather to MATLAB’s internal threaded interpreter. MCR decrypts the encrypted pcode’d .m files and uses them as data to be processed by the threaded interpreter. The encrypted data files themselves can be fairly operating system independent, but you need MCR to interpret them, and MCR is in x86 or x64 machine code for all versions of MATLAB since about R2009a. Android does not run on x86 or x64: Android runs on ARM processors (or possibly PowerPC as well, I am not certain.)
In short, you cannot use Compiler SDK to generate for anything useful on Android.
At this time, the only way to deploy for Android is to use Simulink with Target set to Android. You can have your Simulink blocks call a MATLAB Function block which is specialized MATLAB code (that has to be careful about how it allocates memory.) There is not much graphics you can do with this mechanism but it is the best that is available at this time.
I happened to look last night at some of the blocks available for deployment to a couple of the Android Galaxy devices. There is a block which accepts R, G, and B signals and displays the result as the screen. It would require computing the entire screen, I suspect. Some of the routines in the Vision toolbox help in that.
大意:matlab生成的jar包不能直接在android上运行,还需要用一个叫MCR的东西进行解码(The MATLAB Compiler Runtime (MCR) has the same System requirements as MATLAB. See System Requirements – Android is not one of them.它是matlab代码解析器),而MCR目前只能运行在X86或者X64的CPU上,但因为android是运行在ARM CPU上,所以是不可能使用的。
然后它说:此时,部署Android的唯一方法是使用Simulink与目标设定为Android。你可以有你的Simulink模块调用MATLAB函数的MATLAB代码块是专业(需注意如何分配内存)没有多大的图形可以做这种机制,但它是最好的,此时可用。
后边这个就看不懂了:我碰巧看的最后一个晚上的一些块可供部署到一对夫妇的安卓银河设备。有一个块,它接受R,G和B信号,并显示屏幕的结果。它将需要计算整个屏幕,我怀疑。一些例程中的“视觉工具箱”中的帮助。
 
I have not read about what can be done in R2016a. The situation as of R2015b was that in order to generate code for Android from MATLAB, what you needed to do was include the MATLAB code in a MATLAB Function block in Simulink and tell Simulink to target Android; there was no direct path for MATLAB to Android.
大意:你需要做的是包括在Simulink MATLAB功能块的matlab代码告诉Simulink目标Android
 
However, you should be able to use the MATLAB Coder product to generate a standalone C/C++ library from your MATLAB code and then invoke that from your Android application, possibly using JNI.
大意:你可以使用一个叫MATLAB Coder的工具来生成可以独立运行的C/C++库,他们可以在android中通过JNI来直接运行
 
MATLAB code that is put into a Simulink MATLAB Function Block (with appropriate adjustments made) can be generated for Android target using Simulink. There are a bunch of restrictions on this, but I think it can access the Android Sensor information for supported devices (Galaxy S4, Galaxy Note 2)
大意:matlab代码,把MATLAB的一个Simulink功能块(适当调整)可以为Android使用Simulink生成目标。有一些限制,但我认为它可以访问支持的设备Android传感器信息(Galaxy S4,Galaxy Note 2)
 
From MATLAB, you can communicate with Android camera and with Android sensors (at least for some models), but it is not possible to generate code for Android. You need to use Simulink to generate code for Android.
MATLAB Coder does not know about Android, so MATLAB Coder cannot generate Android calls for user interaction, networking, graphics, and so on. MATLAB Coder can generally generate C or C++, but unless it has been given information about the target system, MATLAB Coder has a library of calls that is not even as complete as the Standard C Library. This is not enough to create an Android "app"; at most it is enough to create a utility program.
Simulink does know how to target Android, so if you have a Simulink model and use the Android-specific blocks, Simulink can create apps. See http://www.mathworks.com/hardware-support/android-programming-simulink.html
大意:可以用Simulink
 
.so files are Linux Shared Object libraries. Those .so files are only available for Intel x86 (32 bit) and x64 (64 bit) instruction set (including AMD CPUs that implement those.) They are not available for ARM or other instruction architectures.
大意:.so文件本身也只能再X86的系统上使用,而不能在ARM上使用(这个存疑)
 
The .jar file requires the MATLAB Compiler Runtime (a freely redistributable component that you get with MATLAB Compiler and MATLAB Builder products) to be present. The MCR has a much larger footprint than is suitable for the typical Android device (it’s like a copy of MATLAB itself, without the user interface).
You could think about either
1)Running your MATLAB .jar file remotely on a server, and having your Android application connect to it, or
2)Instead of using MATLAB Compiler and Builder products, use MATLAB Coder, which will convert a subset of the MATLAB language directly into C code. This C code doesn’t require the MCR, and could be compiled to run directly on Android. Make sure your MATLAB algorithm falls within, or can be expressed in, the appropriate subset of the MATLAB language.
大意:前面都一样不说了,后边提了两个解决办法:1)不要再app上用Matlab代码,转移到服务器上;2)用MATLAB Coder编译成可以不需要MCR支持才能运行的C/C++文件
 
A new feature in Matlab 2014a:
http://www.mathworks.com/help/simulink/samsung-galaxy-android-devices.html
You can now directly install (limited set of) models to Samsung Android devices, and this should work actually on any Android device.
大意:2014的新版本中,你可以直接把matlab模型安装在三星安卓设备上,实际上就可以安装在所有安卓设备上

 

总计一下地点的原委:

  1. 直白在android
    app上行使deploytool生成的jar包是特别的,因为它无法独立运营,还索要MC翼虎的辅助,而出于CPU的因由MC汉兰达是无法运作在android碰着的
  2. 那正是说任何有效的直接方法有这几个
    1. 并非在app上用Matlab代码,转移到服务器上
    2. MATLAB
      Coder
      编写翻译成可以没有须求MCHighlander援救本领运营的C/C++文件,然后利用JNI的章程在android
      app上运用
    3. 能够透过1种【include the MATLAB code in a MATLAB Function block
      in Simulink and tell Simulink to target Android】的格局来做

 

对于第八个直接方法,肯定是行得通的,但由于当下自己那标准的界定,是无力回天兑现了

对此第三个直接情势,确定也是立见成效的,可是稍显复杂,这段时间自作者对此也远非读书

对于第多少个直接方法,笔者去差不多领会了眨眼间间,不过搞下来毫无头绪:

  1. 首先自身尚未找到step by step的科目,所以不得不贰个个要好去追寻
  2. 于是先去看了matlab的simulate系统,五个感受:
    1. 功效特别丰硕繁杂
    2. 找不到所谓的跟搞一个android虚拟机有关的东西
    3. 本条普通话入门教程还足以:
  3. 下一场自个儿看了下这几个什么Samsung虚拟机,发掘:那么些事物好像只是跟什么传感器有关,能够在matlab中获得三星手提式有线话机传感器的数量,跟自己酉来的供给未有提到
  4. 终极时光关系尚未承接深究下去

 

7、另一个消除办法

骨子里推荐使用方面包车型客车首先个或第三个直接情势,都很不利

而是最后我动用了个直接不过相比较轻便大概功用倒霉的主意:直接找了3个java写的神经网络开源项目,读了瞬间打探怎么用,就一贯放进app中动用了

就此那一个科目其实还差一步未有截止,之后有空把JNI学一下再来更新这几个片段

 

参谋资料:已在文中列出

相关文章