GObject学习教程---第七章:继承与接口

GLib GObject对象系统 在前面的文章中,我们学习了GTK4的自定义控件开发。通过继承GtkWidget,可以创建功能完整的自定义控件。但自定义控件背后的机制是什么?GTK4的控件系统如何实现类型安全、信号通信和属性管理?答案就是GObject。GObject是GTK的对象系统基础面向对象:在C语言中实现类、继承、接口类型系统:动态类型注册和查询信号机制:观察者模式的完整实现属性系统:自动化的getter/setter和通知机制// 枚举属性IDenum {PROP_NAME,N_PROPS// 安装属性。 阅读详情

索引:https://blog.youkuaiyun.com/knowledgebao/article/details/84633798

本文是学习学习他人的博客的心得(具体详见“楼主见解”),如果源网站可访问的话,建议直接访问源网站:

楼主见解:

主要讲解继承和接口的概念,C++熟悉的人,此章节可以直接跳过。


源博客网址:http://garfileo.is-programmer.com/categories/6934/posts

 

继承与接口

本文仅仅表达了我对面向对象程序设计方法中继承和接口用法的理解。

在文档 [1] 中,讨论了有关 GObject 子类继承的问题,并在后半部分指出了类的继承所存在的问题,并企图挖掘类的继承是多么的没用。这显然是徒劳的,因为类的继承的确是有用的,并且我们已经见 识过它不计其数的应用,例如几乎所有的 GUI 库都是基于类的继承的方式而设计的。

那么,为什么会这样?这是因为 GUI 库的设计者们发现类的继承非常适合解决他们的问题。

那么,他们的问题是什么问题?答案很简单,这肯定跟对象的属性和方法有关系。当然,这个答案连我都不满意,但它指明了分析的方向。我们沿着这个方向分析一下。

如果对象 A 所拥有的属性和方法,对象 B 也拥有,但是对象 B 还拥有对象 A 所没有的属性和方法,那么对象 B 便可以继承对象 A。

简而言之,只有当对象 A 的属性和方法是对象 B 的真子集时,即  时,对象 B 继承对象 A 才有意义,因为这样可以节省重复编写相同的代码,即代码复用。

事实上,对象 A 与对象 B 之间的属性和方法的组合可以分为 9 种情况,如下图:

类 的继承仅能解决这 9 种情况中的一种,即属性与方法同时表现为包含(或被包含)的关系。比如 MP3 可以继承 U 盘,因为 U 盘所具备的属性和方法,MP3 也具备,但是 MP3 还多了音频播放的相关属性与方法。U 盘和移动硬盘之间便不可能存在继承/被继承的关系,因为它们的属性与方法顶多能形成一个交集。U 盘与键盘,虽然名字都有个“盘”,但它们的属性和方法连交集都谈不上。

基于上面的分析,我们从继承无法解决的那 8 种情况中选取一种来研究一下。比如,选取属性相离但方法相交的情况,该情况与那个 U 盘和移动硬盘的示例相对应。

U 盘和硬盘,属性是不同的。U 盘的属性是闪存结构,而硬盘的属性是磁碟+磁头+马达结构,但它们都有一块芯片,可以通过计算机主机 USB 接口与内存进行数据交换。这块芯片主要负责的工作就是数据的读入和写出,这就是 U 盘和移动硬盘所共有的方法。

假如我们非要用类的继承来模拟 U 盘与移动硬盘的关系,这样做的结果不仅不能解决代码复用问题,反而会增加冗余代码。因为必须要将 U 盘与移动硬盘所共有的属性与方法提取出来,形成一个基类,然后由这个基类派生出 U 盘和移动硬盘,如下图所示:

好像 C++ 语言里有一种“抽象类”的概念,专门用来制造上图中类似“盘”的东西。我认为,既然一个类无法形成实体,那么这个类就不应该存在。虽然抽象类可以干很多事情,但事实上它所干的那些事情并不是它的本意。

