c++随笔-7

c++计算eigen随笔(7)-编译期指定大小矩阵 #include <iostream> #include <../Eigen/Dense> using namespace Eigen; using namespace std; int main() { Matrix3d m = Matrix3d::Random(); m = (m + Matrix3d::Constant(1.2)) * 50; cout... 阅读详情

函数模板

// 函数模板示例
template <typename T1, typename T2>
void Swap(T1 &a, T2 &b) {  // typename 也可使用 class 替换,推荐使用 typename
    a = a + b;
    b = a - b;
    a = a - b;
    std::cout << "template Swap a: " << a << "\tc: " << b << std::endl;
}

void Swap(int &a, int &b) {   // 重载函数模板 Swap 函数
    a = a + b;
    b = a - b;
    a = a - b;
    std::cout << "Swap a: " << a << "\tb: " << b << std::endl;
}

int main(int argc, char *argv[])
{
    int a = 10;
    int b = 20;
    short c = 'C';

    // 调用规则
    // 1. 编译器优先调用普通匹配函数
    // 2. 如果函数模板严格匹配,则调用函数模板
    // 3. 通过空模板实参限定编译器只通过模板匹配
    Swap(a, b);   // 有匹配的普通函数,调用普通函数(包括隐式转换)
    Swap(a, c);   // 函数模板进行函数调用时进行严格的类型匹配
    Swap<>(a, b); // 限定使用函数模板调用
    // Swap<short, short>(a, b);  // 参数类型和实际变量类型不匹配
    return 0;
}

输出结果:
Swap a: 20 b: 10
template Swap a: 67 c: 20
template Swap a: 10 c: 67

  • 模板包含函数模板和类模板,本质是类型参数化
  • 模板提供了一种将类型参数化的机制,减少代码的冗余
// 对应上边代码的汇编片段
        23 [1]	{
0x401604                  55                    push   %rbp
0x401605  <+    1>        48 89 e5              mov    %rsp,%rbp
0x401608  <+    4>        48 83 ec 30           sub    $0x30,%rsp
0x40160c  <+    8>        89 4d 10              mov    %ecx,0x10(%rbp)
0x40160f  <+   11>        48 89 55 18           mov    %rdx,0x18(%rbp)
0x401613  <+   15>        e8 b8 01 00 00        callq  0x4017d0 <__main>
        24 [1]	    int a = 10;
0x401618  <+   20>        c7 45 fc 0a 00 00 00  movl   $0xa,-0x4(%rbp)
        25 [1]	    int b = 20;
0x40161f  <+   27>        c7 45 f8 14 00 00 00  movl   $0x14,-0x8(%rbp)
        26 [1]	    short c = 'C';
0x401626  <+   34>        66 c7 45 f6 43 00     movw   $0x43,-0xa(%rbp)
        32 [1]	    Swap(a, b);   
0x40162c  <+   40>        48 8d 55 f8           lea    -0x8(%rbp),%rdx
0x401630  <+   44>        48 8d 45 fc           lea    -0x4(%rbp),%rax
0x401634  <+   48>        48 89 c1              mov    %rax,%rcx
0x401637  <+   51>        e8 24 ff ff ff        callq  0x401560 <Swap(int&, int&)>
        33 [1]	    Swap(a, c);  
0x40163c  <+   56>        48 8d 55 f6           lea    -0xa(%rbp),%rdx
0x401640  <+   60>        48 8d 45 fc           lea    -0x4(%rbp),%rax
0x401644  <+   64>        48 89 c1              mov    %rax,%rcx
0x401647  <+   67>        e8 24 18 00 00        callq  0x402e70 <Swap<int, short>(int&, short&)>
        34 [1]	    Swap<>(a, b); 
0x40164c  <+   72>        48 8d 55 f8           lea    -0x8(%rbp),%rdx
0x401650  <+   76>        48 8d 45 fc           lea    -0x4(%rbp),%rax
0x401654  <+   80>        48 89 c1              mov    %rax,%rcx
0x401657  <+   83>        e8 64 17 00 00        callq  0x402dc0 <Swap<int, int>(int&, int&)>
        36 [1]	    return 0;
0x40165c  <+   88>        b8 00 00 00 00        mov    $0x0,%eax
        37 [1]	}
