一个老菜鸟的J2ME心得

蓝牙开发那些事之ceva controller代码解读 对比ceva的经典蓝牙和ble的controller在软件上的差异点 阅读详情

 

我业余开发的一点点心得,如果有问题的话,希望大家批评指导 .

上一次,我主要聊了一下当前手机游戏开发的平台选择和开发环境的安装,也具体的谈了谈开发J2ME程序的简单入门方法。由于当前在手机上做游戏开发的大部分同志们用的都是J2ME,所以朋友们又催我继续深入谈一谈J2ME的开发技巧。本人所学甚浅,许多地方也都只是触及皮毛,因此只能简单的谈谈我在手机游戏的开发中碰到的一些问题和我个人采用的解决方案。另外我把平时在论坛里收集到的部分技巧提供给大家以作参考,这里特别感谢那些无私奉献自己知识的人们。如果在文章中存在什么错误,还请各位老鸟海涵。希望我这篇文章能起到一点抛砖引玉的作用吧。J

开发技巧这个东西是颇不好谈的。还记得我最早学习J2ME的时候,曾经在SUN的网站上看到过一篇文章,题目是《如何提高J2ME程序的效率》,作者口气强烈的要求j2me代码“寸土寸金”,仿佛令我回忆起了当年在单片机上的编程,其中有几个观点到现在还记得,比如不到万不得已不要创建新的类,限制使用接口数量,还有要缩短变量或函数名称等等…我刚开始照着这个那个规范编程的时候,反而在许多地方束缚了自己,搞的这也不好做,那也不好办。呵呵,这大概就是尽信书不如无书吧。所以,我在聊技巧的时候不会给大家设置很多条条框框,只讲一下对某个问题通常的解决方法,希望能对大家有一点帮助。再次感谢那些在网上和论坛上给我提供过帮助的朋友们。

 

游戏贴图

说起来千头万绪,不如就从最常用的贴图技巧开始说起吧。

 

MIDP手机程序的标准图片格式是PNG(便携式网络图片格式)。这里值得注意的是,不同的手机平台对于图片的要求也满“挑食”的,同样是PNG格式却不一定适用于所有平台。我就碰到过这样的情况,利用WinXP自带画图板生成的PNG格式图片,在WTK的标准模拟器上可以正常显示,到了西门子模拟器上却怎么也显示不出来。经过一番折腾,我在Photoshop中重新生成了新的PNG格式图片后才顺利的显示出。网上的一些朋友也曾问我,为什么在模拟器上运行正常的图片在真实设备上却无法显示。我也只能对他说多换几种生成图片的工具试试看喽。另外,因为图片资源会占用较大空间,所以应该尽量保证其尺寸小,数量少。用不同的编辑工具存储PNG位图时,其文件的大小会有很大的不同,你可以尝试多使用几种工具,选择其中存储最小的来使用。在这里我推荐一个工具:Image Optimizer。它可以在不影响图象品质的前提下将图象减肥,最高可减少50%以上,真的很神奇呦J

 

要把图片加载到你的应用程序中,需要调用Image.createImage()这个函数,并且需要做相关的异常处理,所以我一般会在MIDlet中定义一个工具函数,LoadImage()

具体代码如下:

//加载图片

       public Image LoadImage(String path)

       {

          try

          {

             return Image.createImage(path); //成功则返回图片对象

          }

          catch(Exception e)

          {

e.printStackTrace(); //不成功则打印错误信息并返回空值

return null;

          }

}  

 

如果有人问我,jar中什么是最占地方的?什么是最让你头疼的?我当然会毫不犹豫地说是图片,是PNG图片了。但是一个好的游戏又怎能少得了那些精美的图片呢?一个经常使用的窍门是将许多的图片文件合并到一个图片文件中来,这样可以在总体上减小将图片占用的空间。

在文件中载入这类大图像后,可以采用以下的方法来绘出动画的各个帧

g.setClip(x, y, FRAME_WIDTH, FRAME_HEIGHT);

g.drawImage(fiveMenImage, x – FRAME_WIDTH * frameNumber, y, Graphics.TOP | Graphics.LEFT);

    其中 x,y 为您绘图的起始坐标,FRAME_WIDTH和FRAME_HEIGHT为大图像的宽度和高度,frameNumber值由0-7的循环。这样你就可以制造出一幅精灵正在行走的动画了。但要注意,如果还有其他的图片需要绘制,请重置你的剪辑窗口。

    此外,当然是地图的绘制了

    

