[转贴]关于exe形式编程的一点心得,希望对大家有所帮助

VC++ MSDN离线帮助文档安装配置全攻略 在软件开发中,离线文档系统是保障开发效率与稳定性的重要基础设施,尤其对于依赖特定技术栈的工程实践。其核心原理在于将权威的技术知识库本地化,通过索引与查询技术实现快速检索,从而消除网络依赖带来的不确定性。对于Windows平台下的Visual C++开发而言,MSDN离线帮助文档的技术价值尤为突出,它不仅是API查询工具,更是涵盖MFC、ATL、CRT及Windows SDK等核心技术的完整知识体系。在**内网开发环境**或**遗留系统维护**场景中,网络不稳定或封闭性要求使得离线文档成为刚需。通过正确获取、 阅读详情
关键字: exe, 后台程序, 调试, Console, 多个实例, 窗口, 字体

其实我也只是一个Symbian的初学者,我能深刻的感受到一个初学者在探索新的开发平台时的坎坷。以下的心得是我经过一段很长时间的探索才得到的,这其 中走了很多弯路,也得到了很多人的帮助。现在我将其整理了一下贴出来,希望能给寻求相关知识的朋友一些帮助,以便于大家少走一些弯路。
当然我的水平有限,理解不深,错误在所难免,希望大家发现后能及时指正。

1.为什么要用exe形式的程序?
相信绝大部分人做Symbian程序都是从app开始的,app的例子非常多,很容易上手。但是有些需求在用app实现中出现了一些问题,假设我们要做一 个来电检测程序,把所有来电号码都记录在一个文件中。如果用app做当然可以实现,但是问题是这个app是有窗口界面的,但这个窗口对使用者来说毫无价 值,白白浪费了一大块资源,但是又不能把这个窗口关掉,一旦关掉,app就终止运行了,来电检测也就无法实现了。类似的程序的最佳解决方案就是做成exe 形式。
通常exe程序是用来做后台服务的,对使用者来说他是不可见的,通常没有界面,这样既节省了资源,有不会因为使用者不小心关闭了程序而导致功能无法实现。

2.exe程序的框架
exe的例子也有一些,大家可以参考那些例子来建立mmp文件以及程序基础框架,这里就不多说了。
exe总是从E32Main函数开始执行的,我是用如下的E32Main代码的:
Code:
GLDEF_C TInt E32Main()
{
CTrapCleanup* cleanup = CTrapCleanup::New();

RUNMAIN(); // 宏

_LIT(KMsgPanicEpoc32ex,"EPOC32EX");
__ASSERT_ALWAYS(!error,User::Panic(KMsgPanicEpoc32ex,error));
delete cleanup;
return 0;
}
这里的处理程序 RUNMAIN 其实是我定义的一个宏,通常情况下,他是:
#define RUNMAIN() TRAPD(error, MainL());
实际上就是去掉用MainL。为什么这么做,后面会提到。
MainL的代码如下,构建了CActiveScheduler,然后就是具体的处理了
Code:
void MainL()
{
CActiveScheduler* scheduler = new(ELeave) CActiveScheduler();
CleanupStack::PushL(scheduler);
CActiveScheduler::Install(scheduler);

// 具体的处理
// ......

CleanupStack::PopAndDestroy(scheduler);
}


3.如何调试exe
又了上面的代码,这个exe已经可以编译和运行了,虽然他什么实质的事情都没做,但是他的的确确已经是一个合格的exe了。如果你把编译好的程序放到手机 上运行(用文件管理器打开),你会发现什么都没有发生,你无法判断它是否执行了,执行到哪里了。这就带来一个调试的问题。
首先说说如何在VC6环境中调试,这个比较简单,调试app的时候,我们是指定vc6运行那个模拟器程序的,而调试exe你只要指定vc6调试时运行你生 成的那个exe就可以了,当然这个exe是wins编码的,不能是手机上运行的armi编码。调试运行后也会显示手机模拟器的界面,不过没有9宫格主菜单 了。
比较麻烦的是手机上的执行调试,如前面提到的那样,我们可能什么都看不到,那么如何让exe显示一些信息呢?这里就需要用到控制台Console。Console就如Windows上的dos窗口,是纯文本的,对付信息显示是绰绰有余。
Console的用法也非常简单,先构造CConsoleBase,然后就可以用它的Printf函数在控制台上输出数据了。
我把Console单独放在一组cpp/h文件中,如下:
Code:
// ================= Start of console.h =======================
#ifndef __CONSOLE_H__
#define __CONSOLE_H__