0x401661  <+   93>        48 83 c4 30           add    $0x30,%rsp
0x401665  <+   97>        5d                    pop    %rbp
0x401666  <+   98>        c3                    retq
  • 重点看 callq,也就是函数调用,将参数类型泛化可知,泛化类型至少包含好几种参数类型,猪观理解是c++在编译阶段会创建和所包含类型相关的所有重载函数,而实际上c++对模板的处理采取二次编译,c++在初次编译阶段并未创建模板包含类型的重载函数,而仅仅只是对模板编写语法等分析,确保编译阶段通过,调用时c++对模板调用进行二次编译,且仅仅只创建生成具体的模板,不会创建其它类型

类模板

// 类模板示例
template <typename T>
class CBase {
public:
    void SetId(T id) {  // 类中实现模板类成员函数
        m_id = id;
    }
    void Print();
private:
    T m_id;
};

template <typename T>
void CBase<T>::Print() {  // 类外实现模板类成员函数,在同一个文件中的写法
    std::cout << "id : " << m_id << std::endl;
}

int main(int argc, char *argv[])
{
    CBase<int> base;  // 创建对象时必须指定类型
    base.SetId(10);
    base.Print();
    return 0;
}

输出结果:
id : 10

// 从模板类派生普通类
template <typename T>
class CBase {
public:
    void SetId(T id) {  // 类中实现模板类成员函数
        m_id = id;
    }
    void Print();
private:
    T m_id;
};

class CDerive : public CBase<int> {  // 类模板 继承
public:

};

template <typename T>
void CBase<T>::Print() {  // 类外实现模板类成员函数,在同一个文件中的写法
    std::cout << "id : " << m_id << std::endl;
}

int main(int argc, char *argv[])
{
    CDerive d;  // 创建对象时必须指定类型
    d.SetId(10);
    d.Print();
    return 0;
}

输出结果:
id : 10

// 从模板类派生模板类
template <typename T>
class CBase {
public:
    void SetId(T id) {  // 类中实现模板类成员函数
        m_id = id;
    }
    void Print();
private:
    T m_id;
};

template <typename T>
class CDerive : public CBase<T> {  // 类模板 继承
public:

};

template <typename T>
void CBase<T>::Print() {  // 类外实现模板类成员函数,在同一个文件中的写法
    std::cout << "id : " << m_id << std::endl;
}

int main(int argc, char *argv[])
{
    CDerive<int> d;  // 创建对象时必须指定类型
    d.SetId(10);
    d.Print();
    return 0;
}

输出结果:
id : 10

  • 模板类和函数模板一样,都是类型参数化,只不过类模板语法规则复杂
  • 模板类也可以继承,必须参数具体化,如果需要显式初始化,派生类需要调用基类构造函数,默认调用无参构造
  • 模板类可派生普通类,也可派生模板类
template <typename T>
class CBase {
public:
    void SetId(T id) {  // 类中实现模板类成员函数
        m_id = id;
    }
    void Print();

    template <typename>
    friend std::ostream &operator<< (std::ostream &os, CBase<T>& obj);
    T m_id;
    template <typename>
    friend void Report(CBase<int>& obj);
};

template <typename T>
void CBase<T>::Print() {  // 类外实现模板类成员函数,在同一个文件中的写法
    std::cout << "id : " << m_id << std::endl;
}

template <typename T>
std::ostream & operator<<(std::ostream &os, CBase<T>& obj) {
    os << "id : " << obj.m_id << std::endl;
    return os;
}

void Report(CBase<int>& obj) {
    std::cout << "id : " << obj.m_id << std::endl;
}

int main(int argc, char *argv[])
{
    CBase<int> base;  // 创建对象时必须指定类型
    base.SetId(10);
    base.Print();
    std::cout << base;
    Report(base);
    return 0;
}

输出结果:
id : 10
id : 10
id : 10

  • 友元函数使用在模板类中比较复杂,防止滥用友元
template <typename T>
class CBase {
public:
    static int m_id;
};

template <typename T>
int CBase<T>::m_id = 10;

int main(int argc, char *argv[])
{
    printf("int %#p\n", &CBase<int>::m_id);
    printf("double %#p\n", &CBase<double>::m_id);
    return 0;
}