虽然,我们都是“人类”,但是“人类”这个抽象类对于我们人类本身而言一丁点意义都没有。只有在于“非人类”这种对象打交道的时候,“人类”这个抽象类才可能会有意义。

在设计抽象类的时候,我认为一定要考虑清楚,有没有和这个类并驾齐驱的其他类,并考察它们之间是否有相交的方法。例如,计算机的核心构件只有三类东西,一种是“盘”,一种是“线”,一种是“电”。这三类东西,虽然可以并驾齐驱,但是它们之间并没有相交的方法。

在 一些网络游戏里,抽象类貌似有点意义。例如,角色划分有人族、兽族、精灵族等等,其中每个族都可以对应一个抽象类,这些抽象类存在相交的方法,例如打 boss 升级,人族、兽族、精灵族中的对象,其升级的比例可能会不一样,比如兽族可能升的快,精灵族升的慢。毕竟扮演野兽,要比扮演神仙需要多付出一点心理承受 力。

在处理 U 盘和移动硬盘二者之间关系的问题上,也许 Java 给出了更好的思路。它说,用接口吧!

是阿,U 盘和移动硬盘,虽然本质(属性)上有所区别,但是它们的接口都是 USB。并且,只要它们插到计算机上,主机不关心那个东西是 U 盘还是移动硬盘,它只需要知道对方是个 USB 设备就 ok 了。这样,我们不需要在计算机主机中单独为 U 盘创造一种 U 盘接口,也不需要单独为移动硬盘创造一种移动硬盘接口。

虽然,USB 接口的存在,既没有让 U 盘的设计变的简单,也没让移动硬盘的设计变的简单,但是它让计算机主机的设计变的简单了,并且让 U 盘和移动硬盘的易用性也得到了提高,你只需要将它们插到一种接口中即可。

接 口,通常表现为“协议”。例如,tcp/ip 就是接口。我们只要上 internet,所访问的所有计算机基本上都是具有 tcp/ip 这种协议的计算机,我们不关心这种计算机上安装的是 Linux,还是 Linux,还是 Linux。虽然 tcp/ip 没有简化网卡的设计,但是它简化了计算机操作系统的设计,并且让网络的易用性得到了提高,大家只需要打开 firefox 就可以了。

总之,接口不是用来搞代码复用以简化对象设计的,而是用来简化对象的上层建筑的设计。

既然 tcp/ip 之类的软件已经采用了接口的设计方式,那么为什么要在面向对象程序设计里再去强调这个概念?

那是因为面向对象程序设计中的继承的概念一方面可用于接口的实现,另一方面可实现接口的继承。

使用接口,很简单,只需要将一个类“继承”这个接口类,然后实现接口所规定的方法(行为)。

接口的继承,这也很好理解,比如 USB 协议有 1.0 版、2.0 版,TCP/IP 协议从 v1 到现在的 v4 和 v6。接口版本的升级往往要向后兼容,所以面向对象程序设计中的类的继承的概念,很自然的可用于表示接口的升级。

如果明白了以上的概念,那么下一篇便可以尝试 GObject 的接口模拟。

~ End ~

参考文档

[1] GObject 的子类继承
 

转载时,希望不要链接文中图片,另外请保留本文原始出处:http://garfileo.is-programmer.com

Gstreamer基础之Gobject 文章目录Gobject简介 GStreamer是依附于GLib 2.0对象模型的,采用了信号与对象属性的机制,所有的GStreamer对象都采用GObject继承的方法进行扩展,是所有GStreamer对象的基类,因此有必要学习一下Gobject是怎么回事。 Gobject简介 ... 阅读详情

相关推荐

深入掌握GObject系统:基于GObject参考手册的全面解析与实战