#include <e32base.h>
#include <e32cons.h>
#include <e32std.h>

#define _DEBUG_CONSOLE_

#ifdef _DEBUG_CONSOLE_
extern CConsoleBase* gConsole;
extern void ConsoleMainL();
#define RUNMAIN() TRAPD(error, ConsoleMainL());
// 显示字符串
#define CONSOLEPRINTINFO(infostr) gConsole->Printf(infostr);gConsole->Printf(_L("/n"));
// 先是数字
#define CONSOLEPRINTNUM(num) gConsole->Printf(_L("%d/n"), num);
#else // _DEBUG_CONSOLE_
#define RUNMAIN() TRAPD(error, MainL());
#define CONSOLEPRINTINFO(infostr)
#define CONSOLEPRINTNUM(num)
#endif // _DEBUG_CONSOLE_

#endif //__CONSOLE_H__

// ================= End of console.h =========================

// ================= Start of console.cpp =======================
#include "console.h"
#ifdef _DEBUG_CONSOLE_
extern void MainL();
CConsoleBase* gConsole;
void ConsoleMainL()
{
gConsole = Console::NewL(_L("MyExe"), TSize(KConsFullScreen, KConsFullScreen));
MainL();
delete gConsole;
}
#endif
// ================= End of console.cpp =========================
这样一来我只要将"#define _DEBUG_CONSOLE_"这一行去掉就可以编译生成不含Console的最终代码了,而加上这一行就可以显示调试信息。在主代码中只要调用 CONSOLEPRINTINFO 和 CONSOLEPRINTNUM 两个宏来分别显示字符串和数字,而不用再考虑是否define了_DEBUG_CONSOLE_。
看到这里的 RUNMAIN 宏了吗,他的作用就是在调试的时候去执行ConsoleMainL,而不是MainL,两者的区别就是ConsoleMainL先建立了一个Console,最后再将其释放。
放到手机上运行一下吧,运行后会出现一个全屏的白色窗口,其实你可能看不清这个窗口,因为它是一闪而过的。怎么会这样,呵呵,因为我们的MainL()函数里面什么都没做,exe程序当然就立即结束了。你可以尝试在MainL()函数“具体的处理”这部分加上两句话:
CONSOLEPRINTINFO(_L("Hello World!"));
CActiveScheduler::Start();
第一句是在控制台上显示Hello World;第二句开始检测CActive事件,这里用这个只是为了能让程序保持住,而不会立即结束。在手机上运行后,你会发现一个白色窗口,上面显示 Hello World。新的问题又来了,这个程序现在总也结束不了了,这时候需要一个线程管理工具来终止这个exe,这样的工具有AppMan和TaskSpy。
注意你的线程名称,当你是用了Console时,线程名称就是控制台名称“MyExe”,当不用Console时,线程名称就是那个exe的名字,这点对下一段很有用。为了保持一致,建议大家将控制台名称设定为exe程序的名称。
另外你可以根据你的需要定义你的显示宏,而不一定是我这里的 CONSOLEPRINTINFO 和 CONSOLEPRINTNUM。

Old



4.如何防止exe运行多个实例
和app不同的是,exe可以运行多个实例,在某些情况下,这是有用的。但是如果我们不需要这个特性,那么如何才能阻止exe运行多个实例以减少资源占用呢?这就需要用TFindProcess。
将MainL写成:
Code:
_LIT(KPROCESSNAME, "MyExe*");  // 线程名称
void MainL()
{
CActiveScheduler* scheduler = new(ELeave) CActiveScheduler();
CleanupStack::PushL(scheduler);
CActiveScheduler::Install(scheduler);

// 寻找符合条件的线程
TInt pcount = 0;
TFullName processName;
TFindProcess findProcess(KPROCESSNAME);
while (ETrue)
{
findProcess.Next(processName);
if (processName != KNullDesC)
{
pcount ++;
CONSOLEPRINTINFO(processName);
}
else
break;
}

if (pcount <= 1) // 只有本线程运行
{
// 具体的处理
// ......
}

CONSOLEPRINTINFO(_L("Exe End"));
CleanupStack::PopAndDestroy(scheduler);
}
注意,KPROCESSNAME是线程主名称,后面*是一个通佩符,因为具体的线程名称后面还跟着一串数字,我们只要定位前面的关键字就可以了。
这里判断线程的数量用了 if (pcount <= 1),而不是<1,因为当前在做判断的线程也算一个。
当发现有其他相同的线程在运行时,本线程就跳过具体的处理,直接结束了。这样就达到了我们的目的。




