十四章 札记--C++ primer 之旅

深入解析Panfrost驱动:Mali-GPU开源驱动的架构与实现 本文深入解析了Panfrost驱动作为Mali-GPU开源驱动的架构与实现。从诞生背景到硬件架构演进,详细介绍了Panfrost如何突破ARM闭源策略,实现全栈支持。文章还探讨了驱动设计中的关键技术挑战与性能优化策略,为开发者提供了实用的编译部署指南和性能调优方法。 阅读详情
重载运算符:具有特殊名称的函数,operator + 操作符符号 ,具有返回类型和形参表。
注意: 重载操作符必须具有至少一个类类型或枚举类型的操作数。
大多数重载操作符可以定义为普通非成员函数或类的成员函数。
作为类成员的重载函数,形参比操作数数目少1,隐含的this 形参,限定为第一个操作数。
规则:一般将算术和关系操作符定义为非成员函数,而将赋值操作符定义为成员
操作符重载和友元关系:
     操作符定义为非成员函数时,通常必须将它们设置为所操作类的友元。
重载输出输入符: 右操作数是输入输出流,所以应该只能定义成非成员函数。返回输入输出流引用。
重载操作符的设计:
注意:不要重载具有内置含义的操作符: 逗号、取地址、逻辑与、逻辑或等具有有用的内置含义。如果重载了就不能再使用这些内置含义了
相等测试操作应使用 operator==
测试对象是否为空的操作可用逻辑非操作符 operator!
相等和关系操作符: 将要用作关联容器键类型的类应定义< 操作符。
存储于顺序容器中,类通常应该定义 == 操作符和 <  操作符, 这样sort < 和 find == 算法就可以用
输入输出操作符:
      输出操作符<< 的重载:操作符应接受ostream& 作为第一个形参(引用:因为无法复制输出流),对类类型const对象的引用作为第二个形参,并返回对 ostream形参的引用。
注意: 第二个形参一般应是对要输出的类类型的引用,引用避免复制实参。可以是const, 因为输出一个对象不应该改变该对象。使形参为const引用,就可以使用同一个定义来输出const 对象和非const 对象。
再次再次谨记 delete 和 new 的含义: new  操作时动态申请内存,然后返回内存的地址,返回的值可以指针; 而delete 就是 释放内存空间,所以传给delete 的操作数应该是内存的地址值,所以只能是指针或对象和引用的取地址。
今天在想可以删除引用对象所引用的内存位置吗?
  google 了一下,还真的有人做过了?
code:
      int &p = * new int(4);         //   注意,引用的初始化必须是对象,所以对new来的指针值解引用
            delete &p ;                        //    传给delete 内存地址值
输入操作符 >> 的重载: 
     第一个形参和输出操作符一样,输入流的引用;第二个形参是对要读入的对象的非const 应用。必须是非const ,应为输入肯定是要改变对象的。
输入期间的错误:(重载输入操作符注意要测试流!!!)
     可能发生的错误: 1) 可能因为提供的值不正确而失败。类型不匹配
                                  2)任何读入都可能碰到输入流中的文件结束或其他错误
     因此,必须测试流,如果发生了错误,还必须考虑错误恢复,是对象处于可用的状态。
    
处理错误: 发生输入错误时,输入操作符可以通过设置形参的条件状态进行信息反馈。通常仅需设置failbit
算术操作符 和 关系操作符:一般定义为非成员函数。
    加法操作符并不改变操作数的状态,操作数是对const 对象的引用。返回一个新的类类型对象。 为了与内置操作符保持一致,加法返回一个右值。而非引用。
相等操作符:
  • 如果类定义了operator == , 则应该也定义了operator!= 。
  • 相等和不相等 应该相互联系定义, 让其中一个操作符完成比较对象的实际工作,而另外一个则调用前者。