我们的大地图,通常是由许多的小块拼出来的,并会用一个数组来保存地图各个位置的地形和状态,然后统一的在paint方法中刷出整张地图来。

实例代码如下:

HouseVector = new Vector();  //设置一个动态数组存放截下来的图片

Image ImageTemp = null;      //存放大图片

Graphics g1 = null;         

try

{

    ImageTemp = Image.createImage("/res/image/house.png"); //加载整张大图片

}

catch(Exception exception) { }

for(int i = 0; i < 3; i++)

{

      for(int j = 0; j < 4; j++)

      {

         Image image_element = Image.createImage(16, 16);//作为截图的小图片

           g1 = image_element.getGraphics();     //获取小图片的图形设备

           g1.drawImage(ImageTemp, -16 * j, -16 * i, 20); //开始截图

           HouseVector.addElement(image_element); //添加到图片数组中

        }

}

  ImageTemp = null;

  g1 = null;

此后你的HouseVector中就是一块一块在大图片中截取下来的矩形小图片了。以后按照预先设计好的地图数组,直接刷图就是了,你的游戏地图不就pp的秀出来了么?J

 

 绘图技巧

我们通常做游戏是免不了需要使用Canvas类的,他就像一张空白的画布,我可以在上面描绘出我们的游戏主画面。但是游戏是一个连续动画的过程,而许多动画效果的优劣都取决于低级Canvas类的执行速度。当游戏的某一状态改变时,我们都要刷新屏幕。这个时候,我们通常需要用到这个函数

      repaint();

serviceRepaints();   //强制重绘,慎用!

但是,这样全屏绘制效率很低,在某些手机上效果很不好。所以如果仅需要改变屏幕中一小部分的话,也可以用以下的方法来请求重绘:

 Canvas.repaint(int x, int y, int width, int height)

  这样你仅需指定屏幕的特定区域,然后用paint方法重绘,效率会提高很多,还会保存计算结果。不过值得注意的是,如果你发了很多次的重绘请求而快于系统的处理速度的话,他就会合并一些处理的请求,并重绘了全屏幕,所以,请尽量不要在循环或者时序较小的定时器中调用repaint(int x,int y,int width,int height)。

 

在绘制某一个屏幕区域过于频繁的情况下(譬如动画效果),难免会发生“闪烁”的现象,造成这一问题的原因就在于在绘制屏幕某处之后的瞬间程序又在此处绘制了新的图像,解决这一现象比较有效的方法就是绘制缓冲图像,在内存开辟一块区域作为后台画面,游戏逻辑对它更新,在一次循环结束后再显示,这样就可以在避免出现因一次循环中对画面进行多次更新而产生的闪烁现象,另外请特别注意你在repaint中设定好的矩形范围。

具体的操作方法如下:

public class MyCanvas extends Canvas implements Runnable

{

 Graphics bg;            //缓冲区图像设备

 Image buf;              //缓冲区图像

 public MyCanvas()

 {

  ......

drawOthers();

  int height = getHeight();

  int width = getWidth(); 

  buf = Image.createImage(width, height); //按显示屏幕大小建立缓冲对象

                                      //此处也可以设为重复绘制的矩形区域 

  //将缓冲图像的图形设备赋给bg

  bg = buf.getGraphics();

  ......

 } 

 

 public void run()

 {......

  for(i=0;i<ROWS;i++)

  {

   for(j=0;j<COLS;j++)

   {

    drawBlock(x,y);//在缓冲区内绘制图像

   }

  }

  repaint();//将缓冲区的图像重绘到屏幕上

 }

 private void drawBlock(int block_x, int block_y)

 {  

  //取得方块的坐标

  int x = getLeft(block_x);

  int y = getTop(block_y);

  //取得方块的颜色

  int c= board[block_x][block_y];  

  bg.drawImage(imgs[c], x, y, Graphics.TOP | Graphics.LEFT); //在缓冲区的图                            形设备中循环绘制图像

 }

 

 public void paint(Graphics g)

 {

  g.drawImage(buf, 0, 0, Graphics.TOP | Graphics.LEFT); //绘制缓冲区图像

 }

}

    我在游戏中的地图就是采用这种方法来绘制的。

闪屏和进度条

你的程序有时候会由于处理一些比较复杂的工作(尤其是初始化)而导致整个屏幕静止了下来,不耐烦的用户就开始使劲的揿手机的键盘了。毕竟是手机程序嘛,如果让用户看到游戏的显示已经停止了变化,他们就一定会怀疑游戏或者手机发生了故障。所以我们要想办法告诉用户当前程序正在运行,这就涉及到了延迟掩盖技术。方法有很多,最常用的是闪屏(Splash Screen)和进度条方法。

 