输出结果:
int 0x408120
double 0x408110

  • 模板类使用 static 关键字时,不同的具体类有各自的 static 变量

异常

// 模拟抛出异常
void Exception(int i) {
    if (i == 10)
        throw "i == 10";
}

int main(int argc, char *argv[])
{
    try {
        Exception(10);
    } catch (const char* e) {
        std::cout << e << std::endl;
    }
    return 0;
}

输出结果:
i == 10

  • 异常与函数独立互补,函数出错可抛出异常,异常捕获方式是严格基于类型匹配的
void Exception(int i) {
    if (i == 10)
        throw "i == 10";
}

void Throw() {
    try {
        Exception(10);
    } catch (const char* e) {
        std::cout << "throw e : " << e << std::endl;
        throw e;  // 继续抛出异常,不处理
    }
}

int main(int argc, char *argv[])
{
    try {
        Throw();
    } catch (const char* e) {
        std::cout << e << std::endl;
    }
    return 0;
}

输结果:
throw e : i == 10
i == 10

  • 异常抛出如果不处理程序中断,不处理异常可以继续向上抛出异常
// 栈解旋
class CBase {
public:
    CBase() {
        std::cout << "constructor" << std::endl;
    }
    ~CBase() {
        std::cout << "destructor" << std::endl;
    }
};
void Exception(int i) {
    CBase t;
    if (i == 10)
        throw "i == 10";
}

int main(int argc, char *argv[])
{
    try {
        Exception(10);
    } catch (const char* e) {
        std::cout << e << std::endl;
    }
    return 0;
}

输出结果:
constructor
destructor
i == 10

  • 异常被抛出后,从进入 try 语句块起,到异常被抛出前,在这期间在栈上创建的所有对象都会被自动析构,析构顺序与构造顺序相反,这一过程称为栈解旋
// 异常接口
void Exception1(int i) {  // 默认可抛出任何异常
    if (i == 10)
        throw "i == 10";
}

void Exception2(int i) throw (int){  // 默认可抛出 int 异常
    if (i == 10)
        throw "i == 10";
}

void Exception3(int i) throw (){  // 默认不抛出任何异常
    if (i == 10)
        ;
}

int main(int argc, char *argv[])
{
    try {
//        Exception1(10);
//        Exception2(10);
        Exception3(10);
    } catch (...) {
        ;
    }
    return 0;
}
// 抛出异常类
class CException {};

void Exception(int i) {  
    if (i == 10)
        throw CException();  // 抛出异常类
}

int main(int argc, char *argv[])
{
    try {
        Exception(10);
    } catch (CException e) {
        std::cout << "recv exception" << std::endl;
    }
    return 0;
}
// catch 接收异常类,普通变量方式
class CException {
public:
    CException() {
        std::cout << "CException()" << std::endl;
    }
    CException(const CException&) {
        std::cout << "CException(const CException&)" << std::endl;
    }
    ~CException() {
        std::cout << "~CException" << std::endl;
    }
};

void Exception(int i) {  // 默认可抛出任何异常
    if (i == 10)
        throw CException();    // 匿名对象
}

int main(int argc, char *argv[])
{
    try {
        Exception(10);
    } catch (CException e) {   // 调用拷贝构造函数捕获抛出的异常类对象
        std::cout << "recv exception" << std::endl;
    }
    return 0;
}

输出结果:
CException()
CException(const CException&)
recv exception
~CException
~CException

// catch 接收异常类,引用方式
class CException {
public:
    CException() {
        std::cout << "CException()" << std::endl;
    }
    CException(const CException&) {
        std::cout << "CException(const CException&)" << std::endl;
    }
    ~CException() {
        std::cout << "~CException" << std::endl;
    }
};

void Exception(int i) {
    if (i == 10)
        throw CException();
}

int main(int argc, char *argv[])
{
    try {
        Exception(10);
    } catch (const CException &e) {  // 匿名对象初始化引用,同一块空间
        std::cout << "recv exception" << std::endl;
    }
    return 0;
}

输出结果:
CException()
recv exception
~CException

// catch 接收异常类,指针方式
class CException {
public:
    CException() {
        std::cout << "CException()" << std::endl;
    }
    CException(const CException&) {
        std::cout << "CException(const CException&)" << std::endl;
    }
    ~CException() {
        std::cout << "~CException" << std::endl;
    }
};