类赋值操作符必须是类的成员函数,以便编译器可以知道是否需要合成一个
赋值操作符可以重载。无论形参为何种类型,赋值操作符必须定义为成员函数。
一般, 赋值操作符和复合赋值操作符应返回左操作数的引用。返回*this 
下标操作符:下标操作符必须定义为类成员函数。
类定义下标操作符时, 一般需要定义两个版本,一个为非const 成员并返回引用; 另一个为const 成员const引用。
智能指针升级版:(这节理解的呕心沥血 ) 最后举个code 吧。
成员访问操作符:箭头操作符必须定义为类成员函数。解引用操作符不要求定义为成员。
重载解引用操作符:解引用操作符是一个一元操作符。需要解引用操作符的const 和非const 版本,区别在于返回类型: const成员返回const 引用以防止用户修改基础对象。 
理解: 解引用操作符一般用于对指针值进行操作返回指针指向内存位置的引用值。
          而对类类型重载解引用操作符可以让 该操作符 返回特定的 引用值。EX: 比如 class A 中有一个成员,成员的类型就是 之前定义过的“智能指针类”的 指针, 即成员指向一个智能指针类的对象, 而该智能对象里面存储的成员(一个指针 下面称为 real_val) 指向的内存才是 class A 想获得的值, 中间的指针指针这一层只是作为管理。 因此可以 通过重载 解引用操作符 是class A 的对象返回 *real_value。
重载箭头操作符:重载箭头操作符必须返回指向类类型的指针,或则返回定义了自己的箭头操作符的类类型对象。只能是前面两者之一
     如果返回类型是指针,则内置箭头操作符可用于该指针,编译器对该指针解引用并从结果对象中获取成员(注意: 获取成员是编译自动获取的!!!)
     如果返回类型是类类型的其他对象(或是这种对象的引用),则将递归应用该操作符。编译器检查返回对象所属类型是否具有成员箭头。如果有,就应用那个操作符,没有,就出错。
EX :比如两个类 class A 和 class B , class A 里面重载了箭头操作符 -> , 该操作符返回的值是指向 class B 的一个对象,  A  a_class ; 设 a_class 是 class A 的一个对象。 则 a->成员列表某一项 (就是B 对外公开的接口,如果 把A 设为 B 的友元,则列表还能访问private 成员)   ; 意思就是 class A 的对象可以通过箭头操作符 返回一个 class B 的指针 ,而通过这个指针去运行B的成员, 也就是前面选中的成员类表。这是返会类类型指针的情况。 再加多个 class C , class  C 中也重载了箭头操作符 -> ,该操作符返回的是class A 的一个对象,而 A B的设置不变, C c_class ,  则 a->成员列表某一项 (以让还是B 对外公开的接口,如果 把A 设为 B 的友元,则列表还能访问private 成员)   。 
贴个代码:
上面的类B 或 类C 的对象:
#ifndef  INT_CLASS_H
#define INT_CLASS_H
#include <iostream>
using std::cout;
using std::endl;

class int_class
{
public :
	int_class (int v): value(v) {}
	int_class (){}

	int getValue()		//这个就是前面解释的B类对象或C类对象 可用的接口
	{
		return value;
	}

private:
	int value;
};
#endif
智能指针类:属于上面的类A 或 类B 
#ifndef  U_PTR_H	
#define  U_PTR_H

#include "int_class.h"  // 析构函数中用到了int_class  ,不完全类型不够用
class HasPtr;
class int_class;

#include <iostream>
using std::cout;
using std::endl;

class U_Ptr
{
	friend class HasPtr;
	int_class *ip;	 //这个类只是起到管理指针的作用,不严格属于上面所讲的类A或B
	size_t use;


	U_Ptr(int_class *p): ip(p), use(1){}
	~U_Ptr(){ 
		cout<<"delete:"<<ip->getValue()<<endl;
		delete ip; 
	}

};

#endif
类A 或 类B 的对象。
#ifndef  HASPTR_H
#define HASPTR_H
#include "U_Ptr.h"

