原创]Windows Gdi入门初级应用(VC SDK)

VC6项目维护指南:寻找与集成Windows XP/2003 Platform SDK 在软件开发和系统维护中,软件开发工具包(SDK)是连接应用程序与操作系统API的关键桥梁,它提供了编译所需的头文件和库文件。其核心原理在于确保编译器、SDK与目标运行环境三者间的ABI(应用程序二进制接口)兼容,包括数据结构内存布局、函数调用约定等严格匹配。对于使用Visual C++ 6.0(VC6)维护遗留项目的工程师而言,这一兼容性尤为重要。特定版本的Platform SDK,如Windows XP SP2和Windows Server 2003 R2(February 2003 Edition)SD 阅读详情

原创]Windows Gdi入门初级应用(VC SDK) 

 
好久没发贴了,今天手痒痒,发一个。
GDI的绘图函数基本上都是有状态的,所有的函数都要求一个HDC类型的句柄。
这个HDC的获得有几个途径BeginPaint,GetWindowDC, GetDC.他们的参数都只需要一个HWND就差不多了。
记得调用了BeginPaint后要调用EndPaint进行清理,调用GetWindowDC和GetDC后要调ReleaseDC进行清理。
在MFC代码中常常遇到的CDC CPaintDC CWindowDC CClientDC。在这里稍作解释。
CDC :例如用GDI画矩形要Rectangle(hDC,...),而使用CDC则是dc.Rectangle(...),由此可见CDC主要是把原本需要HDC作为参数的GDI函数封装了一下,HDC成了它的一个成员变量。
CPaintDC CWindowDC CClientDC:他们都是从CDC继承,分别是对上面所说的BeginPaint,GetWindowDC, GetDC调用对进行封装(CPaintDC构造时调用BeginPaint,析构时调用EndPaint,其余同理)。
BeginPaint一般用在对WM_PAINT的响应函数中使用
GetWindowDC可获得整个Window的HDC,而GetDC仅能获得客户区的HDC,区别就在于----
前者有效地绘制区域是整个窗口(边框、标题栏、客户区的总和)。
后者有效地绘制区域仅限于客户区。
两者的坐标系都是相对坐标而非屏幕坐标,原点是(0,0)。即以自己可绘制区域的左上角作为原点。
这里可以顺带的讲讲RECT了,RECT是一个结构,依次有4个成员left,top,right,bottom用来代表一个矩形区域。CRect从RECT继承,提供了一些常用的操作(例如说位移,缩小等等),其实就是改变4个成员的值。完全不用CRect也可以。许多GDI函数都要求一个RECT作为参数,或者类似的用(x,y,cx,cy)作参数,其实也就是一个RECT变种,用了宽度和高度罢了。

基础知识介绍完毕,开始实例教程:
我们以如何绘制一个具有平面风格的状态栏为例:
首先从CStatusBar继承一个类:CStatusBarNew。(如果无法通过类向导做这件事,而你又对MFC的MESSAGEMAP等等东西不熟悉,可以从CStatusBarCtrl继承一个,待生成代码后,把所有的CStatusBarCtrl改为CStatusBar)
在此,只需要重写WM_PAINT和WM_ERASEBKGND这两个消息的响应函数。
BOOL CStatusBarNew::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CRect rect;
GetWindowRect(&rect);
ScreenToClient(&rect);
CBrush brush(0xf2f2f2);
pDC->FillRect(&rect, &brush);
return TRUE;
}
这个函数把状态栏背景用0xf2f2f2这种颜色填充。

