《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 10258|回复: 32
收起左侧

[教程] [原创]Java调用MATLAB实现三点平滑去噪并绘图

  [复制链接]
发表于 2012-4-20 21:17:35 | 显示全部楼层 |阅读模式
【题外话】周末的晚上,窗外下着雨,感谢那个她,使我觉得屏幕上的一行行代码是那么地优美、动人......

【致谢】此帖的完成,磕磕绊绊,经历了N多错误的折磨,感谢万能的网络资源......

  • 所需软件开发工具
    (1)MATLAB2011a(是废话么?呵呵)需要说明的是,本人尝试过在MATLAB2012a环境下测试,但木有成功,是偶的RP有问题么?欢迎朋友测试!

    (2)JDK版本:Java 1.6.0_17 (最新版本为1.7.3,本人血与泪的经验教训啊,多方软件混合开发时,最好不要用最新的版本啊,一味赶时髦的结果,你懂的!)

    (3)Eclipse version:3.7.2 (Eclipse是什么东东?问百度还是天涯?)
  • Java环境配置

    Java的环境配置可以参考Dynamic的原创帖子Matlab Builder for Java运行配置

    Java调用MATLAB程序的Demo可以参考Dynamic的原创帖子MATLAB Builder for Java入门实例详解,值得一提的是,编译完jar后,在dos或MATLAB环境下调用时,javabuilder.jar文件所在的绝对路径中不能含有空格啊,因为这个问题,耗费了我半天的时间啊,由此可见Dynamic乃神人啊,一次搞定,未见任何错误,羡慕嫉妒恨啊!

    However,由于Dynamic的例子中,没有涉及到函数的输入参数和返回参数问题,因此,本帖旨在对带参数的函数调用进行说明,希望可以起到抛砖引玉的作用。
  • MATLAB程序编写

    本例实现一个三点平滑去噪的函数Denoise.m:

    1. function y = Denoise(x)

    2. m = length(x);

    3. y = zeros(size(x));

    4. y(1) = x(1);
    5. y(end) = x(end);

    6. for i = 2:m-1
    7.     y(i) = (x(i-1)+x(i)+x(i+1)) / 3;
    8. end

    9. plot(1:m,x,'r',1:m,y,'b')
    复制代码
  • m文件编译为jar文件

    m文件编写完成后,即可利用deploytool命令将其编译为jar供Java调用,具体步骤可参考Dynamic的帖子,此处不再赘述。相关名称如下:

    项目名称:DenoisePrj
    类名称:DenoiseCls
  • 添加jar文件

    编译完成后,在src文件夹下(或distrib文件夹下)可以发现存在DenoisePrj.jar文件。在<matlabroot>\toolbox\javabuilder\jar文件下可以发现存在javabuilder.jar文件,这两个文件一会儿会用到。

    打开Eclipse,创建一个新的Project(项目名称为DenoiseJava),这时Eclipse会自动创建一个src文件夹,将DenoisePrj.jar和javabuilder.jar拷贝到该文件夹下(习惯如此操作,方便管理,不知是否必须)。在Package Explore导航栏中右击DenoiseJava选择Properties,弹出Properties for DenoiseJava对话框。选择Java Build Path选项卡,点击“Add External JARS...”将DenoisePrj.jar和javabuilder.jar添加进去,最终效果如下图所示。
    QQ截图20120420210623.png
  • Java程序编写

    在该Project中创建一个新的class(类名为DenoiseExample),添加如下代码:

    1. // DenoiseExample.java
    2. import com.MathWorks.toolbox.javabuilder.*;

    3. import DenoisePrj.*;

    4. public class DenoiseExample
    5. {

    6.         /**
    7.          * @param args
    8.          */
    9.         public static void main(String[] args)
    10.         {
    11.                 // TODO Auto-generated method stub
    12.                
    13.                 MWNumericArray a = null;
    14.                
    15.                 Object[] b = null;
    16.                
    17.                 DenoiseCls denoise = null;
    18.                
    19.                 double n[] = new double[100];
    20.                
    21.                 for (int i = 0; i < n.length; i++)
    22.                 {
    23.                         n[i] = Math.random();
    24.                 }
    25.                
    26.                 try
    27.                 {
    28.                         a = new MWNumericArray(n,MWClassID.DOUBLE);

    29.                         denoise = new DenoiseCls();

    30.                         b = denoise.Denoise(1,a);
    31.                        
    32.                         System.out.println(b[0]);       
    33.                        
    34.                         denoise.waitForFigures();
    35.                 }
    36.                
    37.                 catch (Exception e)
    38.                 {
    39.                         System.out.println("Exception: " + e.toString());
    40.                 }
    41.                
    42.                 finally
    43.                 {
    44.                         MWArray.disposeArray(a);

    45.                         MWArray.disposeArray(b);

    46.                         if (denoise != null)
    47.                         {
    48.                                 denoise.dispose();
    49.                         }
    50.                 }

    51.         }
    52. }
    复制代码
  • 运行结果

    OK,大功快告成啦!点击Run按钮运行吧,上帝保佑你不要出现某些该死的错误信息哦!
    运行结果如下:
    QQ截图20120420211625.png

    QQ截图20120420211635.png

评分

参与人数 4威望 +4 贝壳 +33 贡献 +19 收起 理由
machreehappy + 3 + 6 鼓励帮助他人,我们共同进步
fengzhizizhi + 3
rocwoods + 2 + 10 + 10 感谢您分享自己珍贵的资料
yaksa + 2 + 20 感谢您分享自己珍贵的资料

查看全部评分

发表于 2012-4-20 21:21:25 | 显示全部楼层
沙发是我的,之前的Matlab for Java例子是没有考虑太多的问题,这次yangzijiang的更加具体详细了,也讨论了之前没有遇到的问题,值得学习
发表于 2012-4-20 21:21:48 | 显示全部楼层
学习下~~~稍后转发新浪微博!
发表于 2012-4-20 21:40:54 | 显示全部楼层
努力学习中
发表于 2012-4-20 21:51:30 | 显示全部楼层
我也来学习啦!感谢分享!
发表于 2012-4-20 22:01:35 | 显示全部楼层
发表于 2012-4-21 00:17:26 | 显示全部楼层
领悟中。。
发表于 2012-4-21 09:59:14 | 显示全部楼层
好贴,先收藏了!留待慢慢学习!
发表于 2012-4-21 11:53:03 | 显示全部楼层
不错,谢谢
发表于 2012-4-22 17:42:29 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 蜀ICP备19014457号 

GMT+8, 2020-10-25 16:12 , Processed in 0.068320 second(s), 17 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表