5. 如何让exe程序显示信息窗口
exe是后台的程序,通常是没有窗口界面的,但是我们有时候需要让使用者获得一些信息。比如一个闹钟提醒程序,平时在后台运行,到时间后除了要播放闹铃,可能还需要在屏幕上显示一些用户预先设置的提示信息,如"XXX生日"之类的。这时候就需要来构造一个窗口。
Code:
// ================= Start of Window.h =======================
//

#if !defined(__MY_WINDOW_H__)
#define __MY_WINDOW_H__

class CWindow;

/////////////////////////////////////////////////////////////////////////
////////////////////// Declaration of CWsClient /////////////////////////
/////////////////////////////////////////////////////////////////////////

// Base class for all windows
class CWsClient : public CActive
{
protected:
//construct
CWsClient(const TRect& aRect);

public:
static CWsClient* NewL(const TRect& aRect);
void ConstructL();
// destruct
~CWsClient();

public:
// terminate cleanly
void Exit();
// active object protocol
void IssueRequest(); // request an event
void DoCancel(); // cancel the request

virtual void RunL(); // handle completed request

private:
CWsScreenDevice* iScreen;
CWindowGc* iGc;

CWindow *iWindow;

RWsSession iWs;
RWindowGroup iGroup;

const TRect& iRect;

friend class CWindow; // needs to get at session
};

//////////////////////////////////////////////////////////////////////////////
///////////////////////// CWindow declaration ////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

class CWindow : public CBase
{
public:
CWindow(CWsClient* aClient);
void ConstructL (const TRect& aRect);
~CWindow();

public:
// access
RWindow& Window(); // our own window
// drawing
void Draw(const TRect& aRect);

private:
CWindowGc* SystemGc(); // system graphics context

private:
RWindow iWindow; // window server window
TRect iRect; // rectangle re owning window
private:
CWsClient* iClient; // client including session and group
};

#endif // __MY_WINDOW_H__

// ================= End of Window.h =======================



// ================= Start of Window.cpp =======================
// Window.cpp
//

#include <w32std.h>
#include <coedef.h>
#include "Window.h"

///////////////////////////////////////////////////////////////////////////////
////////////////////////// CWindow implementation /////////////////////////////
///////////////////////////////////////////////////////////////////////////////

CWindow::CWindow(CWsClient* aClient)
: iClient(aClient)
{
}

void CWindow::ConstructL (const TRect& aRect)
{
// Use the window group for parent window
RWindowTreeNode* parent= &(iClient->iGroup);
iWindow=RWindow(iClient->iWs); // use app's session to window server
User::LeaveIfError(iWindow.Construct(*parent,(TUint32)this));
iRect = aRect;
iWindow.SetExtent(iRect.iTl, iRect.Size()); // set extent relative to group coords
iWindow.Activate(); // window is now active
}

CWindow::~CWindow()
{
iWindow.Close(); // close our window
}

RWindow& CWindow::Window()
{
return iWindow;
}

CWindowGc* CWindow::SystemGc()
{
return iClient->iGc;
}