如果你的游戏不能迅速的反应出用户的按键操作,则会被感应到响应迟钝。其实这种响应的速度与不同型号的手机是有很大关系的。当然了,任何超过一秒的操作都会被用户认为是极为漫长的,所以无论是何种型号的手机,都必须要确保按键事件回调函数(keyPress和commandAction)的快速返回。因为负责重绘的线程可能也会调用按键函数(而重绘线程又往往是最耗时的),所以应该启动一个独立的线程,让用户看到他的操作有所回应。

 

多线程被认为是解决此问题的一个合适的方法。这是因为当你的一个线程正处于某种条件等待的时候,另一个线程仍然能工作。需要注意的是,Java线程不一定会具有抢先权,所以我们的代码不应该在死循环中去等待条件,这样常会被用户错误地认为是死机了。遇到实时性比较高的游戏我们可以在每次的循环中调用yield或者wait方法。

例如:

while (!stopped)

  {

doSomething();

synchronized(this)

  {

wait(500); //milliseconds, i.e. half a second

}

}

 

 

 使用资源

合理的资源利用,也是保证程序高效的有效手段之一。其中最为主要的就是合理使用你的堆内存,必须确保释放不再需要的Form和Canvas,(例如Splash Screen,游戏的关卡等)这些可都是些大家伙,极耗内存的,不用的时候可以将他们置为空,以便进行垃圾收集。不经常用的屏幕(如游戏说明,选项等)应该在用的时候才创建,并且在使用后别忘了作为垃圾收回。这样做也是牺牲了速度而换取了额外的堆空间。如何在时间和空间这对矛盾中进行取舍,可就要完全看读者你了。J

我们在写java文件的时候,经常要导入一些开发包,这些开发包给我们提供了各种各样的支持的库功能。譬如系统自带的 java.io.*或者 java.util.* 以及第三方厂商提供的扩充包com.nokia.mid.ui.FullCanvas等。但是如果整个库都被包括在Midlet文件中,你可能就要为许多程序本不需要的功能增加系统开销了。所以在使用库的时候,一定要清楚是否真正的需要用到库中所有的类。请尽量不要使用.*的模式,而是明确地指定您具体导入的包名称,例如com.nokia.mid.ui.FullCanvas。

在垃圾的对象负责收集管理的实例中,我不知道有什么比String和StringBuffer更加有名气的了。不止在一份资料上有这方面的例子。String 作为一个不可变对象,他的状态自创建后就不可改变了。这样虽然利于代码的可靠和线程的安全,但是当它所代表的值发生变化时,初始值就失去了意义,于是旧的对象滞留在了堆里,形成垃圾。多数程序员都应记得曾因为使用String而产生了不知道多少的垃圾对象,这对程序的效率会有很大影响的。所以要想进一步提高效率,最好使用可重用的对象。

    示例代码如下:

经典的例子是字符串的连接。

请看下面的倒排字符串函数:

static String reverse(String s)

{

String t = "";

for (int i = s.length()-1; i >= 0; --i)

t += s.charAt(i);

    return t;

}

第5行的赋值语句并不改变字符串t,因为t是不可变的。相反,它每次都创建一个新字符串,复制现存的值并添加新字符。这一方法将不必要地创建s.length()个垃圾对象。这个典型例子说明了不可变对象所存在的问题。然而,对于字符串却有一个简单的解决办法:类java.lang.StringBuffer是与String相对应的的可变操作类,上面的例子可以更高效地重写为:     static String reverse(String s)

{

StringBuffer t = new StringBuffer(s.length());

for (int i = s.length()-1; i >= 0; --i)

t.append(s.charAt(i));

return t.toString();

}

这是一个经常被拿出来的范例。J

 

 

试程序

我在开发中是选用WTK环境来进行编译打包的。写Code采用的是Uedit。这些工具配置起来极为简单,使用也很方便。可就是有一样,调试起来比较的困难,没有一个很好的DeBug工具。尽管WTK自带了根据设备定制异常跟踪、内存管理等功能,但用于调试程序还是不太方便。故此需要我们自己来想想办法。最经常用的当然是ShowMessage大法了,可以自己在程序中选择断点,把程序运行于此处时的各个变量值Print出来。

例如: System.out.print(程序的过程变量);

但是我有一个朋友自己写了一个设置断点的工具函数,也是非常好用的,共享给大家:

boolean debugflg=false;//调试标志

…

Debug() //设置断点

…

 

private void Debug ()

 { 

System.out.print(程序的过程变量);//打印程序的当前变量的值

      while(debugflg){}                  //等待用户消息

 }

 public void keyPressed(int keyCode)

 {  

  debugflg =false;

 }

 

校屏

大家是否都有过这样的经验:在一个设备上作好的程序当拿到另外的设备上跑的时候,      即使程序中的API都是通用的,还是会出现这样那样的问题。其中最令人头疼的可能就是图片和文字都会因为设备的屏幕大小不同而乱掉。乖乖,又是好一番调整。J 如果想让自己写的程序能够畅通无阻的运行在各种平台上,第一是要考虑用通用的开发包,第二当然就是需要校屏,也就是将自己要显示的图片,文字用程序动态的确定位置,使之在各种大小的屏幕上都能达到居中等效果。这样才能保证程序的通用性。

实例如下:

public class MyCanvas extends Canvas

{

 private  final int addX;     //坐标矫正

 private  final int addY;

 private  final int screen_X;  //屏幕顶点

 private  final int screen_Y;

 private  final int str_X;     //字符串顶点

 private  final int str_Y;

 private  final int pic_X;    //图形的顶点

 private  final int pic_Y;

 

 public MyCanvas()

 {

  //取得当前手机屏幕的高度和宽度

 int  height = getHeight();

 int  width = getWidth();

 

  //坐标矫正量 

  addX = (width-120)/2;

  addY = (height-142)/2;

 

  //初始化屏幕参数

  screen _X = addX + 48;  //屏幕顶点

  screen _Y = addY + 10;

  str _X = addX + 19;     //打印字符串的顶点

  str _Y = addY + 103;

  pic _X = addX + 36;    //显示图像的顶点

  pic _Y = addY + 34;

  }

}

 

我记得一位老鸟曾经告诉过我:程序往往用90%的时间去运行10%的代码。因此,与其努力提高所有代码的效率,不如找出代码中的“瓶颈”,使之更高效地工作,这样会得到更高的收益。 呵呵,有时候细心的逐行审查自己的代码,往往会存在几条语句能大大的提高运行的效率。但是如果你想程序能够得到更高的效率,那么就请在写代码之前精心的设计和选用合适的算法把。

C++ 图像线特征提取(CannyLine算法+opencv3.4.6) 阅读详情

相关推荐

华为[ENSP]OSPF的配置实例(单区域+多区域)

华为[ENSP]OSPF的配置实例(单区域+多区域)

weixin_62594100的博客 2万+

PHPRPC 3.0.2 for Java/J2ME 中的异步调用

在大多数情况下,同步调用即可满足您的需要。但是有 2 种情况下用异步调用会更加方便一些: 首先是当做图像界面编程时,要防止单线程下同步调用出现卡死界面的现象,可以使用异步调用,但这种情况下,采用同步调用加多线程技术也可以解决。 另一种情况是,当使用同步调用加多线程时,如果你要获取服务器端输出重定向的内容或者要获取警告错误,则可能会获取到错误的内容,原因是另外的线程执行时也有可能改写 o...

andot 的笔记本 207

使用C#调用百度地图并实现坐标点的设置以及读取

使用C#调用百度地图申请百度地图密钥以及查看百度API程序实现功能:最终图利用webBrowser控件展示地图 申请百度地图密钥以及查看百度API 网址:http://lbsyun.baidu.com/apiconsole/key#/home 网址:http://lbsyun.baidu.com/jsdemo.htm#c1_3 程序实现功能: 1、输入网址那可以调用本地的html文件,也可以访问其他网站 2、输入坐标、添加坐标按钮,可以将坐标值传入html文件中,显示在经纬度的文本框中 3、定位按钮可以

qq_39261042的博客 3735

j2me学习杂记三 -- 刚开始的理解

 首先我们问个问题,什么是j2me?Java发展到现在,在其平台上出现了4个主要的分支,我们看这幅图。第一个j2ee 应用于企业级的解决方案。第二个j2se 用于一般台式计算机的软件开发。第三个j2me 应用于嵌入式设备的开发第四个 java for smart card 主要用于智能芯片和IC卡的开发。我们要记得j2me 是应用于嵌入式设备的开发平台。

起点徘徊|Initial Point Linger 1112

香橙派5上跑DeepSeek-R1的避坑指南:从模型下载到NPU加速全流程解析

