【C艹】关于sort用法之重构cmp(comp)函数的笔记

python中sort()方法的cmp参数 阅读详情

目录

前言:

一、cmp函数的原理探究

二、应用

1、非升序排序(int)

2.结构体排序(多级排序)

3.类实例排序(和同结构体差不多就不写了) 

4.多条件排序


前言:

众所周知,balabalabalabala············。

所以掌握sort函数(库文件:<algorithm>)的用法还是很有必要的。

一般选手只会简单地用用sort排一排数组之类,但是一旦掌握了sort的精髓cmp函数(也有叫comp,名字不重要)的重构,sort函数也可以玩得出神入化。

这里只是不全面地记录下了在切题的过程中遇到的重构cmp的应用,仅供参考:


一、cmp函数的原理探究

研究sort的底层代码就会知道,sort函数非常强大,内部结合了多种排序算法以达到相对稳定的高效。但是不管排序的策略如何,其中都用一个“比较”的步骤。而cmp函数(全称大概代表了单词compare,表示“比较”的意思)便定义了这个比较的标准。

举个栗子:当比较一个数组中a、b(a<b)两个元素的时候,通过cmp函数,我们可以决定a与b比较的结果。比如是小的放在前面(那么比较后a与b的相对位置就是···a···b···(一般sort默认就是非降序)),或者大的放在前面(那么比较后a与b的相对位置就是···b···a···)

怎么把我们对cmp函数的重构应用到sort函数里面呢?

从下面可以看出sort模板有三个参数:

void sort ( RandomAccessIterator first, RandomAccessIterator last ); 

void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);//排序区间为[first,last)
   //注: 随机迭代器,能用此算法的容器是支持随机访问的容器:vector, deque, string。不支持链表一类的排序。

然后我们转到sort的定义找到默认的comp:

 // TEMPLATE FUNCTION sort
template<class _RanIt> inline
    void sort(_RanIt _First, _RanIt _Last)
    {    // order [_First, _Last), using operator<
    _STD sort(_First, _Last, less<>());
    }

 是 less<>(),然后继续转到这个的定义去看:

// TEMPLATE STRUCT less
template<class _Ty = void>
    struct less
        : public binary_function<_Ty, _Ty, bool>
    {    // functor for operator<
    bool operator()(const _Ty& _Left, const _Ty& _Right) const
        {    // apply operator< to operands
        return (_Left < _Right);
        }
    };

好吧实际上就是个——小于号。

也就是说,比较两个元素a,b的时候,a<b则comp函数返回true;a>=b则comp函数返回false;由默认排序为升序我们可以推知,comp为true的时候a,b顺序不变,!comp为true的时候a,b顺序改变。(只是暂时的推理!!后面发现有坑!!)

为了方便记忆和使用,我们可以这么想:记相对位置分别在左边和右边的两个元素(这里不用a和b表示)为left和right,排序后的left和right的关系是使comp返回true的关系。(但要注意一个特殊情况,left = right的时候comp返回都是false,按照排序的原理比较这两个元素的时候会交换他们的位置,不过交换前后整个数组并无差别,不过这两个元素只会比较一次,所以也不会无限交换下去(后来事实证明我的想法是错误的))

然而事实真的是这样吗?

这时候我写了一个cmp:

 
 bool cmp(int left,int right)
 {
     return left >= right;
 }

 当在排序的数组中有两个相同的元素的时候,编译器报了错:

于是我就去查了一下问题的原因,然后知道了sort没有我想的那么简单。

这里引入一个概念:严格弱序(不好意思没找到定义)下文引用自:C++ 严格弱序_River_Lethe的博客-优快云博客

什么是严格弱序?

 C++关联容器的有序容器对元素关键字的类型有要求,元素关键字的类型必须定义了严格弱序(stick weak ordering) 
拿内置类型来说,C++都定义了 “<”操作符,这就是一个严格弱序,而“<=”就不是一个严格弱序