/****************************************************************************/
| Function: CWindow::Draw
| Purpose: Redraws the contents of CSmallWindow within a given
| rectangle. CSmallWindow displays a square border around
| the edges of the window, and two diagonal lines between the
| corners.
| Input: aRect Rectangle that needs redrawing
| Output: None
/****************************************************************************/
void CWindow::Draw(const TRect& aRect)
{
// Drawing to a window is done using functions supplied by
// the graphics context (CWindowGC), not the window.
CWindowGc* gc = SystemGc(); // get a gc
gc->SetClippingRect(aRect); // clip outside this rect
gc->Clear(aRect); // clear
TSize size=iWindow.Size();
TInt width=size.iWidth;
TInt height=size.iHeight;
// Draw a square border
gc->DrawLine(TPoint(0,0),TPoint(0,height-1));
gc->DrawLine (TPoint (0, height-1), TPoint (width-1, height-1));
gc->DrawLine(TPoint(width-1,height-1),TPoint(width-1,0));
gc->DrawLine (TPoint (width-1, 0), TPoint (0, 0));
// Draw a line between the corners of the window
gc->DrawLine(TPoint(0,0),TPoint(width, height));
gc->DrawLine (TPoint (0, height), TPoint (width, 0));
}


/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////// CWsClient implementation ////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
CWsClient* CWsClient::NewL(const TRect& aRect)
{
// make new client
CWsClient* client=new (ELeave) CWsClient(aRect);
CleanupStack::PushL(client); // push, just in case
client->ConstructL(); // construct and run
CleanupStack::Pop();
return client;
}

CWsClient::CWsClient(const TRect& aRect)
: CActive(CActive::EPriorityHigh),
iRect(aRect)
{
}

void CWsClient::ConstructL()
{
// add ourselves to active scheduler
CActiveScheduler::Add(this);
// get a session going
User::LeaveIfError(iWs.Connect());
// construct our one and only window group
iGroup=RWindowGroup(iWs);
User::LeaveIfError(iGroup.Construct(2,ETrue)); // meaningless handle; enable focus
// construct screen device and graphics context
iScreen=new (ELeave) CWsScreenDevice(iWs); // make device for this session
User::LeaveIfError(iScreen->Construct()); // and complete its construction
User::LeaveIfError(iScreen->CreateContext(iGc));// create graphics context

iWindow = new (ELeave) CWindow (this);
iWindow->ConstructL(iRect);

// 窗口始终在最上层
iGroup.SetOrdinalPosition(0, ECoeWinPriorityAlwaysAtFront);
// 禁止接受焦点
iGroup.EnableReceiptOfFocus(EFalse);
// Set the window is non-fading
iGroup.SetNonFading(ETrue);

// 将窗口提到前面
TApaTask task(iWs);
task.SetWgId(iGroup.Identifier());
task.BringToForeground();

// request first event and start scheduler
IssueRequest();
}

CWsClient::~CWsClient()
{
// neutralize us as an active object
Deque(); // cancels and removes from scheduler
// get rid of everything we allocated
delete iGc;
delete iScreen;
delete iWindow;

// destroy window group
iGroup.Close();
// finish with window server
iWs.Close();
}

void CWsClient::IssueRequest()
{
iWs.RedrawReady(&iStatus); // request redraw
SetActive(); // so we're now active
}

void CWsClient::DoCancel()
{
iWs.RedrawReadyCancel(); // cancel redraw request
}

/****************************************************************************/
| Function: CWsClient::RunL()
| Called by active scheduler when an even occurs
| Purpose: do Redraw
/****************************************************************************/
void CWsClient::RunL()
{
// find out what needs to be done
TWsRedrawEvent redrawEvent;
iWs.GetRedraw(redrawEvent); // get event
CWindow* window=(CWindow*)(redrawEvent.Handle()); // get window
if (window)
{
TRect rect=redrawEvent.Rect(); // and rectangle that needs redrawing
// now do drawing
iGc->Activate(window->Window());
window->Window().BeginRedraw(rect);
window->Draw(rect);
window->Window().EndRedraw();
iGc->Deactivate();
}
// maintain outstanding request
IssueRequest(); // maintain outstanding request
}
// ================= End of Window.cpp =======================
上面的代码只是一个最基础的框架,你可以自己添更多的东西。比如显示一些文字。不过要显示文字就要先设定字体,具体操作如下:
先要建立一个CWsScreenDevice:
Code:
iScreen = new (ELeave) CWsScreenDevice(iWs);
然后可以用GetNearestFontInTwips通过字体名字获得CFont:
Code:
_LIT(FONT_CH16, "CombinedChinesePlain16");
TFontSpec myFontSpec(FONT_CH16, 200);
iScreen->GetNearestFontInTwips(iFont, myFontSpec);
Excel VBA编程中的循环和数组应用 本文将探讨如何使用VBA编程在Excel中实现循环和数组的应用。我们将通过一个数学游戏项目Math Game来展示这些概念,并深入分析循环结构如何工作,包括Do Loops的四种基本形式以及它们在不同场景下的选择。我们还将讨论如何避免无限循环的陷阱,以及如何使用For/Next循环和递归过程来处理特定编程任务。此外,本文将介绍输入验证的重要性,确保用户输入的数据符合程序要求。 阅读详情