本文详细解析了在香橙派5(RK3588)上部署DeepSeek-R1蒸馏模型的完整流程与优化技巧。内容涵盖从系统配置、RKLLM工具链编译、模型转换到NPU加速调优的全过程,重点分享了如何利用RK3588的NPU算力实现高效推理,并提供了常见问题的解决方案,为边缘设备部署LLM提供了实用指南。

CAT789的专栏 717

C语言 在合并编译 ( 多.c文件 ) 情况下 实现 linked list ( 链表 ) 教程 . 更新ing

写在前面  依旧是参考借鉴了 浙江大学 温老师 的视频教程,很不错,在中国大学MOOC上,强力推荐!  虽说有借鉴,但是能保证的是每一行代码都是我自己经过理解后手敲出来的,所以才来做了这部分的教程。  最后,带 * 字符是我个人觉得可以添加的功能,按理来讲是可以不看的,而且大概率是可以有更好的改进的。  PS: 文章还在更新,如果文字蓝了(有超链接),说明写完了,如果没蓝,说明我在开军舰.jpg 源代码:  这里→源代码. 第一步:前置工作  先说一下每一篇都会出现 main 函数的,stage1 只是给没

weixin_47287635的博客 527

J2ME移动开发,菜鸟指南(转)

要进行J2ME的开发,首先必须要建立开发的平台,而在开发的平台选择上,我来介绍3条路。 1:功能比较全的平台JBUILDER; 搭建这个平台,我们必需要的材料有:JBUILDER 7 或 JBUILDER 8 ,BORLAND ...

cuankuangzhong6373的博客 1114

MATLAB 2022b 用户专属:保姆级IPOPT求解器安装配置全流程(含OPTI工具箱)

本文为MATLAB 2022b用户提供IPOPT求解器的详细安装与配置指南,涵盖OPTI工具箱的适配安装、环境变量设置及常见问题解决方案。通过实战案例演示非线性优化问题的求解过程,帮助用户高效部署这一强大的优化工具,提升工程计算效率。

weixin_29092031的博客 407

J2ME 认识

     在此只是介绍自己对J2ME的认识,高手级的人物就无须继续LOOK!     J2ME概念的了解:     学习Java以前就知道了JAVA有由J2SE,J2ME,J2EE这三部分组成,听说J2SE是基础,J2EE是网络版,J2ME是手机版;自己就摒弃了对J2ME的学习,因为当时没有什么感觉!现在手机业的无线网的发达,让我这种不追求时尚的人也开始使用智能手机,3G式手机哟,因此

loaferwang的专栏 909

IDEA 2023.2.3全平台安装指南:Mac/Windows/Linux一键激活(附最新补丁获取)

本文提供IDEA 2023.2.3在Mac、Windows和Linux三大平台的一键安装与激活指南,包含最新补丁获取方法。详细讲解各系统安装流程、性能调优设置及高效开发技巧,帮助开发者快速配置并提升工作效率。

weixin_28832121的博客 399

【2026最新版】PCL点云处理算法汇总(C++长期更新版)

PCL学习目录。博客长期更新,最近一次更新时间为:2026年10月4日。

点云侠的博客 63万+

j2me难啃问题

1、安装后自动运行; 2、开机自动运行; 3、能够为Java虚拟机 补丁,实现将某些原来不支持的JSR包功能增加到Java环境中; 4、能够比较方便的破解Java的安全提示和安全限制(最好是程序自动,无需用户过多参与); 5、通过Java程序启动其它程序(包含Java程序或Symbian/系统程序等) 6、Java进程之间的其它通讯方式(Socket通信除外); 7、Java连网时,自动选择网络接

gogo313的专栏 910

一次携程酒店 phantom-token 逆向实战复盘(附python纯算)

摘要 本文介绍了通过分析携程酒店列表页面的数据接口,使用Python实现抓取的方法。主要内容包括: 目标站点为携程酒店列表页,通过开发者工具发现关键接口fetchHotelList 将浏览器请求转换为Python代码,包含请求头(headers)、Cookies和POST数据 提供完整的请求示例代码,包含日期参数、城市ID等必要信息 特别声明仅供学习交流使用,禁止商业用途 展示了如何获取酒店列表数据,包括排序筛选等参数设置 该方法可用于研究酒店数据采集,但需要注意遵守网站使用条款。

自成背后的博客 3029

J2ME中RMS高效存取