严格弱序有什么用?

对于内置类型我们自然可以有<、>、=来判断两个值的大小关系,而对于自定义的类类型,为它定义三种比较操作符是没有必要的,只用一个严格弱序(这里就用<为例)就可以表示两个元素三种大小关系

  • a小于b

    a < b

  • b小于a

    b < a

  • a等于b

    !(a < b) && !( b < a )

严格弱序的三条要求

  1. 两个关键字不能同时“严格弱序”于对方
  2. 如果a“严格弱序”于b,且b“严格弱序”于c,则a必须“严格弱序”于c
  3. 如果存在两个关键字,任何一个都不“严格弱序”于另一个,则这两个关键字是相等的

 如果我们把<代入上面的要求,代替掉“严格弱序”,会发现这三条要求简直是理所当然的,这是因为<正是严格弱序的。反之,如果代入<=就会发现逻辑上的错误:

1.两个关键字不能同时“<=”于对方 
显然有a<=b,b<=a,a,b相等时成立 
2.如果存在两个关键字,任何一个都不“<=”于另一个,则这两个关键字是相等的。 
a不小于等于b,且b也不小于等于a,也就是a>b且b>a,这明显是一个伪命题

然后是报错的原因以及解决办法,参考:

c++中sort函数调用报错Expression : invalid operator <的内部原理 及解决办法 - Lucky小黄人^_^ - 博客园

和

进行std::sort的元素为什么要保证严格弱序? - castchen - 博客园

而有时,我们所比较的元素并不仅仅是一个值,还可以是一个结构,一个类的实例,或者排序的策略并不想要升序,这时候就要我们自己重构一下cmp函数了。


二、应用

1、非升序排序(int)

#include <algorithm>
#include <iostream>
using namespace std;
bool cmp(int left,int right)
{
    return left > right;
}
int main()
{
    int a[7] = { 9, 8, -7, -6, 5, 4,4 };
    sort(a, a + 7,cmp);
    for (int i = 0; i < 7; ++i)
    {
        cout<<a[i]<<' ';
    }
    system("pause");
    return 0;
}

2.结构体排序(多级排序)

#include<iostream>
#include<algorithm>
using namespace std;
struct node{
    int a;
    int b;
}nodes[5] = { {1,20}, {5,4}, {5,6}, {7,8}, {5,6} };
bool cmp(const node left,const node  right)//排序规则:按a 从大到小,若a相等,则按b从大到小
{
    if (left.a == right.a)
    {
        return left.b > right.b;
    }
    else
    {
        return left.a > right.a;
    }
}
int main()
{
    sort(nodes, nodes + 5, cmp);
    for (int i = 0; i < 5; ++i)
    {
        cout << "第" << i + 1 << "个:" << nodes[i].a << "," << nodes[i].b<< endl;
    }
    system("pause");
    return 0;
}

3.类实例排序(和同结构体差不多就不写了) 

4.多条件排序

分析: 

这里排序的第一条件是:若两个数都在arr2中,则按arr2中的顺序,

若两数之中一个数不在arr2中,在arr2中的数在前面,

若两个数都不在arr2中,则按大小非降序排列.

ok,然后代码就很好写:

class Solution {
public:
    vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
        unordered_map <int,int>cixu;
        for(int i =0;i<arr2.size();++i){
            cixu[arr2[i]]=i;
        }
        sort(arr1.begin(),arr1.end(),[&](int &a,int &b){
            if(cixu.count(a)){
                if(cixu.count(b))
                    return cixu[a]<cixu[b];
                else
                    return true;
            }else if(cixu.count(b))
                    return false;
            return a<b;
        });
        return arr1;
    }
};

//好吧我承认这个匿名函数写的不漂亮...

未完待续,遇到有意思的我会再加上去