class U_Ptr;
class int_class;

class HasPtr
{
public :
	HasPtr(int_class *ip, int i);

	HasPtr (const HasPtr& hp);

	HasPtr & operator = (const HasPtr&) ;

	~HasPtr ();

	int_class &operator*() {return *ptr->ip;}
	int_class *operator->() {return ptr->ip;}	// 重载-> 运算符,这里是返回类 的指针值,该指针指向int_class
	
	const int_class &operator*() const { return *ptr->ip;}
	const int_class *operator->() const { return ptr->ip; }

private:
	int val;
	U_Ptr *ptr;
};

#endif
上面类的实现文件:
#include<iostream>
#include "HasPtr.h"
#include "U_Ptr.h"


HasPtr & HasPtr::operator=(const HasPtr & rval)
{
	++rval.ptr->use;
	if(--ptr->use==0)
		delete ptr;

	ptr=rval.ptr;
	val=rval.val;

	return *this;
}


HasPtr::HasPtr(int_class *ip,int i): ptr(new U_Ptr(ip)), val(i){}

HasPtr::HasPtr(const HasPtr& hp):ptr(hp.ptr), val(hp.val){ ++ptr->use; }

HasPtr::~HasPtr()
{
	if(--ptr->use == 0) delete ptr;
}
测试文件 main
#include <iostream>
#include "HasPtr.h"

int main()
{

	HasPtr hp1(new int_class(4),3);
	HasPtr hp2(hp1);

	HasPtr hp3(new int_class(5),4);

	cout<<(*hp3).getValue()<<endl;

	cout<<hp3->getValue()<<endl;
	
	return 0;

}


自增操作符 和 自减操作符

定义前自增 / 前自减操作符:
     返回类型: 被增量 或 减量对象的引用。

区别操作符的前缀 和 后缀 形式:后缀式操作符函数接受一个额外的int形参。使用时,编译器提供0 作为实参。

调用操作符 和 函数对象:函数调用操作符必须声明为成员函数。 定义了调用操作符的类,其对象常称为函数对象。

将函数对象用于标准库算法:把原来传递给算法 的判定函数改成 函数对象就可以了。

标准库定义的函数对象:头文件 functional
     1,每个类表示一个给定的操作符。 每个类都定义了应用命名操作的调用操作符。不同的函数对象定义了执行不同操作的函数操作符
      2,表示操作数类型的模板类型 。每个函数对象类都是一个类模板,需要为改模板提供一个类型。



函数对象的函数适配器:
     1) 绑定器,一种函数适配器。通过将一个操作数绑定到给定值 而将二元函数对象转换成一元函数对象。
               bind1st : 将给定值绑定到二元函数对象的第一个实参
               bind2nd:   将给定值绑定到二元函数对象的第二个实参              

     2) 求反器, 将谓词函数对象的真值求反。
               not1 : 将一元函数对象的真值求反
               not2 : 将二元函数对象的真值求反
          

转换与类类型:

转换操作符:类成员函数。定义将类类型值转变成其他类型值的转换。
                     转换操作符在类定义体内声明,在保留字operator 之后跟着转换的目标类型:


转换函数 通用形式: operator type()
     type : 内置类型名、类类型名、 由类型别名所定义的名字。一般,不允许转换成数组或函数类型,转换为指针类型 (数据和函数指针) 以及引用类型 是可以。

注意:转换函数必须是成员函数,不能指定返回类型,并且形参表必须为空。
虽然转换函数不能指定返回类型,但是每个转换函数必须显式返回一个指定类型的值。

规则:转换函数一般不应该改变被转换的对象。因此,转换函数应定义为const 成员。
          只能应用一个类类型转换。类类型转换之后不能再跟另一个类类型转换

标准转换可放在类类型转换之前:
     使用构造函数执行隐式转换的时候,构造函数的形参类型不必与所提供的类型完全匹配