<br />前言    ——如果想直接看技术这段可以忽略<br />    对于初学J2ME的人来说,如果去市面上挑上几本所谓的教程来学的话还不如奉劝他直接学J2ME的API文档。人家的教程也无非把API翻译了一遍。所以对于J2ME开发人员来说技术上看上去根本没什么含金量。就那么几个类几个函数调来调去的。    呵呵,痛苦的事情也在这里,目前对于大部分支持JAVA程序的手机来说他们提供JAVA虚拟机可用的内存相当的少一般的也就在2MB的样子,内存无疑是检验程序是否给力的一个标准。    前段时间做手机JAV

JasonChan2008的专栏 719

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

J2ME移动开发平台搭建篇

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 6248

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Ericl的j2me手机游戏之旅(一)平台塔建

Ericl的j2me手机游戏之旅(一)平台塔建现在网上已经有很多介绍j2me手机游戏开发入门的文章了,但是很多作者都是写写停停,不然就是更新很慢,没有给同学们一个互动的平台,不能热烈的讨论有些问题。这次俺Ericl在手机外包这个板块里发的《j2me手机游戏之旅》,就是希望在我写文章的同时,能够抛砖引玉,使大家能够一起讨论。能给菜鸟同学一个入门的学习,给老鸟同学一个讨论的环境。===========

longzy32的专栏 1236

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

菜鸟求救!j2me在eclipse中运行环境配置

关于j2me的程序在eclipse中跑不起来,据说是缺少了javax.microedition.midlet这个包,请问在哪里下载的啊(方便的话给个确切的链接),除了这个包之外还缺少什么包吗? 还有怎么用eclipse使用手机模拟器啊? 大家帮帮忙啊,真的是菜鸟,昨天刚准备说写个手机游戏,仗着有点java基础,可以环境都配不起来,我都快绝望了!

xibiaolan5234的博客 355

J2ME入门体会

学习J2ME已经有几天的时间了,今天我以一个初学者的角度来谈谈如何学习J2ME 记得我第一次看J2ME的书时间是在我要去应聘xxx公司的J2ME开发工程师职位的前一天,那天为了面试的需要我准备了一天的时间,对于一个J2ME的菜鸟都还算上的我可想而之在短短的一天时间能准备成什么样子,我们知道一门语言要入门是得有一个过程的,这个过程至少要有4天的时间,何况面对的大家公认很难的J2ME,...

开心的穷下去 171

开始学习了J2ME

   Java社区,初来咋到,希望大家多支持,多指教!  本人是Java学的稀烂的,但是还是不甘心放弃的,不是有句古话说的好:世上无难事,只怕有心人啊!那么多菜鸟,多我一个也不多嘛·!嘿嘿!所以我决定不懈努力,勇往之前!  本来一只脚还没有踏进Java的门槛,见别人学J2EE,心里挺着急就一头载进去,结果还是晕,所以现在又是J2ME,虽然有点难度,可还是觉得学习有意思,人生一辈子那么长,不

一米阳光做IT 695

j2me学习方法总结--摘录篇

给J2ME初学者的建议- -http://gophinight.blogchina.com/195665.html在学习的过程要自己做例子,曾经有朋友跟我抱怨说自己不知道做什么项目来训练,其实自己做练习并不一定要一个很完整的项目,可以从一些最基本的游戏模块开始练习,比如,如何在屏幕上显示一张图片或者多张图片,如何来实现这些图片的重叠和移动(手动控制移动或者自动移动),如何在显示图片的时候调出一个F

葡萄.呓语 2169

j2me加载图片的路径问题

最近做j2me开发遇到的最大问题无疑是加载图片,在j2se中,图片放在工程根目录下用Image.createImage("test.png")不会报错,但是在j2me中,这样却会出现错误。参考网上的解决方法后,终于明白了图片要放在res文件夹中,这个文件夹专门用来存放图片等资源文

sycflash的专栏 1178

【J2ME资料汇总】48个推荐资料+40个经典源码

【J2ME资料汇总】48个推荐资料+40个经典源码——下载目录 本文当由网友wgzaj文档根据资料的热度和好评收集了88个J2ME精品资料,分享给研究J2ME开发的同学。内容包括6个J2ME专题和42个推荐资料以及40个经典源码。附件较多,无法一一分享,只能为大家整理一个下载目录了,可以保存以备后用,需要时选择性下载哈。 附件完整版,下载中心地址:http://down

yixuan_1的专栏 968
上一篇: WTK使用简介——使用入门
下一篇: Flash Communication Server笔记一
JavaProgramers
博客等级 码龄22年 660粉丝 304原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值