void Exception(int i) {  // 默认可抛出任何异常
    if (i == 10)
        throw new CException(); // 申请堆内存
}

int main(int argc, char *argv[])
{
    try {
        Exception(10);
    } catch (const CException *e) {
        std::cout << "recv exception" << std::endl;
        delete e;  // 释放内存
    }
    return 0;
}

输出结果:
CException()
recv exception
~CException


文件操作

文件打开模式描述
ios::in只读
ios::out只写
ios::app从末尾追加
ios::binary二进制模式
ios::nocreate打开文件时,文件不存在,不创建文件
ios::noreplace打开文件时,文件不存在,则创建该文件
ios::trunc打开文件后,清空文件内容
ios::ate打开文件后,将文件指针位置移动到文件末尾
文件指针位置描述
ios::beg文件开始
ios::end文件末尾
ios::cur当前位置
#include <vector>
#include <string>
#include <fstream>
#include <iostream>

int main()
{
    // 读写文本文件
    std::ifstream in("hello.txt");
    std::ofstream out("out.txt", std::ios::app);
    if (!in.is_open()) {
        std::cout << "open file failed" << std::endl;
        return -1;
    }

    std::string temp;
    while(getline(in, temp)) {
        out << temp;
        out << std::endl;
    }

    in.close();
    out.close();
    return 0;
}
int main()
{
    // 写二进制文件
    std::ofstream out("out.dat", std::ios::binary);
    int num = 20;
    std::string str("Hello, World");
    out.write((char*)&num, sizeof(int));
    out.write(str.c_str(), str.size());
    out.close();

    // 读二进制文件
    std::ifstream in("out.dat", std::ios::binary);
    char buf[256] = {0};
    in.read((char*)&num, sizeof(int));
    in.read(buf, 256);
    std::cout << "int : " << num << std::endl;
    std::cout << "str : " << buf << std::endl;
    in.close();
    return 0;
}

输出结果:
int : 20
str : Hello, world

// 读取终端输入保存到文件
int main()
{
    std::ofstream out("out.txt", std::ios::app);
    std::string str;
    std::cin >> str;   // 会在空格处截断输入的内容
    out.write(str.c_str(), str.size());
    out.close();

    return 0;
}
  • 注意 std::cin 的用法,获取终端输入一行的内容可使用 getline 函数

C++:随笔7---运算符重载 当我们进行a+b操作时,他返回的是a-b。 例子:实现复数的加法。 //用C++类的方法实现复数加法 #include<string> #include<iostream> class Plus//定义一个复数类 { public: //构造函数有两种情况,一种是对这个类有初始化;另一种是没有初始化(没有初始化的话把他们都赋值为0) Plus(); Plus(double r,double i); virtual ~Plus();//析构函数 Plus add(Pl 阅读详情

相关推荐

手把手教你使用transciver-ip核的配置

手把手教你使用transciver-ip核的配置

u012938458的博客 5414

7.8随笔(C++复习)

明天期末考试,稍微复习(预习)一下C++课程设计 把引用作为函数返回值: #include <bits/stdc++.h> using namespace std; int a[10] = {1, 2, 3, 4, 5}; int &change(int i) { return a[i]; } int main() { change(0) = 6; change(1) = 7; for (int i = 0; i < 5; i++)

陈颜的博客 5217

RK3588 EVB开发板原理图讲解【六】

该原理图展示了eMMC Flash与主控芯片之间的连接关系,以及相关的电源、信号线路和去耦电容等。

weixin_48721556的博客 1172

C++学习随笔(7)——内存管理

C++中内存管理概念的介绍和new和delete内存管理操作符的介绍。

2301_77272486的博客 1004

【光子 AI 】LangGraph:Graph = 有向有环图 + 状态机实现原理详解:数据结构模型与核心算法代码实现逻辑解析

LangGraph核心原理解析:基于Pregel模型的消息传递图,结合有向有环图和状态机特性。关键实现包括:1) 共享状态机制(TypedDict/Pydantic模型)配合Reducer逻辑实现状态更新;2) 图拓扑结构通过邻接表维护节点和条件边;3) 检查点机制支持状态持久化和恢复。运行时采用Pregel循环算法,通过超级步迭代执行节点函数、应用状态归约、条件路由下一批节点,同时支持人工中断和异步并行处理。该架构使LangGraph具备循环执行、条件跳转等DAG无法实现的动态流程控制能力。