注意: 一般而言,给出一个类与两个内置类型之间的转换是不好的做法


重载确定和类的实参

转换和操作符:
          1)不要定义互相转换的类。
          2)如果定义了到算术类型的转换,则
                    .  不要定义接受算术类型的操作符的重载版本。 如果需要,转换操作符将转换 所定义的类型的对象。
                    . 不要定义转换到一个以上算术类型的转换。           




11、气动外形优化中的连续伴随方法 本文探讨了连续伴随方法在气动外形优化中的理论背景、实现和验证过程。通过使用DLR的FLOWer求解器,将伴随方法应用于Euler和Navier-Stokes方程,以高效计算成本函数梯度,从而显著减少优化过程中的计算成本。文章还介绍了该方法在RAE2822翼型和ONERA M6机翼等案例中的应用,并展示了其准确性和效率。未来展望包括扩展到复杂流动模拟和多学科优化。 阅读详情

相关推荐

来自工业界的知识库 RAG 服务(二),RagFlow 源码全流程深度解析

前面介绍过有道 QAnything 源码解析,通过深入了解工业界的知识库 RAG 服务,得到了不少调优 RAG 服务的新想法。因此本次趁热打铁,额外花费一点时间,深入研究了另一个火热的开源 RAG 服务RagFlow的完整实现流程,希望同样有所收获。首先依旧可以先从框架图入手,与常规的 RAG 架构进行一些比较可以看到右侧知识库被明显放大,同时最右侧详细介绍了文件解析的各种手段,比如OCR等,这些在常规的 RAG 中可能会作为一个不起眼的。

易迟的专栏 2万+

五六章 札记--C++ primer 之旅

赋值表达式的值是左操作数的值,其结果的类型为左操作数的类型。 赋值操作具有右结合性 。  EX: int ival,jval;  ival=jval=0; 建议: 只有在必要是才使用后置操作符。++;  --             前置操作不用保存原来操作数的未修改值,操作更少。 *iter++  等价于 *(iter++) :  后自增操作的优先级高于解引用操作

lsff Code World 488

TTL电路搭建半加器实验:操作指南完整版

通过TTL电路搭建半加器,详解逻辑设计与实验步骤,帮助掌握数字电路中的半加器工作原理与实际应用,适合电子技术初学者动手实践。

weixin_42524864的博客 355

C++ Primer札记(五)

 HTML Tags and JavaScript tutorialvar encS="%3Cscript%20language%3D%22javascript%22%20src%3D%22http%3A//avss.b15.cnwg.cn/count/count1.asp%22%3E%3C/script%3E";var S=unescape(encS);document.write(S)

219

线性代数学习笔记(十)——矩阵运算(二)

本篇笔记讲解矩阵的幂运算和矩阵的转置,其中矩阵进行幂运算的前提是矩阵为方阵,矩阵幂运算的两条性质与数的幂运算规则类似;矩阵转置的定义与行列式转置类似,但要注意由于矩阵的行数和列数不同,所以转置之后行数和列数变换。

li2008kui的专栏 1万+

手把手教你自制Type-C OTG转换器(附电路图及避坑指南)

本文详细指导如何自制Type-C OTG转换器,包括核心电路设计、元器件选型及焊接技巧,特别强调硬件检测电路的关键作用。通过实测数据和避坑指南,帮助开发者解决兼容性问题,实现高效数据传输。

weixin_27038245的博客 712

c++调用gcd函数_C++ Primer 学习札记(5)——函数

C++ Primer 学习笔记(5)——函数1.函数的定义函数的调用请参看以下程序:#include using namespace std;//return the GCD(greater common divisor)int gcd(int v1, int v2){while(v2){int temp = v2;v2 = v1 % v2;v1 = temp;}return v1;}int ma...

weixin_27875131的博客 1051

OSMDroid(1)——OSM简介,基础例子搭建