在现代C语言开发中,面向对象的设计模式已成为构建大型、可维护系统的核心手段。然而,C语言本身并不原生支持类与对象机制,因此需要借助运行时系统来模拟这些高级抽象。GObject系统正是为此而生——它不仅实现了完整的类与对象模型,还通过GType类型系统支撑了动态类型注册、继承、接口和信号等关键特性。本章将深入剖析GObject如何在C语言层面实现类与对象的定义,并详细解析GClass与GObject结构体的内存布局、初始化流程以及自定义类的完整实现路径。

weixin_32836713的博客 1020

GObject 学习笔记汇总---7

转自: garfileo.is-programmer.com/2011/3/15/inheritance-and-interface.25299.html 继承与接口 本文仅仅表达了我对面向对象程序设计方法中继承和接口用法的理解。 在文档 [1] 中,讨论了有关 GObject 子类继承的问题,并在后半部分指出了类的继承所存在的问题,并企图挖掘类的继承是多么的没用。这显然是徒劳的

吾皇的博客 790

gobject对象系统

简单的gobject入门文档,简单的介绍了gobject的相关知识,具体内容请下载查阅

GObject接口定义的先决条件和属性

1、GObject接口定义的先决条件 如果要指定接口在实现时需要其他接口的存在,GObject引入了先决条件的概念:可以将一系列先决条件类型与接口相关联。 例如,如果对象A希望实现接口I1,并且如果接口I1有一个先决条件是需要存在接口I2,则A必须实现I1和I2。 上述机制在实践中非常类似于Java接口I1扩展接口I2: /* Make the ViewerEditableLossy

lp525110627的博客 473

Gobject 资料,全面介绍

Gobject 资料,全面介绍Gobject 资料,全面介绍Gobject 资料,全面介绍Gobject 资料,全面介绍Gobject 资料,全面介绍Gobject 资料,全面介绍Gobject 资料,全面介绍

MATLAB实战:四桥臂逆变器3D-SVPWM调制算法仿真全流程(附代码)

本文提供了一份完整的MATLAB/Simulink实战指南,详细解析了四桥臂逆变器的3D-SVPWM调制算法仿真全流程。文章从工程实践出发,手把手指导如何搭建模型,涵盖从abc静止坐标系变换、三维空间矢量区域判定、作用时间计算到PWM信号生成与调试等核心环节,并附有代码示例和常见问题解决方案,旨在帮助工程师快速掌握这一应对不平衡负载的高效调制技术。

qsc90123456的博客 234

sec6-可派生类型和抽象类型

有两种类型,final类型和derivable类型。final类型没有任何子对象。derivable有子对象。这两个对象之间的主要区别是它们的类。final类型对象没有自己的类区域。类的唯一成员是它的父类。派生对象在类中有自己的区域。该类对其子类开放。G_DECLARE_DERIVABLE_TYPE 用于声明可派生类型。(())

Creationyang的博客 637

避开模板匹配的坑:OpenCVSharp中边缘梯度算法的优化实践

本文深入探讨了OpenCVSharp中边缘梯度算法在模板匹配中的优化实践,解决了传统方法在尺度变化、角度旋转和光照差异下的局限性。通过Sobel算子提取边缘梯度特征,结合轮廓检测和多尺度匹配策略,显著提升了匹配的鲁棒性和准确性。文章还分享了并行计算、内存访问优化等实战技巧,适用于工业检测和自动化识别场景。

http9protocoller的博客 199

使用 GObject 库模拟类的数据封装形式

本文原始出处:http://garfileo.is-programmer.com 事实上,有关 GObject 库的学习与使用,GObject 库参考手册提供了一份简短且过于晦涩的指南。如果你能够理解它,那么完全可以无视这篇以及后续的几篇文章。倘若没有明白那份指南,那么建议最好能克制一下,先不要急于去做文档 [1] 中所列举那些探索,谨记 Knuth 所说的,过早优化是诸恶之源。 这篇文档主要

铁匠Smith先生的专栏 1897

snipersim安装

snipersim安装记录,便于后续使用tip:snipersim需要在python2的环境下编译。

weixin_53507617的博客 917

STM32家电安全开发实战:手把手教你用X-CUBE-CLASSB通过IEC60730 Class B认证

本文详细解析了如何使用STM32的X-CUBE-CLASSB软件包通过IEC60730 Class B认证,涵盖认证核心要求、软件包架构、工程集成配置及调试技巧。针对家电安全开发,提供了从单元测试到压力测试的全流程方案,帮助开发者快速实现符合国际安全标准的嵌入式控制系统。

pink的博客 707

6. Gobject 学习总结

简单的来说,GObject是一个程序库,它可以帮助我们使用C语言编写面向对象的程序。   很多人被灌输了这样一种概念:要写面向对象程序,那么就需要学习一种面向对象编程语言,例如C++、Java、C# 等等,而 C 语言是用来编写结构化程序的。事实上,面向对象只是一种编程思想,不是一种编程语言。换句话说,面向对象是一种游戏规则,它不是游戏。GObject 告诉我们,使用 C 语言编写程序时,可以

吾皇的博客 4778

半导体物理-Si晶体生长方向<2>

Si(硅)晶体的生长方向是一个重要的概念,尤其在半导体工业中。这个概念涉及到晶体在生长过程中原子排列的方向,对晶体的性质和应用有重大影响。让我为您详细解释:理解Si晶体的生长方向对于半导体材料的研究和应用非常重要,它直接影响了最终器件的性能和制造工艺。在实际应用中,选择适当的生长方向可以优化器件性能,提高产品质量。

m0_37606066的博客 3001

GObject 简明教程(二)

最近,我一直在深入学习 GStreamer(相关教程可以从我主页中看到)。在探索其复杂的设计逻辑时,我意识到需要深入研究 GStreamer 的源码。而因为 GStreamer 是基于 GObject 开发的,掌握 GObject 的基本概念就显得尤为重要。本文整理自,简化了细节,保留了一些关键内容,以便更好地理解。上一章GObject 简明教程(一)我们介绍了的前面五章。今天我们继续,将后面几章也进行总结和更新。

记录学习的过程 959

汇川AM系列后台安全管理与用户权限的设置方法

汇川AM系列后台安全管理与用户权限的设置方法。

viixin的博客 8458

5GS 协议栈 — PFCP 协议 — URR 用量上报规则

目录 文章目录目录URR 用量上报规则UEE 的参数Usage Report 的参数示例 URR 用量上报规则 29244 5.2.2 Usage Reporting Rule URR 的作用? 用来告诉 UPF 如何对 PDR 识别的 SDF 或 Application 业务进行使用量统计信息的上报。CP 收到 Report Information 后,可用于计费或者管控(e.g. 超量限速)等用途。 URR 在哪个流程里下发的? N4 会话建立流程。 N4 会话修改流程。 URR 是怎么工作

烟云的计算 4591

gobject创建一个新的实例(继承和重构)

概述 在 GObject世界里,类是两个结构体的组合,一个是实例结构体,另一个是类结构体。GOBJECT的继承需要实现实例结构体的继承和类结构体的继承,Gobject对象的初始化可分为两个部分:类结构体初始化和实例结构体初始化。类结构体初始化函数只被调用一次,而实例结构体的初始化函数的调用次数等于对象实例化的次数。这意味着,所有对象共享的数据,可保存在类结构体中,而所有对象私有的数据,则保存在实例结构体中。 宏定义解析G_DEFINE_TYPE G_DEFINE_TYPE(Man, man, G_TYPE_

weixin_40405692的博客 630

AI技术在电商中的实际应用

人工智能、电商、推荐系统、个性化、机器学习、深度学习 1. 背景介绍 电子商务行业近年来发展迅速,用户数量不断增长,商品种类日益丰富。然而,随着市场竞争的加剧,电商平台面临着如何提升用户体验、提高转化率、挖掘潜在商机等一系列挑战。人工智能(AI)技术作为一种新兴技术,凭借其强大的数

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 1740

GObject入门教程

GObject Tutorial GObject Tutorial Ryan McDougall(2004) 目的 — 这篇文档可用于两个目的:一是作为一篇学习Glib的GObject类型系统的教程,二是用作一篇按步骤的使用GObject类型系统的入门文章。文章从如何用C语言来设计一个面相对想的类型系统开始,使用GObject作为假设的解决方案。这种介绍的方式可以更好的解释这

fei_ing的专栏 2651

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

温度PID控制PLC程序

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

Gobject专栏索引

索引首页:https://blog.youkuaiyun.com/knowledgebao/article/details/84776046 官网API:https://developer.gnome.org/gobject/stable/ gobject相关概念:https://blog.youkuaiyun.com/knowledgebao/article/details/82498187 第一章:GObjec...

knowledgebao的博客 7528

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

GObject教程

GObject Tutorial GObject Tutorial Ryan McDougall(2004) 目的 — 这篇文档可用于两个目的:一是作为一篇学习Glib的GObject类型系统的教程,二是用作一篇按步骤的使用GObject类型系统的入门文章。文章从如何用C语言来设计一个面相对想的类型系统开始,使用GObject作为假设的解决方案。这种介绍的方式可以更好的解释这个开发库

rookieding的专栏 7686

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

探秘ripdrag核心组件:拖放工具FileObject与CompactLabel的GObject实现

ripdrag 是一款用 Rust 与 GTK4 编写的高效拖放工具,它能让你直接从终端把文件"拽"进任意应用程序窗口。在它简洁的外表下,隐藏着两个精巧的自定义 GObject 组件——FileObject 与 CompactLabel。本文将零基础剖析这两个核心组件的 GObject 实现原理,帮助你真正看懂 Rust 如何驾驭 GTK4 的对象系统,并掌握自定义 GObject 组件的完整开发

gitblog_00217的博客 666

GObject学习教程---第六章:GObject 的子类继承

索引:https://blog.youkuaiyun.com/knowledgebao/article/details/84633798 本文是学习学习他人的博客的心得(具体详见“楼主见解”),如果源网站可访问的话,建议直接访问源网站: 楼主见解: 此章节和继承GObject一样,只是换一个基类而已,继承机制一样。 源博客网址:http://garfileo.is-programmer.com/cat...

knowledgebao的博客 1607

Gobject 学习总结

简单的来说,GObject是一个程序库,它可以帮助我们使用C语言编写面向对象的程序。 很多人被灌输了这样一种概念:要写面向对象程序,那么就需要学习一种面向对象编程语言,例如C++、Java、C# 等等,而 C 语言是用来编写结构化程序的。事实上,面向对象只是一种编程思想,不是一种编程语言。换句话说,面向对象是一种游戏规则,它不是游戏。GObject 告诉我们,使用 C 语言编写程序时,可以运用面向...

chen_jianjian的专栏 5021

GObject学习教程---第八章:GObject 对接口的模拟

索引:https://blog.youkuaiyun.com/knowledgebao/article/details/84633798 本文是学习学习他人的博客的心得(具体详见“楼主见解”),如果源网站可访问的话,建议直接访问源网站: 楼主见解: 主要讲解接口是如何实现的。 整理一下常用宏: 继承常用宏:其中P表示项目名称,T表示类名称,PTPrivate表示私有数据结构体。 #define ...

knowledgebao的博客 1693

GObject接口定义和实现

一、接口定义 GObject接口如何工作的理论在“非实例化类类型:接口”一节中给出。 本节介绍如何定义和实现一个接口。 第一步是取一个正确的名称。 该接口定义了两种方法: /* * Copyright/Licensing information. */ #ifndef __VIEWER_EDITABLE_H__ #define __VIEWER_EDITABLE_H__ #inc

lp525110627的博客 2043
上一篇: GObject学习教程---第六章:GObject 的子类继承
下一篇: GObject学习教程---第八章:GObject 对接口的模拟
knowledgebao
博客等级 码龄15年 401粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值