相关推荐

癌症免疫治疗预测神器TIDE:从原理到实战(避坑指南)

本文详细解析了癌症免疫治疗预测工具TIDE的核心原理及实战应用。TIDE算法通过模拟肿瘤免疫逃逸的两种核心机制(T细胞功能障碍和排除),为临床决策提供精准预测。文章涵盖数据准备、标准化流程、网页工具操作指南及结果解读,帮助科研人员和临床医生避开常见误区,优化免疫治疗策略。

weixin_29309475的博客 199

关于exe形式编程的一点心得,希望对大家有所帮助

其实我也只是一个Symbian的初学者,我能深刻的感受到一个初学者在探索新的开发平台时的坎坷。以下的心得是我经过一段很长时间的探索才得到的,这其中走了很多弯路,也得到了很多人的帮助。现在我将其整理了一下贴出来,希望能给寻求相关知识的朋友一些帮助,以便于大家少走一些弯路。当然我的水平有限,理解不深,错误在所难免,希望大家发现后能及时指正。1.为什么要用exe形式的程序?相信绝大部分人做Symbi

World of iOs 683

拆解博世、大陆的EMB方案:自增力机构如何省下83%的能耗?

本文深度解析了博世和大陆的电子机械制动(EMB)技术,重点探讨了自增力机构如何实现83%的能耗节省。通过对比电机直驱型和自增力型EMB的技术参数,揭示了自增力机构在能量优化和系统集成方面的创新优势,为汽车电动化和智能化提供了关键技术支持。

weixin_42665725的博客 395

matlab使用心得分享

前言 正文 文件的创立 tab键的使用 历史命令的使用 数据的导入与导出 工具栏的功能使用 找bug时的技巧 总结

qq_43266614的博客 2444

[官方培训]22-UE资产优化 Epic 肖月 笔记

Nanite+Lumen目标:面向TA,美术,不影响视觉的前提下,优化运行和编辑效率引擎:UE5.1延迟管线平台:主流PC,Windows 10 with DX12。

Tcohneyn的博客 1576

在Rviz仿真环境中搭建传送带

<geometry><material>

qq_58268456的博客 937

学了python的心得体会200字,学python的心得体会

1、Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚却本语言。3、应用范围:爬文厨、文动化办公(自动化处理Excel表格)、财务。4、学习难度:Rthon²程对英语要求低,用到的都是一些常见单。·\回车,覆盖前面字符。

2301_81837718的博客 489

Vitis开发环境下的双核ARM通信:Hello World背后的AMP架构解析

本文深入解析了Vitis开发环境下ZYNQ双核ARM Cortex-A9处理器的AMP架构与通信机制。通过详细的硬件配置、内存分配和核间通信实现步骤,展示了如何构建高效的双核Hello World系统,为嵌入式系统开发者提供了实用的开发指南和性能优化技巧。

weixin_29162439的博客 219

《python学习心得》

我深刻体会到,编程不仅是编写代码,更是一种解决问题、创造价值的思维方式,而 Python 正是我在这条道路上的得力伙伴,引领我不断探索未知的技术领域,实现自我提升与突破。在学习 Python 的过程中,我仿佛踏入了一个充满无限可能的编程世界,经历了从迷茫到清晰、从探索到收获的难忘历程,有许多心得体会与大家分享。python作为一门多用途的编程语言,对世界产生广泛而深远的影响,它的灵活性和易用性使得更多的人可以从中受益,而我们大学生就是其中一员。Pthon的设计具有很强的可读性,它具有比其他。