C++中sort函数使用方法 一.sort函数 1.sort函数包含在头文件为#include<algorithm>的c++标准库中,调用标准库里的排序方法可以实现对数据的排序,但是sort函数是如何实现的,我们不用考虑! 2.sort函数的模板有三个参数: void sort (RandomAccessIterator first, RandomAccessIterator last, Compa... 阅读详情

相关推荐

C++谓词性能优化:从lambda写法到CPU缓存的工程实践

谓词是C++ STL算法的核心可调用对象,本质是算法与数据之间的契约接口。其原理在于通过编译器内联、参数传递策略和内存访问模式直接影响执行效率;技术价值体现在零开销抽象的兑现——优质谓词可将算法耗时降低60%以上;典型应用场景覆盖find_if过滤、count_if统计、remove_if逻辑删除及sort排序等高频操作;而实际工程中,lambda捕获方式、const&参数声明、严格弱序约束等细节,直接决定程序是否稳定、高效、可维护。本文聚焦谓词在真实项目中的性能瓶颈与落地规范。

weixin_30417487的博客 523

sort 函数排序之cmp浅析

结构体排序简单的和普通排序是一样的,复杂一点是这样出现的,例如,按总成绩大小进行排序,如果总成绩相同,按语文成绩排序,如果语文成绩相同,按数学成绩排序,这类题目无非就是在cmp进行if和else的判断。出现结构体排序的情况,是我们对一类数据排序的同时,它的关联项也跟着按它的顺序排列,比如按总成绩排序,成绩对应的个人也是跟着走的。5.这里还有一点,就是有些时候返回0或1以及返回true或false得不到正确结果,这是因为。比如我们return x

m0_51863774的博客 5522

从一道OpenJudge排序题,聊聊C++自定义排序的几种写法与选择(附整数奇偶排序完整代码)

本文通过一道OpenJudge整数奇偶排序题,详细探讨了C++中自定义排序的三种实现方式:传统比较函数、逻辑运算符组合和Lambda表达式。文章分析了每种方法的优缺点及适用场景,并提供了完整代码示例,帮助读者在信息学竞赛和工程实践中做出合理选择。

weixin_30680385的博客 341

C++ sort函数中cmp()比较函数的写法

(部分内容搬运,来源见文章底部) sort函数中的cmp比较函数 sort函数中的比较函数cmp(),即void sort( iterator start, iterator end, StrictWeakOrdering cmp ); sort函数头文件为:#include <algorithm> 其中,cmp函数可以自己编写,自己决定逻辑,包括cmp的命名也是自己决定的。 示例如下: bool cmp(int a ,int b) { return a < b ; 从小到大排序,

weixin_53833977的博客 2万+

【信息科学与工程学】计算机科学与自动化——第三百零五篇 数据中心 Scale-Up、Scale-Out、Scale-Across 01

临界带宽B_critical满足:V_orig/B_critical = V_orig/(r·B_critical) + V_orig/R_compress + r·V_orig/R_decompress ⇒ 1/B_critical = 1/(r·B_critical) + 1/R_compress + r/R_decompress ⇒ B_critical = (1 - 1/r) / (1/R_compress + r/R_decompress)。T_original中所有数据均经内存总线传输。

weixin_49199313的博客 475

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01

当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。

weixin_49199313的博客 1267

sort函数中的cmp函数使用

sort函数中的cmp函数使用 在leetcode上面刷题的时候发现大家使用sort函数的时候总能用出一些与众不同的比较方式,其中使用cmp自己定义排序放的非常的方便,因此我们这里记录一下cmp的使用。 首先我们先来看一下最基础的排序方式: 这样我们得到的结果就是一个非常简单的非递减排序 那么cmp函数的使用是怎么样的呢,cmp函数的定义其实很奇特,他是一个返回值为bool类型的函数,它定义的内容其实是“小于”,可能这么讲不太清楚,所以我们先看个例子: 在主函数前我们新定义了一个cmp(什么名字都行)