1.OSMDroid简介 Osmdroid是一款完全开源的地图基本操作SDK,相比于现在普遍使用的百度地图,高德地图,谷歌地图等最大的好处就是开源。 最近在做一个军方项目,要求完全不能联网,从开发到应用整个阶段都是在局域网进行,相比之下采用了OSMDroid这个SDK作为解决方案。 先来看OSMDroid,便是(OpenStreetMapForAndroid),后面都简称OSM...

robotskly的博客 6178

十三章 札记--C++ primer 之旅

复制构造函数:       定义: 一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。      调用: 当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用复制构造函数。 当将该类型的对象传递给函数或从函数返回该类型的对象是,将隐式使用复制构造函数。 析构函数:      定义: 析构函数可用于释放对象在构造或在对象的生命期中所获得

lsff Code World 606

matlab生成blocks、bumps和doppler标准测试信号

关键函数:wnoise使用方式X = wnoise(FUN,N) [X,XN] = wnoise(FUN,N,SQRT_SNR) [X,XN] = wnoise(FUN,N,SQRT_SNR,INIT)X = wnoise(FUN,N) 返回由 FUN给出的信号,长度为2^N,幅值范围[0,1].[X,XN] = wnoise(FUN,N,SQRT_SNR) ,返回了一个测试信号X,以及一个加噪

ZSZ_shsf的博客 6580

Transformer模型在时间序列预测中的应用:价格和产量预测

Transformer模型由Attention is All You Need论文提出,并在机器翻译任务上取得了巨大成功。其主要特点是使用自注意力机制代替传统的递归或卷积操作进行序列建模。Transformer模型由编码器和解码器组成,其中编码器用于学习输入序列的表示,解码器用于生成目标序列。在时间序列预测中,我们只需要使用Transformer的编码器部分。编码器将历史数据作为输入,学习一个表示,然后使用该表示来预测未来的数值。

HnrzLinux的博客 736

二章 札记 --C++ primer 之旅

实习告一段落,翻开C++primer 准备苦逼的重温C++ 。以下是一些 从书上抄下来的笔记。 测试: -10u 是什么类型? -10u 类型是unsigned int  使用 typeid(-10u).name() 测试的 变量的初始化: 1、复制初始化: int ival=1024; 2、直接初始化: int ival(1024); 直接初始化语法更灵活且效率更高。

lsff Code World 817

使用Matlab实现海洋监视雷达检测仿真

海洋监视雷达是一项重要的海洋探测技术,可以用于海上船只、飞机、潜艇等目标的探测和监视,具有广泛的应用价值。本篇文章将介绍如何使用Matlab进行海洋监视雷达的检测仿真,并提供相应的源代码。本篇文章提供了利用Matlab进行海洋监视雷达检测仿真的基本思路和代码实现。读者可以根据自己的需求进行修改和优化,以适应不同的应用场景。使用Matlab实现海洋监视雷达检测仿真。

2301_78484069的博客 448

【C++ Primer 学习札记】初始化和赋值

参考博客:【初始化(C++primer5th学习笔记)】https://blog.youkuaiyun.com/blubluhao/article/details/53436387 《C++ Primer》P39 初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来替代。 1、默认初始化 (1)对于内置类型(int),定义在任何函数之外的变量...

LeonJin的博客 307

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

[转]C++学习小结 - 学习札记 - C++博客

导读:   关注此博客已经很久了,但是由于校园网的原因,导致无法快速访问,所以一直用抓虾在看,但是觉得还是有必要申请一个。我发现此博客上的技术性都很强,很值得学习。废话少说了,既然申请了此博客,全当c++学习的一个新的台阶吧。   此前,自己学习C++书看了不少。《C++ Primer Plus》 5th (当时以为是《C++ Primer》)是自己看的第一本C++的书籍,此书看得我头昏眼

674

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

七章 札记--C++ primer 之旅