2401_82653356的博客 442

Python连接StarRocks全流程实践: SQL文件调用与Pandas混合优化

通过这种分阶段混合计算, 既能发挥StarRocks处理海量数据的性能优势, 又能保留Pandas在内存计算中的灵活性, 实现效率与功能的完美平衡.结合SQL的高效聚合与Pandas的灵活计算, 实现查询和数据处理的深度融合.该库基于SQLAlchemy 2.x开发, 仅支持Python 3.x环境.对大批量数据的写入, 建议进行分块. 分块写入较单条插入速度会有显著提升.这样可以避免python代码的查询与SQL耦合, 支持版本化管理.将DDL, DML分离为独立文件, 例如。: 调整连接复用参数。

t.y.Tang的博客 2780

逆向工程实战:如何一步步破解京东APP的sign签名算法(附Frida脚本)

本文详细解析了京东APP的sign签名算法逆向工程实战,通过Frida脚本动态分析Java层和Native层的多层签名机制,揭示商业应用的加密协议设计。文章提供了完整的逆向工程方法论与工具链,帮助开发者深入理解移动应用安全防护体系,提升安全防御能力。

weixin_28622215的博客 919

MySQL学习心得:从零基础到高效查询的编程思路

1. **官方文档**:[MySQL 8.0 Reference Manual](https://dev.mysql.com/doc/refman/8.0/en/)**数据库就像是一个电子文件柜**,MySQL则是这个文件柜的管理系统。1. **先理解概念,再动手实践**:ER模型、关系代数等理论基础很重要。1. **表(Table)**是数据的组织形式,就像Excel的工作表。**关键区别**:告诉数据库"要什么",而不是"怎么做"。3. **重视EXPLAIN分析**:培养性能优化的意识。

2402_89707298的博客 272

AutoSAR系列讲解(入门篇)2.2-SWC的类型

该章讲解了两种SWC的分类,并且映射到实际的工程中应该是具体的什么文件类型

雪云飞星的博客 4万+

大学生计算机技能应用大赛参赛心得

优快云话题挑战赛第1期 活动详情地址:https://marketing.youkuaiyun.com/p/bb5081d88a77db8d6ef45bb7b6ef3d7f 参赛话题:大学生竞赛指南 话题描述:本话题聚焦于大学生竞赛心得体会分享,对于计算机众多领域每年都有很多都会举办科技竞赛,很多学生也都会踊跃参与,每到竞赛结束,学生们都会收获很多,这个时候我们可以写下一篇竞赛心得,大家互相交流学习科技竞赛经验,共同分享竞赛资源、探讨各领域技术以及比赛技巧,希望大家能够在此话题下一起讨论一起学习,能够探索一个属

m0_59588319的博客 2317

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

无需编程基础,小白就能快速学会的数据可视化工具

不管你是公司什么角色,很多时候都需要对大量数据进行总结和汇报。这可难为了一些无编程基础,只会通过Excel手工整理各种报表的小白了。今天就将我的一些经历分享给大家,如何分分钟做出一张漂亮的数据报表,对于不会编程的人来说,敏BI可以满足需求,希望对有同样需求的朋友能有所帮助。 市面上的敏捷BI工具太多,我拿自己当小白鼠,说说一款陪伴我从数据小白到数据达人的可视化神器—亿信华辰豌豆BI,今天就来给大家...

amsonga的博客 1380

深度学习工具包 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")

Java学习过程,希望今年6月份可以找到5000以上的工作。

学习目标: 提示:这里可以添加学习目标 例如: 2020年3月20日学习Java记录 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 跟随尚硅谷学习,今天学习至78(逻辑运算符) 学习内容: JAVA是运行在JVM上的 两种核心机制 JAVA虚拟机 垃圾收集机制 在C++/C中,是由程序员来回收无用的内存 JAVA语言消除了程序员手动回收内存空间的责任,在JVM空闲的时候检查并且释放哪些可被释放的内存空间 垃圾回收会在JAVA程序运行过程中自动进行,程序员无需精确控制和干预 J

qq_50214988的博客 269

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++编程思想1

学了好久的 C++了 发现自己对于C/C++还是没有深入的了解 于是 咬咬牙啃起了 C++编程思想 希望能有所感悟 。。 我以前是直接学C++的对于C不是很了解,然而又是在VC下 学习 所以 没有好好的 去学习 标准C++,直到我 看起C++编程思想 我发现真应该从头再学一遍了 。。。 1、定义的声明的区别 : 声明是 声明了标示符的存在 并没有为 其分配空间 ,而定义 是为其分配的一定...

网站开发初中级代码参考-转载 103

中if判断中文_一个新手关于Excel VBA中IF条件判断语句的学习理解心得

作者:金人瑞 《Excel VBA175例无理论纯实战教程》学员最近正在学习郑广学老师的VBA 175例教程,这是一篇新手向的文章,也是一个新手的总结,高手可以批评文章中的不足之处,也可以无视,VBA中的IF判断, 判断一般起到控制作用,如郑老师所说,就像一个水管中的控制阀,水来了,一个个的控制阀决定着流水的走向。而整个流程中判断也的确有着控制流程走向的作用,可以说循环,判断,数组是vb...

weixin_39669204的博客 416

中软实训总结_中软实训心得

中软实训心得在厦门中软的一个多月里,在那里学习的经历让我怀念,难忘,在那里的每一天都会让我成长。在中软的实训生活中,我深刻体会到了自己专业方面的欠缺和不足,也意识到了作为计算机网络工程专业的学生,要想在以后的职业中崭露头角,除了要有很好的专业知识,还必须具备良好的心理素质和善于交流沟通的能力,使自己在以后的途中经历什么样的困难,都利于不败之地。1.中软学习情况和内容在那边有严格的规章制度,每天都要...

weixin_35028513的博客 675

什么?!你也刚学编程!

站内的同学们大家好啊!我是一名准大二的学生,经过一年的有关c,cpp语言的学习,我觉得我并不能够编程且有所心得,因此我打算重新开始学习编程的知识,从c开始,并借csdn来记录和巩固自己之所学,同时可以给刚学习编程的同学一点参照,也更希望得到各位大佬们的指正与点拨,我们共勉。希望未来自己能在这方面有所进步,有所收获!计划会包含c,cpp,数据结构,linux等知识,具体会到哪一步,拭目以待呗哈哈哈哈。

2402_86760180的博客 1107

PyInstaller打包exe逆向分析:从文件结构到源码提取实战

Python应用打包是将源代码、依赖库和资源文件封装为独立可执行文件的过程,常用工具如PyInstaller通过嵌入Python解释器和自定义引导程序实现跨平台分发。其核心原理在于构建一个包含运行时环境的归档结构,使得最终生成的exe文件能在无Python环境的系统上直接运行。这项技术的工程价值在于简化部署流程、保护知识产权,并便于进行软件分发。在实际应用场景中,开发者常需对打包后的程序进行安全审计、故障排查或兼容性分析,这就涉及对exe内部结构的逆向工程。通过使用pyinstxtractor等专用工具,可

weixin_34331102的博客 340

shell if多个条件判断_萌新关于Excel VBA中IF条件判断语句的一点心得体会

作者:金人瑞 《Excel VBA175例无理论纯实战教程》学员最近正在学习郑广学老师的VBA 175例教程,这是一篇新手向的文章,也是一个新手的总结,高手可以批评文章中的不足之处,也可以无视,VBA中的IF判断, 判断一般起到控制作用,如郑老师所说,就像一个水管中的控制阀,水来了,一个个的控制阀决定着流水的走向。而整个流程中判断也的确有着控制流程走向的作用,可以说循环,判断,数组是vba的三驾马...

weixin_39771987的博客 1890

神秘面具男-2022年网络我的网络爬虫学习心得

我一开始并不觉得这门课能教给自己啥技能,只觉得拿到学分就够了,后来发现python其实能做很多事情,开发一个自己的网站,为别人的生日准备一个惊喜,甚至开发出一些小游戏。于是我开始对这门课产生了兴趣。

2202_75921281的博客 314
上一篇: [转贴]指定S60程序图标的显示位置
下一篇: [转贴]可以使用汇编来写Symbian程序
directdraw
博客等级 码龄23年 8粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值