thlz 1万+

schrodinger 薛定谔

链接: https://pan.baidu.com/s/1Duh4GsoytIklvZp7TdHpWg 密码: wmr1 Linux系统版 进入 Schrodinger_Suites_2021-2_Linux-x86_64 sudo ./INSTALL 中间按默认的来即可,也可以自己调整安装目录。安装目录一定要记住。 安装完,把patcher 拷贝到安装目录 sudo ./patcher 点击Patch即可。 启动程序,进入安装目录 ./maestro ...

周迪新的博客 1万+

c语言cmp函数含义,【C艹】关于sort用法之重构cmp(comp)函数的笔记

众所周知,balabalabalabala············。所以掌握sort函数(库文件:)的用法还是很有必要的。一般选手只会简单地用用sort排一排数组之类,但是一旦掌握了sort的精髓cmp函数(也有叫comp,名字不重要)的重构,sort函数也可以玩得出神入化。这里只是不全面地记录下了在切题的过程中遇到的重构cmp的应用,仅供参考:一、cmp函数的原理探究研究sort的底层代码就会知...

weixin_34566436的博客 3049

从投影到抗噪:直线拟合三大算法实战指南

本文深入解析了直线拟合的三大核心算法:常规最小二乘法(OLS)、正交回归(TLS)和RANSAC。通过对比其几何原理、代码实现与适用场景,为计算机视觉和数据分析领域的实践者提供了清晰的选型指南,帮助在抗噪、旋转不变性等不同需求下,精准选择并应用最合适的算法。

ujm567890的博客 576

EGO-Planner文章解读(一)——论文原理和算法实现

详细解读egoplanner论文和代码

fegxg的博客 3986

Python列表核心方法与函数实战指南:append、sort、index、max全解析

列表(list)是Python最基础且高频使用的内置数据结构,其本质是动态数组,支持O(1)索引访问与追加,但插入、查找等操作为O(n)时间复杂度。理解`append()`与`extend()`的语义差异(单元素添加 vs 可迭代对象展开)、`sort()`原地排序与`sorted()`生成副本的根本区别、`index()`的异常风险及`max()`/`min()`的`key`参数高级用法,直接决定代码的健壮性与可维护性。这些能力广泛应用于数据清洗、电商价格分析、日志处理与金融风控等真实工程场景。本文聚焦P

weixin_34121304的博客 379

新四化浪潮下,中年整车诊断工程师的黄金突围路

摘要 本文探讨了汽车电子诊断工程师在当前行业变革中的独特优势与发展路径。作者作为从业者指出,整车诊断岗位在汽车"新四化"浪潮中呈现"逆生长"特性:技术壁垒高、经验复利强、市场需求持续增长。中年工程师凭借丰富的案例积累和实战经验成为行业稀缺人才,薪资水平显著高于同龄段其他技术岗位。文章分析了四条职业发展路径(技术专家、技术管理、细分深耕、横向拓展),并警示了三大职业风险(执行层局限、技术停滞、成果沉淀不足)。最后提出具体建议,强调掌握UDS高阶、DoIP以太网诊断等核心技术的重要性,为中年技术人提供了清晰的职

Soly_kun的博客 309

Awesome C 完整导览:纯 C 开源生态资源清单的定位、目录结构与实战选型指南