void CStatusBarNew::OnPaint()
{
CPaintDC cDC(this); // device context for painting
// TODO: Add your message handler code here
CRect rcItem;
cDC.SetBkMode(TRANSPARENT);
cDC.SelectObject (::GetStockObject (NULL_BRUSH));//选入画刷

// 获取字体
CFont* pfont = GetFont();
CFont* def_font;
if (pfont)
def_font = cDC.SelectObject(pfont);//选入字体

CPen pen;
pen.CreatePen(PS_SOLID, 1, RGB(0xBD, 0xBA, 0xBD));
CPen* pOldPen = cDC.SelectObject(&pen);//选入画笔

CBrush br(0x00f2f2f2);
for ( int i = 0; i < m_nCount; i++ )
{
GetItemRect (i, rcItem);
//填充面板背景
cDC.FillRect(rcItem, &br);
rcItem.bottom--;
if(i == 0) rcItem.left += 2;

//对每个面板画圆角矩形
cDC.RoundRect(rcItem, CPoint(5, 5));

//画面板上的文字
UINT nNewStyle = GetPaneStyle(i);
//如果style为SBPS_DISABLED,则跳过不画
if ((nNewStyle & SBPS_DISABLED) != 0) continue;
CString text = GetPaneText(i);
UINT uFormat = DT_SINGLELINE | DT_NOPREFIX | DT_TOP | DT_LEFT;
rcItem.left += 3;
rcItem.top += 3;
cDC.DrawText(text, rcItem, uFormat);
}
if (pfont)
cDC.SelectObject(def_font);//恢复字体

//画右下角小标志(这里画了六个小圆圈)
if (GetStyle() & SBARS_SIZEGRIP)
{
CRect rc;
GetClientRect(&rc);
rc.left = rcItem.right;
rc.right--;
rc.bottom--;
rc.left = rc.right - rc.Width() / 4;
rc.top = rc.bottom - rc.Width();
int w = rc.Width();
rc.top++;
rc.left++;
cDC.SelectObject(GetStockObject(GRAY_BRUSH));
cDC.Ellipse(&rc);
rc.OffsetRect(-w, -w);
cDC.Ellipse(&rc);
rc.OffsetRect(w, 0);
cDC.Ellipse(&rc);
rc.OffsetRect(-w, w);
cDC.Ellipse(&rc);
rc.OffsetRect(-w, 0);
cDC.Ellipse(&rc);
rc.OffsetRect(2 * w, -2 * w);
cDC.Ellipse(&rc);
}

cDC.SelectObject(pOldPen);//恢复画笔

}
上面的函数我们可以多次看到SelectObject的调用,这就是前面所说的绘图函数基本上都是有状态的。
这个状态保存在HDC中,而SelectObject则设置HDC的状态。通常称为选入。
至于注释中的恢复是怎么回事呢?这要从CPen CBrush CFont等等说起了,它们是对GDI对象的封装。
GDI对象通过CreatePen CreateBrush CreateFont等等函数创建,返回一个HGDIOBJ。
这些对象不使用的时候需要销毁,用DeleteObject函数,但是如果一个HGDIOBJ被选入到一个HDC中的时候,
它就不能被销毁,这样就造成了GDI资源的泄漏。
解决这一问题通常有两种做法:
第一种,就是上面代码中看到的:
先保存原来的HGDIOBJ,def_font = cDC.SelectObject(pfont);
用完了之后再恢复原来的 cDC.SelectObject(def_font);
这样做,就保证了pfont能被正确销毁,至于原来的def_font能不能被销毁,就不关我们的事了。
第二种,利用了系统的库存对象。库存GDI对象是windows系统预先创建的,不需要应用程序销毁。
所以,不需要保存原来的HGDIOBJ,直接像这样
SelectObject (hdc, ::GetStockObject (NULL_BRUSH));
或者cDC.SelectStockObject(NULL_BRUSH);
就可以保证HDC中没有被选入任何我们自己创建的画刷了。
这两种方法各有好处,视情况选用。

另外上面说大部分GDI函数都是有状态的,有一个例外就是FillRect函数,它靠一个传给他的画刷进行填充。