AI天才研究院 1036

vscode 配置 codeql

vscode 配置 codeql

SHELLCODE_8BIT的博客 1440

c++ primer 随笔(7) 特殊工具与技术

优化内存分配 c++提供两种方法分配和释放未构造的原始内存: 1.allocator类 2.标准库中的new和delete操作符 应当引起注意的是,这里的内存分配不是分配内存给对象的实体,而是分配一个未使用的空间,此后在这片空间上的操作,都由allocator类给出,这样做实际上实现了内存空间分配与对象构建的分离。 使用步骤: 由于allocator将内存空间的分配和对象的构建分离,故使用allo...

lxx909546478的博客 355

锁的艺术:Java并发中的常用锁策略与实践

对java锁相关内容进行整理分析:乐观锁 VS 悲观锁+自旋锁 VS 适应性自旋锁+无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁+公平锁 VS 非公平锁+可重入锁 VS 非可重入锁+独享锁 VS 共享锁

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 171万+

随笔2018.4.7(含C++staic静态成员有关内容)

C++:        早上起来,先看了会儿静态成员的有关内容,尽管昨天看了一下基础知识,但在今天实际动手操作时发现还是有许多小知识点没有真正领会。下面总结一下今天比较模糊的几个地方。1、静态数据成员的声明与初始化:    声明格式:例如 static int x;要注意的是静态数据成员的初始化操作必须在类外进行,(格式为int 类名::变量名=?)。2、静态函数:    即在普通的成员函数前加s...

又菜又爱玩 254

MimicKit 人形机器人强化学习全身模仿控制算法使用教程

本文介绍了MimicKit运动模仿算法框架的使用指南。主要内容包括:1)安装IsaacGym和依赖项;2)训练模型命令及参数说明;3)测试模型的方法;4)分布式训练配置;5)使用TensorBoard可视化日志;6)动作数据格式说明。该框架支持DeepMimic、AMP、ASE、ADD等算法,包含PPO、AWR等强化学习算法,适用于物理仿真角色动画控制研究。

机器人控制与仿真应用 1201

请举手回答,LDO和DC-DC有什么不同?

文章目录1 LDO是什么2 LDO典型电路3 DC-DC是什么4 DC-DC典型电路5 LDO和DC-DC区别10.2.6 小结一下 大家好,我是记得诚。 DC-DC和LDO都是电源芯片,两者差异很大,用法也不同,这篇博客讲述LDO和DC-DC的一些差异,帮助更好的认识LDO和DC-DC并进行选型。 1 LDO是什么 LDO是low dropout regulator的简称,即低压差线性稳压器,这是相对于传统的线性稳压器来说的,传统的稳压器,输入比输出要高出很多,否则无法工作,LDO可能输入比输出高1~2V

记得诚 1万+

C++ 11 介绍 —— 序

这是一个系列随笔,C++ 11 从11年9月正式发布到今天,网上关于这方面的中文资料都比较零碎,相关方面的书籍也不多。学习C++已经有8个年头了,由于平时项目开发中对于C++的有些方面使用并不是特别多,发现随着时间的流失,慢慢有些基础知识居然不再扎实了。因此,正好借C++ 11这个机会,重新系统的来学习一下。 这些随笔的主要参考文档为《ISO/IEC 14882 - 2011》,当然也包含...

weixin_30632899的博客 178

量化交易 米筐 案例:市值因子选股策略

案例:市值因子的选股策略 1.结果 获得超额收益 年化 49% 2. 从股票中选择市值小的股票 选定财务数据筛选 进行每日调仓(多因子选股调仓 周期频率会小一些) 3. 代码 估值有关指标 # 在沪深300股票中,选出市值比较小的10只股票 # 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。 def init(context): # 沪深300组合 stocks = index_components('000300.XSHG') # 沪深3

廷益_飞鸟的博客 2313

C++ STL下载和安装

C++ STL下载和安装 C++ STL下载和安装2009-06-16 11:46January 19, 2005C++ STL下载和安装作者:winter最近在网站访问日志中,看见有许多朋友在搜索“C++ STL下载”、“C++ STL 中文版下载”,因此这里写...