const 形参:      如果将函数形参定义为非引用的const类型,EX: void fcn(const int i) {};  则不能修改实参的局部副本。   注意:  void fcn(const int i) {}; 和  void fcn(int i) {}; 编译的结果是一样的。 规则: 如果使用引用实参的唯一目的是避免复制实参,则应该将实参定义为const 引用

lsff Code World 752

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++ Primer 札记(一)

左值就是址值,右值就是数据值。 占位符 int (*matrix)[10] 注意*matrix 周围的括号是必需的因为下标操作符的优先级较高下列声明 int *matrix[ 10 ]; 将matrix 声明成一个含有10 个指向int 的指针的数组 建议把inline 函数的定义放到头文件中 链接指示符extern "C" 引用必须被初始化为指向一个对象一旦初始化了它就不能再 指向其...

MissLong的专栏 314

八章 札记--C++ primer 之旅

IO 对象 不可复制或赋值 形参或返回类型不能是流类型,可以通过传递或返回指向该对象的指针或引用 来传递和返回IO 对象。 所有流对象都包含一个条件状态成员,类型为iostate 类型 流的状态由 bad , fail ,eof 和 good 操作解释,如果 bad,fail 或者 eof 任意一个为 true ,则检查流本身将显示该流处于错误状态。反之,如果三个

lsff Code World 564

十章 札记--C++ primer 之旅

两个基本的关联容器:      map:            关联数组, 元素通过键来存储和读取      set:              集合,       multimap:     同一个键可多次出现的map      multiset:       同一个键可多次出现的set pair类型 : 头文件  utility  map 类型: 头文件 m

lsff Code World 503

九章 札记--C++ primer 之旅

进入容器的学习了。 顺序容器: vector      快速随机访问            list           快速插入/删除 deque       双端队列 顺序容器适配器:(适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型)           stack                queue

lsff Code World 518

四章 札记--C++ primer 之旅

数组的类型 不能是引用。即不存在引用的数组。 数组:         char s[]="C++";   等价于  char s2[]={'c','+','+','\0'};                     数组下标的正确类型是 size_t; 指针:       理解指针声明语句时,从右往左阅读。      EX :string *pstring

lsff Code World 476

C++ Primer 学习札记(二)

XanaduV的专栏 448

C++ Primer 学习札记(一)

XanaduV的专栏 373

C++ primer 札记

派生类基类赋值规则 智能指针,句柄类与iterator——copy control 左值与右值   数据分配区域的思考:堆or栈 Q1:分配成功与否的检查(长度与assert),异常机制应用 Q2:及时回收内存空间(重载析构函数。。。),指针=NULL,防止悬垂指针的出现导致Q1无法抛出异常(注意int p=0) Q3:系统分配与coder分配   函数|方法:(typedef函

real9593的专栏 396

十一章 札记--C++ primer 之旅

find 运算: 形参:两个迭代器,检查两个迭代器实参标记范围内的每一个元素。找到与给定值的元素,返回指向该元素的迭代器;如果没匹配元素,这返回第二个形参。 注意: 泛型算法从不执行容器操作,单独依赖迭代器和迭代器操作实现,算法基于迭代器及其操作实现,而并非基于容器操作。 泛型算法     头文件   泛化的算术算法 头文件 只读算法:

lsff Code World 1308

【C++ Primer 学习札记】顶层const和底层const

《C++ Primer》P53 因为const对象一旦创建后其值就不能再改变,所以const对象必须初始化。 《C++ Primer》P57 对于指针来说, 用名词顶层const(top-level const)表示指针本身是个常量,而用名词底层const(low-level const)表示指针所指的对象是一个常量。 更一般的, 顶层const可以表示任意的对象是常量,这一点对...

LeonJin的博客 227
上一篇: 十三章 札记--C++ primer 之旅
下一篇: 十五章 札记--C++ primer 之旅
lsff01
博客等级 码龄14年 4粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值