实例讲述完毕,接下来有一些补充技巧:
1. GDI绘图技巧的学习:通过阅读、运行、调试别人源代码获得经验这条路径是最快的。
2.GDI程序的调试
调试GDI一般来说比其他程序困难,但是掌握了一些技巧也就没什么障碍了。
调试GDI的时候,将IDE和代调试的程序窗口在桌面上尽量分开排列,不要重叠在一起。
这样你能通过单步执行,看到每一步的绘图效果。
为配合上述策略,在应用程序初始化的时候加上下面一句:
#ifdef _DEBUG
GdiSetBatchLimit(1);
#endif
这能保证调试时每一条GDI函数调用能马上产生效果。因为Windows为了性能优化,可能会分批处理GDI调用。
3.内存绘图
首先理解内存绘图,即把要绘制的东西先在内存中画好,然后一次性的画到屏幕上来。内存绘图经常用来防止闪烁。
因为闪烁的原因是因为反差太大。例如你的绘图过程是先用白色擦除整个窗口,然后再将黑色的文字画到屏幕上来,
这样在窗口重绘的时候,原本黑色文字区域就会白光一闪,然后再出现文字,也就是我们说的闪烁了。
而内存绘图的过程呢,是先创建一个内存DC,然后在这个DC上把要绘制的图形画好,之后一次性的填到屏幕上去。
示例代码如下:
HDC hDestDC;
RECT rc;
//..此处得到目标的HDC和目标的RECT
HDC hdc = ::CreateCompatibleDC (hDestDC);
HBITMAP hBitmap = ::CreateCompatibleBitmap (hDestDC, rc.right, rc.bottom);
HBITMAP hOldBitmap = ::SelectObject (hDC, hBitmap);
//... 此处用hdc进行绘图
//...
::BitBlt (m_hDestDC, rc.left, rc.top, rc.Width(), rc.Height(), hDC, rc.left, rc.top, SRCCOPY);
::SelectObject (hDC, hOldBitmap);
当然,这样用起来不太方便,可以将这些操作封装到一个叫CMemDC的对象中,利用构造和析构自动进行这些操作。
直接使用CMemDC还有一个好处,调试GDI时,如果图形都在内存中绘制,那么还是看不到绘图过程。
代码如果这样写:
CRect rc;
GetWindowRect(&rc);
#ifdef _DEBUG
CPaintDC dc;
#else
CPaintDC cdc;
CMemDC dc(cdc.m_hDC, &rc);
#endif
那么就既能享受内存绘图的好处又能方便调试了。

入门篇先写到这里,以后有工夫再写进阶篇
 
 
 

vc6.0 配置GDI+    vc6.0下,使用GDI+时,必须 安装platformSDK   但是,在windows7下,支持vc6.0的platformSDK不能安装   所以,vc运行gdi+,可以通过加入gdi+库文件来实现     1.将GDI+.rar将其中的Includes和Lib中的文件拷到vc目录下的 Includes和Lib文件夹中,gdiplus 阅读详情

相关推荐

VC6.0纯SDK下用GDI+逐帧播放GIF动画的可编译工程包

在Windows XP SP3环境下,用Visual C++ 6.0搭建不依赖MFC的纯Win32 SDK开发环境,通过GDI+ API实现GIF动图的完整加载、解码、帧提取与定时渲染。工程包含主程序GDITOO.cpp、标准预编译头StdAfx.h、资源文件GDITOO.rc和图标文件,以及多个测试GIF(如123.gif、1233.gif);编译生成GDITOO.exe可直接运行,支持读取每帧延迟时间并按原始节奏播放。配套ReadMe.txt详细说明VC6中启用GDI+的步骤:需手动链接gdiplus.

e4f5g6h7的博客 238

GDI+到底是什么