本篇技术指南以开源仓库 [awesome-c](https://link.gitcode.com/i/3b9c01fec41dd6cd5d799fe0911e32f4) 的 README 清单为核心,系统讲解这份"纯 C 精选资源清单"的定位与收录准则、目录结构与条目格式,并逐分类完整梳理 AI、构建系统、编译器、压缩、并发、加密、数据库、数据结构、调试、游戏、图形、GUI、网络、数值计算、序列化

gitblog_00342的博客 373

ServiceNow Discovery & CMDB Interview Questions and Answers (2025)

【代码】ServiceNow Discovery & CMDB Interview Questions and Answers (2025)

weixin_47584092的博客 910

吊打原版YOLOv8!ASF-YOLO多尺度融合+注意力机制实战解析(遥感/医疗/质检均适用)

ASF-YOLO融合YOLOv8的创新目标检测框架摘要 ASF-YOLO是针对小目标检测优化的先进框架,采用三重特征编码器和尺度序列融合技术增强多尺度特征提取能力。核心创新包括: 三重特征编码器(TPE)融合跨层级信息 尺度序列特征融合(SSFF)模块通过3D卷积处理多尺度信息 通道-位置注意力机制(CPAM)聚焦关键特征区域 Zoom_cat模块实现自适应多尺度特征融合 该框架特别适用于医学影像、遥感检测等小目标密集场景,通过动态特征权重调整显著提升检测精度。关键技术实现包含多尺度特征统一、3D卷积序列处

FJN110的博客 527

C++20三向比较运算符在排序算法中的实践与优化

在编程中,比较操作是排序、查找等算法的核心基础。传统比较方式通常需要重载多个运算符,代码冗余且效率有限。C++20引入的三向比较运算符(operator<=>)从根本上改变了这一模式,它通过一次调用返回完整的比较关系(小于、等于、大于),并自动生成全套比较运算符。这一特性在排序算法中尤其重要,例如在快速排序的三路划分中,它能显著提升对重复元素数据的处理效率。通过合理利用强序、弱序和偏序等比较类别,开发者可以编写出更简洁、高效且语义清晰的排序逻辑。本文结合C++20新特性,深入探讨了如何在经典排序算法中集成三

dflkg8956的专栏 432

国产FPGA高云GW1NSR-4C,集成ARM Cortex-M3硬核

从板子整体角度来看,这是一款国产化程度很高的板子,从主控FPGA,到JTAG芯片,存储芯片、电源芯片等,都是使用的国产半导体公司的产品。板子整体尺寸也比较迷你,属于小而美类型的,可以认为是一款FPGA核心板,当然也预留了排针接口,给用户足够的扩展空间。对于想了解高云小蜜蜂SoC软硬件开发,以及对云源软件、MCU开发环境做个深度评测来说足够了。JTAG调试器固件可以增加虚拟串口功能,对于板子本来来说面积不会有改动,只需要添加两根信号线即可。

whik1194的博客 6396

C++14泛型Lambda:从语法糖到编程范式的进化

在C++编程中,Lambda表达式作为一种匿名函数机制,极大地简化了函数对象的定义,提升了代码的简洁性和可读性。其核心原理是通过编译器生成匿名类,将Lambda转换为函数对象。这一特性在STL算法、回调函数等场景中展现出巨大价值,实现了函数式编程风格与C++的高效结合。C++14引入的泛型Lambda进一步扩展了这一能力,允许在参数列表中使用auto关键字,使Lambda能够像模板函数一样接受任意类型参数,从而支持更通用的高阶函数和算法适配器。这种设计不仅提升了代码的复用性和表达力,还为编译时多态、策略模式

weixin_33901926的博客 325

ASPICE学习笔记

ASPICE的全称是Automotive SPICE。

汽车电子软件领域知识分享 1355

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++运算符重载实战:设计可比较可打印的Student类

运算符重载是C++面向对象编程的核心技术之一,它允许程序员为自定义类型定义类似内置类型的操作行为。其原理是通过定义特定的成员函数或友元函数,赋予运算符新的语义。这项技术的核心价值在于提升代码的直观性和可维护性,让自定义对象能无缝融入标准库算法和容器。在数据处理、游戏开发、金融建模等需要频繁比较和输出自定义对象的场景中,运算符重载能显著简化代码逻辑。本文以学生成绩管理系统为背景,详细探讨了如何为Student类重载比较运算符和输出流运算符,解决了多模式排序和对象打印等实际问题,并深入分析了浮点数比较、关联容器

weixin_30530939的博客 389

深度学习工具包 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++工程化冒泡与选择排序:泛型迭代器实现与性能优化

排序算法是理解内存访问、比较抽象和STL设计逻辑的基础概念。冒泡排序和选择排序虽时间复杂度为O(n²),但在小规模数据、部分有序场景及嵌入式确定性要求下,仍具不可替代的工程价值。其核心原理在于相邻比较与极值定位,技术价值体现在对迭代器类别约束、移动语义应用、早停机制与零拷贝交换的精准控制。典型应用场景包括UI菜单排序、实时滤镜预处理、调试监控组件及STL fallback策略实现。本文聚焦C++语言特性驱动的工业级重构,覆盖随机访问迭代器适配、std::iter_swap与手动move优化、static_a

weixin_30522983的博客 241

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

STM32F407中文手册

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

C++20三向比较运算符operator<=>:简化自定义类型比较的终极指南

在C++编程中,自定义类型的比较操作是常见需求,传统方法需要手动重载多个运算符,过程繁琐且易出错。三向比较运算符(operator<=>)是C++20引入的核心特性,它通过统一的比较语义和编译器自动生成机制,从根本上简化了比较逻辑的实现。其原理基于表达式重写规则,将传统的关系运算符(如<、>)自动转换为对operator<=>的调用,并支持返回强序、弱序和偏序三种比较类别。这项技术的核心价值在于提升代码的简洁性、正确性和一致性,尤其适用于泛型编程和值语义类型的开发。在应用场景上,operator<=>广泛应

weixin_34068198的博客 218

C++20 std::ranges:编译期策略内联的现代C++高效编程

在C++模板元编程与泛型算法不断演进的背景下,std::ranges为现代C++开发者提供了一套全新的抽象表达方式。它通过范围(range)与视图(view)的概念,将传统迭代器对的操作提升为可组合、惰性求值的管道模型。其底层实现如同策略内联编译器:开发者书写的谓词、投影与比较器均在编译期被展开内联,生成接近手写循环的机器码。相比经典STL算法,ranges不仅简化了过滤-映射-排序等链式调用,还通过投影机制降低了代码冗余并提升可读性。在实际工程中,合理运用视图组合与std::ranges::sort等算法

weixin_33827590的博客 374

StateSort:基于状态机的高性能比较排序算法解析

比较排序是计算机科学中最基础的算法范式之一,其理论下界Ω(n log n)不可突破,但实际性能高度依赖硬件协同效率。现代CPU架构下,传统快排、归并等算法受限于分支预测失败、缓存局部性差和内存访问延迟等问题,导致工程实践中性能波动显著。StateSort通过显式有限状态机(FSM)重构排序逻辑,将每次比较转化为确定性状态跃迁,实现控制流高度可预测、比较开销极致压缩、缓存友好且预取高效。该设计在高频交易订单簿排序、实时音视频运动估计、数据库Top-K查询等低延迟敏感场景中展现出1.27–1.42倍稳定加速,是

Ferrerooo 成长 513

C++AI编译错误自动修复神器-告别手动Debug的终极方案

在日常 C++ 开发中,编译错误是最频繁遇到的障碍之一。一个中等规模的项目在重构期间,一次 可能产生数十甚至上百条错误信息。这些错误往往具有级联效应——一个头文件的拼写错误可能导致下游十几个翻译单元同时报错,而真正需要修改的地方只有一处。传统的工作流是: 这个循环对于经验丰富的开发者来说尚可接受,但对于以下场景则效率极低:优势:局限:本项目最适合以下场景:阅读

weixin_48053866的博客 279
上一篇: 程序设计中左闭右开区间的广泛应用
下一篇: 逆向解读割木板问题贪心算法合理性
咖啡咖_CoffCa
博客等级 码龄6年 116粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡咖_CoffCa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值