192

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C++随笔

C++随笔,想到什么写什么

weixin_55887103的博客 620

pscad IEEE标准系统搭建说明

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

【c++随笔19】g++每个版本和c++标准的对对应关系

原创作者:郑同学的笔记原文链接:https://zhengjunxue.blog.youkuaiyun.com/article/details/143653681。

junxuezheng的博客 1650

深度学习工具包 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++随笔15】c++常用第三方库

一、数据库相关:HDFS、libpq、SQLite、RocksDB、unixODBC、Nanobdc、Ignite; 二、网络通信相关: libcurl、libevent、libssh、mosquitto、nghttp2、libuv; 三、加密和安全相关: 1、OpenSSL四、序列化和数据格式相关: Protobuf、json(nlohmann)、Rapidjson、pugixml、Xlnt、Yamlcpp、Libxl:五、压缩compress\Minilzo、Snappy、zlib;

junxuezheng的博客 3928

C++——随笔

C++和C的区别 参考回答: 设计思想上: C++是面向对象的语言,而C是面向过程的结构化编程语言 语法上: C++具有封装、继承和多态三种特性 C++相比C,增加多许多类型安全的功能,比如强制类型转换、 C++支持范式编程,比如模板类、函数模板等 四种cast转换 C++中四种类型转换是:static_cast, dynamic_cast, const_cast, reinterpret_cast const_cast 用于将const变量转为非const,例如下面语句是编译不通过的:

漫长IT路 619

【c++随笔13】多态

我们查看《C++ Primer 第5版》第15.3章节 虚函数中的介绍(p537页)OOP的核心思想是多态性(polymorphism)。多态性这个词源自希腊语,其含义是“多种形式”。我们把具有继承关系的多个类型称为多态类型,因为我们能使用这些类型的“多种形式”而无须在意它们的差异。引用或指针的静态类型与动态类型不同这一事实正是C++语言支持多态性的根本所在。

junxuezheng的博客 833

C++知识随笔

(7)”sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小;(2)引用不可以为空,当被创建的时候,必须初始化,而指针可以是空值,可以在任何时候被初始化。(6)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。(5)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;指定义了一个指针,这个指针指向一个只读的对象,不能通过常量指针改变这个对象的值。(3)可以有const指针,但是没有const引用;

weixin_51219177的博客 480

算法练习——力扣随笔【LeetCode】【C++】

在哪定义结构体?有两个位置可写:1)类里面,讲究的话写在private中,这里就不讲究了。} };2)顶部区域int data;} };在哪定义全局变量?1)顶部区域public :return v;} };2)换个方式,传参方式改为引用很多全局变量是可以被替代的,比如希望值被修改并返回到原来作用域,但返回值位置紧张。暴力时,全局变量开大数组还是有点用处的。在哪定义头文件?一般是全面的,多虑了。

cold的博客 908

C++一些随笔

C++ 随笔

EternallyAccompany的博客 266

随笔分类 - C++托管(clr)(转)

c#利用SWIG调用c++dll学习总结【转】 摘要: 开发环境: 操作系统:windows 7 IDE:Microsoft Visual Studio Professional 2015 SWIG: 3.0.12 swig的介绍 详细介绍可看官网,一下贴出官网上的原话: SWIG is a software development tool that阅读全文 posted @2018-0...

weixin_30621711的博客 164

C++ 基础随笔

C++ 知识点学习总结归纳

qq_44084616的博客 248

c++随笔记录

本文总结了C++基础与核心编程的关键知识点,主要包括:1. C++基础部分:详细介绍了sizeof与strlen的区别、三目运算符、数组名作用、指针与引用、const关键字、结构体等核心概念;2. C++核心编程:重点讲解了面向对象的三大特性(封装、继承、多态),包括类的构造/析构函数、深/浅拷贝、this指针、友元等特性,以及继承方式和多态实现;3. 内存管理:对比了new/delete与malloc/free的区别,分析了define与const/typedef的差异;4. 特殊关键字:解释了stati

weixin_64639184的博客 974
上一篇: c++随笔-6
下一篇: c++基础-8
无夜_
博客等级 码龄7年 2916粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值