系统级图形APIGDI+是Windows操作系统内置的子系统(从Windows XP开始集成),提供与设备无关的图形操作接口。开发者无需关心底层硬件差异,即可实现屏幕、打印机等设备的图形渲染。GDI的增强版相较于传统的GDI(Graphics Device Interface),GDI+新增了抗锯齿、渐变填充、Alpha通道透明度支持、路径绘图等高级功能,并优化了性能与代码易用性。跨开发框架支持在.NET生态中,GDI+通过命名空间提供托管类库(如GraphicsPenBrush。

m0_61629312的博客 1146

VC环境下SDK常用API函数库实战详解

本文还有配套的精品资源,点击获取 简介:SDK(Software Development Kit)是用于开发特定平台应用程序的工具包,其中VC(Visual C++)环境下的SDK为Windows平台C++开发者提供了丰富的API函数库,涵盖系统管理、用户界面、图形绘制、文件操作、网络通信等多个核心领域。本文详细介绍Win32 API的主要分类及典型函数应用,包括进程线程控制、窗口创建、GDI绘图、文件读写、Socket网络编程、多线程同步、注册表操作等关键技术,并结合头文件与库

weixin_42583683的博客 1058

GDI+编程小结

转载链接:http://blog.youkuaiyun.com/byxdaz/article/details/5972759 GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负责在屏幕和打印机上绘制图形图像和显示信息。 GDI+不但在功能上比GDI 要强大很...

weixin_30530939的博客 1322

gdt-modAPI, 官方游戏开发大亨角色 API.zip

gdt-modAPI, 官方游戏开发大亨角色 API 官方游戏开发 Tycoon Modding这是official游戏开发版附带的官方版 Modding它是一组 add-on 方法和文档插件,使其他插件的实现变得容易。请求请求是非常受欢迎的。维基请查阅以下官方文件:https:

Windows API-GDI入门基础知识详解

Windows API-GDI入门基础知识详解

WIndow下的图形GDI和GDI+编程总结-不断完善

GDI是一个抽象的接口,是一个关于图形显示的函数库。通过这个接口可以实现对图形的颜色、线条的粗细等属性的控制。它是我们的程序与计算机硬件之间的一个桥梁。 设备环境DC(Device Context 又称为设备上下文,也称为设备描述表)。它是一个关于如何绘制图形的方法的集合,它既可以绘制各种图形,也可以确定在应用窗口中绘制图形的方式,就是绘图模式和映射模式。在Win32编程中,设备环境是用HDC ...

zzzkiti的专栏 2434

GDI绘图性能与效率的提高及改善

详细分析了对GDI绘图效率必善的方法,并涉及了一些DirectDraw的技术,收录了多篇业内高手的技术论文

Windows GDI+

GDI:Graphics Device Interface,即图形设备接口,是Windows API的一个重要组成部分。它是Windows图形显示程序与实际物理设备之间的桥梁,GDI使得用户无需关心具体设备的细节,而只需在一个虚拟的环境(即逻辑设备)中进行操作。它的桥梁作用体现在: (1)用户通过调用GDI函数将逻辑空间的操作转化为具体针对设备驱动程序的调用。 为实现图形设备无关性,Windo...

$firecat利白的代码足迹$ 1342

GDI+画圆角矩形(优化)

GDI+画圆角矩形(优化)

MIT6.824-lab2D-2022(日志压缩详细讲解)

从paper中去讲解,并实现关于lab2D的代码。

幸平的博客 6035

对一个2D的游戏,DirectX和GDI+的性能差别大吗?

目前在绘图中主要采用的是GDI+,就是用CImage::Draw函数绘图的,然后我发现在把WM_TIMER的间隔设置到非常短(1ms),并且现在还没加什么复杂功能(基本也就是人物走一走)的情况下,游戏只能跑到30帧出头(我将两次重绘之间的时间差输出了出来,显示为32ms),我觉得这是不是有点不太正常?对于这个纯2D的游戏,如果把绘图部分改用DirectX(DirectX似乎有一个ID3DXSprite类)实现的话,对性能的提升大吗?的性能差异,以及你的现状和潜在优化方向。使用更高精度的定时器机制(如。

小宝哥Code的专栏 2214

MySQL 8.0数据库崩了别慌!手把手教你仅凭一个.ibd文件找回数据(附Go工具包)

本文详细介绍了在MySQL 8.0数据库崩溃后,如何仅凭.ibd文件恢复数据的完整流程。通过使用Go语言工具包和ALTER TABLE技巧,即使没有备份也能实现数据重生。文章包含从环境准备到数据验证的全方位指导,帮助DBA和开发者应对紧急数据恢复场景。

weixin_29235923的博客 419

Windows Gdi入门初级应用(VC SDK)

Windows Gdi入门初级应用(VC SDK)   好久没发贴了,今天手痒痒,发一个。GDI的绘图函数基本上都是有状态的,所有的函数都要求一个HDC类型的句柄。这个HDC的获得有几个途径BeginPaint,GetWindowDC, GetDC.他们的参数都只需要一个HWND就差不多了。记得调用了BeginPaint后要调用EndPaint进行清理,调用GetWindowDC和GetDC后

808

HHD Device Monitoring Studio:破解版在串口调试中的实战应用

本文详细介绍了HHD Device Monitoring Studio破解版在串口调试中的实战应用,包括安装指南、串口监控功能解析、Modbus RTU协议分析案例以及自定义协议解析技巧。通过具体操作步骤和性能优化建议,帮助开发者高效完成端口监控和调试任务,提升工作效率。

weixin_29268331的博客 935

Ubuntu 22.04下Minkowski Engine编译避坑指南:解决Cuda 12.2与Pytorch cu118版本冲突

本文详细介绍了在Ubuntu 22.04系统中解决Minkowski Engine编译时Cuda 12.2与Pytorch cu118版本冲突的实用方法。通过修改版本检查逻辑、创建兼容符号链接等技巧,帮助开发者顺利完成编译,并提供了性能优化建议和替代方案,确保三维点云处理任务的高效运行。

weixin_42543309的博客 160

Windows Gdi入门初级应用

Windows Gdi入门初级应用(VC SDK)  GDI的绘图函数基本上都是有状态的,所有的函数都要求一个HDC类型的句柄。这个HDC的获得有几个途径BeginPaint,GetWindowDC, GetDC.他们的参数都只需要一个HWND就差不多了。记得调用了BeginPaint后要调用EndPaint进行清理,调用GetWindowDC和GetDC后要调ReleaseDC进行清理。在M

飞鹰 840

X线DR医学图像 --- DR医用滤线栅及摩尔纹详解 (二) 摩尔纹的产生机理

1,横向摩尔纹的表现 2,纵向摩尔纹的表现 3,摩尔纹在pitch = 143μm(注:pitch为采样间隔/周期)的FPD上的表现。 4,摩尔纹的危害(严重的影响了临床诊断) 5,摩尔纹对胸片肺部肺纹理的破坏 6,滤线栅的频率(滤线栅生产厂家的产品参数)。判断摩尔纹产生的重要依据之一 7,DR平板探测器的采样频率/空间极限分辨率 l.........

松下J27录放机 4981

Windows Gdi 应用-入门篇 (VC SDK)

 Windows Gdi 应用-入门篇 (VC SDK)。 一、 基础  GDI的绘图函数基本上都是有状态的,所有的函数都要求一个HDC类型的句柄。这个HDC的获得有几个途径BeginPaint,GetWindowDC, GetDC.他们的参数都只需要一个HWND就差不多了。记得调用了BeginPaint后要调用EndPaint进行清理,调用GetWindowDC和GetDC后要调ReleaseD

透明果冻 1430

Android 13 SPRD 源码默认打开多用户实际无效果问题修复

【代码】Android 13 SPRD 源码默认打开多用户实际无效果问题修复。

m0_60898338的博客 449

22、狭义相对论与曲线坐标空间相关知识解析

本文深入解析了狭义相对论与曲线坐标空间的核心概念,涵盖能量-动量张量的定义与守恒、曲线坐标系下的度量张量与基向量性质、协变与逆变张量的变换规则,并介绍了克里斯托费尔符号与协变导数的计算方法。进一步探讨了在弯曲空间中进行微积分运算的基础理论及其在广义相对论中的关键应用,如爱因斯坦场方程如何描述物质-能量对时空曲率的影响,为理解黑洞等引力现象提供了理论框架。

lambda的博客 115

支持VC6.0的SDK包

Windows Server 2003 PSDK February 2003 Edition,可以和VC6一起使用、并支持各种目标OS的最后一个版本的SDK。This edition of the SDK supports development for the following platforms: Windows Server 2003 Windows Advanced Server,

luozhan的专栏 2954

11.8 LangGraph生产级AI Agent开发:从节点定义到高并发架构的终极指南

本文介绍了如何使用 LangGraph 构建生产级 AI Agent,重点解析了 LangGraph 的核心设计、节点与边的实现方法论、生产级实现技巧以及性能优化策略。LangGraph 通过图结构抽象复杂 AI 工作流,核心组件包括节点、边、状态和检查点。节点通过 Python 函数封装原子业务逻辑,边通过条件分支实现动态工作流。生产级实现技巧包括状态管理、多会话控制和错误处理机制。性能优化策略涉及并行执行和缓存机制设计。文章还提供了旅行规划 Agent 的实战案例和常见问题解决方案,帮助开发者构建高效、

yonggeit的博客 3268

vc6能用的SDK和库列表

vc6能用的SDK和库列表 vc6快10岁了,呵呵~~蛮经典的东西。 以下SDK和库是我自己收集的,绝大部分我都使用过,最重要的是能在VC6下使用。它们之间各自有各自的功能,不需要比较,除非是相同类型的库,例如 XML解析器,我才比较一下,排名也不分先后,并且描述的简略不代表个人的感情色情。^.V,很多库我都喜欢,但我只是简单说两句。例如MFC,STL, ICE等等。希望大家的开发效率能提高不

坚持,才是力量.老实做人,踏实做事. 1223

温度PID控制PLC程序

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

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

SDK 入门

SDK入门

qq_61553520的博客 4492

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: 数据压缩技术简史
下一篇: 电脑前的护眼窍门
普通网友
博客等级 码龄22年 0粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值