MATLAB Switch-Case语句:让你的代码逻辑更清晰!

MATLAB中的Switch语句讲解 MATLAB中的switch语句讲解 阅读详情
AI摘要

本文详细介绍了MATLAB中的Switch-Case语句,包括其基本语法、数值与字符串处理、实际应用及与其他控制结构的区别。通过实例说明如何利用Switch-Case提高代码可读性和效率,并提供常见错误与解决方法。

写代码的时候,经常会遇到需要根据不同条件执行不同操作的情况。如果用一堆if-else语句来处理,代码会变得又长又乱(看着就头疼)。这时候,switch-case语句就像救星一样出现了!

什么是Switch-Case语句

Switch-case语句是一种多分支选择结构,专门用来处理一个变量可能有多种取值的情况。简单来说,就是"如果变量等于A,就做这个;如果等于B,就做那个"这样的逻辑。

在MATLAB中,switch-case的基本语法是这样的:

switch 表达式
    case 值1
        % 执行代码1
    case 值2
        % 执行代码2
    case {值3, 值4, 值5}
        % 执行代码3(多个值匹配同一个case)
    otherwise
        % 默认执行的代码
end

基础用法实例

先来看个最简单的例子。假设我们要根据学生的成绩等级给出不同的评价:

grade = 'B';

switch grade
    case 'A'
        disp('优秀!继续保持!')
    case 'B'
        disp('良好,还有进步空间')
    case 'C'
        disp('及格了,但需要加油')
    case 'D'
        disp('不及格,需要补考')
    otherwise
        disp('无效的成绩等级')
end

运行结果会显示:“良好,还有进步空间”。

这里有几个要注意的点:

  • 每个case后面跟的值要和switch后面的表达式类型匹配
  • 不需要写break语句(这点和C语言不同)
  • otherwise相当于其他语言中的default,可以省略

数值类型的Switch-Case

Switch-case不仅可以处理字符串,数值也完全没问题!

month = 3;

switch month
    case {12, 1, 2}
        season = '冬季';
        temperature = '寒冷';
    case {3, 4, 5}
        season = '春季';
        temperature = '温暖';
    case {6, 7, 8}
        season = '夏季';
        temperature = '炎热';
    case {9, 10, 11}
        season = '秋季';
        temperature = '凉爽';
    otherwise
        season = '未知';
        temperature = '无法确定';
end

fprintf('第%d个月是%s,天气%s\n', month, season, temperature);

注意看这里用了花括号{}来表示多个值对应同一个case!这个功能超级实用,可以避免写重复的代码。

实际应用场景

场景1:计算器功能选择

function result = simple_calculator(a, b, operation)
    switch operation
        case '+'
            result = a + b;
        case '-'
            result = a - b;
        case '*'
            result = a * b;
        case '/'
            if b ~= 0
                result = a / b;
            else
                error('除数不能为零!')
            end
        case '^'
            result = a ^ b;
        otherwise
            error('不支持的运算符')
    end
end

% 使用示例
ans1 = simple_calculator(10, 5, '+');  % 结果:15
ans2 = simple_calculator(10, 5, '*');  % 结果:50

场景2:文件类型处理

function process_file(filename)
    [~, ~, ext] = fileparts(filename);
    
    switch lower(ext)
        case {'.txt', '.log'}
            disp('这是文本文件,准备用文本编辑器打开')
            % 处理文本文件的代码
        case {'.jpg', '.png', '.gif', '.bmp'}
            disp('这是图像文件,准备调用图像处理函数')
            % 处理图像文件的代码
        case {'.mp3', '.wav', '.flac'}
            disp('这是音频文件,准备播放')
            % 处理音频文件的代码
        case '.mat'
            disp('这是MATLAB数据文件,准备加载')
            % 加载MAT文件的代码
        otherwise
            disp(['未知文件类型:', ext])
    end
end

Switch-Case vs If-Else:何时选择谁

很多人会问:什么时候用switch-case,什么时候用if-else呢?

用Switch-Case的情况:

  • 一个变量有多个离散的可能值
  • 每个值对应不同的处理逻辑
  • 代码结构清晰,易于阅读

用If-Else的情况:

  • 需要范围判断(比如if x > 10)
  • 条件比较复杂
  • 需要组合多个条件

来看个对比:

% 用if-else(看起来比较乱)
if strcmp(day, 'Monday')
    disp('周一,新的开始!')
elseif strcmp(day, 'Tuesday')
    disp('周二,继续努力!')
elseif strcmp(day, 'Wednesday')
    disp('周三,过半了!')
elseif strcmp(day, 'Thursday')
    disp('周四,快到周末了!')
elseif strcmp(day, 'Friday')
    disp('周五,感谢老天!')
else
    disp('周末啦!')
end

% 用switch-case(清爽多了)
switch day
    case 'Monday'
        disp('周一,新的开始!')
    case 'Tuesday'
        disp('周二,继续努力!')
    case 'Wednesday'
        disp('周三,过半了!')
    case 'Thursday'
        disp('周四,快到周末了!')
    case 'Friday'
        disp('周五,感谢老天!')
    otherwise
        disp('周末啦!')
end

进阶技巧和注意事项

1. 表达式可以是函数调用

Switch后面不一定要是简单的变量,可以是任何返回标量值的表达式:

switch mod(hour, 24)
    case {6, 7, 8, 9, 10, 11}
        greeting = '早上好!';
    case {12, 13, 14, 15, 16, 17}
        greeting = '下午好!';
    case {18, 19, 20, 21, 22}
        greeting = '晚上好!';
    otherwise
        greeting = '夜深了,该休息了';
end

2. 字符串匹配是精确匹配

MATLAB的switch-case对字符串是精确匹配的,大小写敏感:

input_str = 'Hello';

switch input_str
    case 'hello'  % 注意大小写
        disp('匹配成功')
    case 'Hello'
        disp('这个会匹配')
    otherwise
        disp('没有匹配')
end

如果想要忽略大小写,可以这样:

switch lower(input_str)
    case 'hello'
        disp('不区分大小写的匹配')
end

3. 性能考虑

对于大量分支的情况,switch-case通常比连续的if-elseif效率更高,特别是当分支很多的时候。

常见错误和解决方案

错误1:忘记end语句

% 错误的写法
switch value
    case 1
        disp('one')
    case 2
        disp('two')
% 缺少end!

错误2:case值类型不匹配

% 错误的写法
num = 1;
switch num
    case '1'  % 数值1和字符'1'不匹配
        disp('won't match')
end

错误3:试图在case中使用范围

% 错误的写法(switch不支持范围判断)
switch score
    case score > 90  % 这样不行!
        disp('优秀')
end

% 正确的做法是用if-else
if score > 90
    disp('优秀')
elseif score > 80
    disp('良好')
end

实战项目:简单的菜单系统

最后,我们用switch-case来实现一个简单的菜单系统:

function menu_system()
    while true
        fprintf('\n=== 主菜单 ===\n');
        fprintf('1. 计算圆的面积\n');
        fprintf('2. 计算矩形面积\n');
        fprintf('3. 计算三角形面积\n');
        fprintf('4. 退出程序\n');
        
        choice = input('请选择功能(1-4):', 's');
        
        switch choice
            case '1'
                radius = input('请输入圆的半径:');
                area = pi * radius^2;
                fprintf('圆的面积是:%.2f\n', area);
                
            case '2'
                length = input('请输入矩形的长:');
                width = input('请输入矩形的宽:');
                area = length * width;
                fprintf('矩形的面积是:%.2f\n', area);
                
            case '3'
                base = input('请输入三角形的底:');
                height = input('请输入三角形的高:');
                area = 0.5 * base * height;
                fprintf('三角形的面积是:%.2f\n', area);
                
            case '4'
                fprintf('感谢使用,再见!\n');
                break;
                
            otherwise
                fprintf('无效的选择,请重新输入!\n');
        end
    end
end

总结

Switch-case语句是MATLAB中处理多分支选择的利器。它让代码更清晰、更易读,特别适合处理一个变量有多个离散值的情况。

关键要记住的点:

  • 语法简洁,不需要break
  • 支持多个值对应一个case
  • 字符串匹配是精确的
  • otherwise子句是可选的
  • 适合离散值判断,不适合范围判断

掌握了switch-case,你的MATLAB代码会变得更加优雅和高效!下次遇到多分支选择的场景,不妨试试用switch-case来实现,相信你会喜欢上它的简洁和强大。

从开关逻辑到代码艺术:MATLAB中switch-case的元胞数组魔法 本文深入探讨了MATLAB中switch-case语句与元胞数组的巧妙结合,展示了如何通过这种组合实现高效的多值条件判断。文章详细解析了元胞数组的灵活存储特性,并通过气象数据分类、学生成绩转换等实战案例,演示了switch-case在复杂条件判断中的优雅应用,为MATLAB开发者提供了性能优化和最佳实践建议。 阅读详情

相关推荐

MATLAB switch-case流程控制:从基础语法到状态机实战应用

流程控制是编程中的基础概念,它决定了程序执行的顺序和分支路径。在MATLAB中,除了常见的if-else结构,switch-case作为一种多路选择器,专门用于处理基于同一表达式不同离散值的分支场景。其核心原理是通过一次表达式求值,与多个case值进行相等性比较,直接跳转到匹配的代码块执行,这种结构在分支较多时能提供更清晰的代码组织和潜在的执行效率。从技术价值看,switch-case不仅提升了代码可读性和可维护性,其“switch true”模式还能实现复杂的条件判断,结合元胞数组支持多值匹配,使其成为实

weixin_30907935的博客 562

MATLAB 关于 switch 的使用

Matlab 关于 switch 的使用Switch的使用语法相关的注意事项示例代码更多的用法 Switch的使用 语法 switch 变量   case 结果组1     语句   case 结果组2     语句 …   otherwise     语句 end 相关的注意事项 结果组可以是数字,字符,向量,数组,冒号表达式 结果组不能包含关系运算符(例如 < 或 >),如果需要请使用 if, elseif, else语句。 示例代码 %示例 n = input('请输入一个数字: ')

a1522000的博客 6万+

MATLAB条件语句深度解析:if、switch、try实战指南与性能优化

在编程中,条件控制是实现程序逻辑判断和决策的核心基础。其原理是通过评估特定条件的真假,引导程序执行不同的代码路径,从而使代码具备处理复杂场景和异常情况的能力。掌握条件语句的技术价值在于能够构建健壮、可维护且高效的应用程序,尤其在科学计算、数据分析和算法实现中至关重要。常见的应用场景包括数据预处理中的分支逻辑、算法执行中的参数自适应、用户交互响应以及系统错误处理等。本文聚焦于MATLAB环境,深入探讨其三种核心条件控制结构——if、switch和try-catch的语法细节、适用场景与选型策略,并结合向量化编

weixin_30814329的博客 929

Matlab中switch, case, otherwise语句

目录 一.语法 二.说明 三.示例 1.比较单个值 2.与多个值进行比较 switch, case, otherwise语句是执行多组语句中的一组。 一.语法 switch switch_expression case case_expression statements case case_expression statements ... otherwise statements end 提示 case_expr

jk_101的博客 2万+

Simulink逻辑模块深度解析:从Switch到边沿检测的工程实践与避坑指南

在控制系统与信号处理建模中,逻辑模块是实现决策流与状态切换的核心组件。其原理基于布尔运算与条件判断,通过组合逻辑门、多路选择器及边沿检测器等构建复杂的控制逻辑。掌握这些模块的技术价值在于,能够高效连接连续时间物理模型与离散事件决策系统,实现紧凑的控制律并构建有限状态机。在电力电子、车辆动力学等应用场景中,逻辑模块的细节直接影响仿真精度与代码生成质量。本文聚焦于Switch模块的阈值判定模式与数据类型规则,以及边沿检测模块的初始条件设置,结合PWM生成与电机控制等案例,深入探讨如何避免仿真陷阱并优化工程实践。

weixin_34014555的博客 385

Matlab中switch语句的用法及示例

在示例中,我们展示了根据星期几输出信息、根据月份输出季节以及根据数据类型执行不同操作的情况。在这个示例中,我们通过输入一个数字(1-7)来表示星期几,然后根据输入的数字输出对应的信息。如果输入的数字与某个case相匹配,对应的语句块将被执行。在这个示例中,我们根据输入的月份输出对应的季节。根据输入的月份,对应的语句块将被执行,否则将执行otherwise语句块。在这个示例中,我们根据输入数据的类型执行不同的操作。根据输入数据的类型,对应的语句块将被执行,否则将执行otherwise语句块。

CyberSparkZ的博客 7000

别再只会用for循环了!MATLAB里while和switch case的实战场景与避坑指南

本文深入探讨MATLAB中while循环和switch-case语句的实战应用场景与避坑指南,帮助开发者从基础for循环进阶到灵活运用流程控制结构。通过典型示例和性能对比,展示while循环在条件驱动型任务中的优势,以及switch-case处理多重条件分支的高效方案,提升代码可读性和执行效率。

weixin_30298497的博客 654

【Matlab】MATLAB switch-case语句详解:多值匹配判断与固定值分支逻辑应用

本文详细解析MATLAB中switch-case语句的用法,重点介绍其在多值匹配判断与固定值分支逻辑中的应用。switch-case语句适用于离散固定值(数字、字符串等)的场景,通过精准匹配执行对应分支,比if-elseif-else语句更简洁高效。文章系统讲解其核心语法、执行流程和编写规范,包括: 标准语法格式:switch-判断表达式-case固定值-otherwise-end结构 执行流程:先计算判断表达式,再顺序匹配case分支,最后执行otherwise(可选) 四种典型应用案例:数字单值匹配、多

unber的博客 136

别再只会写for循环了!MATLAB里while和switch case的实战场景与避坑指南

本文深入探讨了MATLAB中while循环和switch case的实战应用与优化技巧,帮助开发者超越基础的for循环。通过实时数据处理、状态机实现等场景分析,揭示不同流程控制结构的适用场景与性能差异,并提供防死循环、条件分支优化等实用指南,提升代码效率与可维护性。

weixin_30883311的博客 343

2.11、matlab中for循环,if else判断语句,break和continue用法以及switch case语句使用

matlab中for循环,if else判断语句,break和continue用法

XU157303764的博客 4656

拉曼光谱仪的原理与应用——TFN 7G F660手持式拉曼光谱识别仪

拉曼光谱仪的原理与应用——TFN 7G F660手持式拉曼光谱识别仪

TFN_yzgd的博客 926

MATLAB流程控制指令实战:break、try-catch、switch-case提升代码健壮性

在编程中,流程控制是构建程序逻辑骨架的核心基础,它决定了代码的执行路径和逻辑分支。其原理在于通过条件判断、循环和异常处理等机制,引导程序按预定流程运行。掌握流程控制不仅能实现基础功能,更能显著提升代码的健壮性、可读性和执行效率,这是编写高质量软件的关键。在数据处理、科学计算、算法实现等应用场景中,精细化的流程控制尤为重要。以MATLAB为例,除了基础的if、for、while,诸如break、continue、try-catch、switch-case等指令构成了更高级的流程控制工具箱。例如,利用try-c

weixin_34199335的博客 436

自己动手写CPU(1)五级流水线及CPU第一条指令ori

自己动手写CPU(1)五级流水线及CPU第一条指令ori 动机 不知为何研一的自由时间突然多起来,可能人一闲下来就容易焦虑吧,hhhhhh。正好之前看到一本《自己动手写CPU》,就按照此书从头实做一遍MIPS指令集的CPU,也当做对大学课程的总结。之前看龙芯杯比赛的代码震惊到我了,想想那堆大佬本科在搞这东西而我本科在瓜瓜地刷分,感叹人之间的差距真的好大。痛定思痛,还是先动手做起来这才能假意安慰自己,我好像也不错。闲言少叙,让我们开始吧! 由于作者提供了各章实现的具体代码,所以该系列博客主要记录我过程中有哪些

谦豫 7077

MATLAB条件判断:if-elseif与switch-case的深度对比与实战选择

在编程中,条件判断是控制程序流程的核心结构,它决定了代码在不同输入或状态下的执行路径。从原理上看,条件判断通过评估布尔表达式或值匹配来实现分支选择,是算法逻辑的基石。其技术价值在于提升代码的清晰度、执行效率和可维护性,尤其在处理复杂业务逻辑时至关重要。在工程实践中,MATLAB作为科学计算与算法开发的主流平台,其条件判断结构的选择直接影响代码质量。常见的应用场景包括数据处理、状态机实现、算法选择和错误处理等。本文聚焦于MATLAB中两种主流条件判断结构——灵活通用的if-elseif与专注离散值匹配的swi

weixin_33826609的博客 662

ZYNQ开发(2)在Linux系统层上PL-PS通过AXI-DMA传输数据详细步骤及注意事项

参考的网络资料 https://github.com/bperez77/xilinx_axidma/tree/master https://gitlab.gnome.org/HosseinBeheshti/UlteraZed7EV/-/tree/master/petalinux/xilinx_axidma https://www.icode9.com/content-3-925319.html https://blog.youkuaiyun.com/weixin_38218267/article/details/1

aizaiyueye的专栏 3448

爬虫实战:抖音视频搜索数据爬虫开发实战(附完整Python源码)

【代码】抖音视频搜索数据爬虫开发实战(附完整Python源码)

weixin_61226361的博客 3595

别再只会用if-else了!Matlab里switch/case的3个高效用法与避坑指南

本文深入探讨了Matlab中switch/case结构的3个高效用法与常见陷阱,帮助开发者提升代码性能与可读性。通过对比if-else语句,揭示switch/case在多分支场景下的执行效率优势(快15-20%),并详细解析多条件组合、灵活表达式和数据类型分发等高级技巧,同时指出从其他语言转来的开发者容易遇到的五个典型错误。

weixin_30887919的博客 387

HUMAnN 3.0 (alpha)安装及使用

文章目录简介安装数据库下载运行参考 简介 安装 conda install humann humann_test (~1 minute) 数据库下载 humann_databases --download chocophlan full /path/to/databases --update-config yes humann_databases --download uniref uniref90_diamond /path/to/databases --update-config yes humann_

dys的博客 9504

java switch enum对象_java switch case 语句接枚举类 实现判断

首先定义枚举类public enum DataTypeEnum {/**小时类型值**/HOUR("hour"),/**小时类型值**/DAY("day"),/**小时类型值**/WEEK("week"),/**小时类型值**/MONTH("month"),/**小时类型值**/YEAR("year"),/**小时类型值**/MINUTE("minute");private String valu...

weixin_34094525的博客 1066

uniapp 使用摄像头 live-pusher (APP)

uniapp 中开发 app 时使用live-pusher踩过的坑

随身笔记 1万+

Java接入DeepSeek大模型:从零实现流式对话+多轮会话管理(完整项目实战)

emitter.completeWithError(new RuntimeException("连接DeepSeek服务超时"));private static final Set<String> BLACK_WORDS = Set.of("暴力", "色情", "政治敏感");emitter.onCompletion(() -> log.info("SSE连接完成"));emitter.onTimeout(() -> log.warn("SSE连接超时"));// 每个路由基础连接数。

wjianwei666的专栏 927

MATLAB进阶流程控制:switch-case、try-catch与循环控制指令详解

程序流程控制是编程的核心骨架,它决定了代码的执行路径与逻辑分支。从基础的if、for、while语句,到更精细的流程控制工具,其原理在于通过条件判断、循环迭代和异常处理机制,实现对程序行为的精确操控。掌握这些技术能显著提升代码的健壮性、可读性与执行效率,是构建复杂算法、进行数据分析和工程应用开发的基石。在实际应用中,例如处理多路分支选择时,switch-case语句比冗长的if-elseif链更清晰高效;而在确保程序稳定运行方面,try-catch语句为文件操作、用户输入等可能出错环节提供了关键的错误捕获与

weixin_34192816的博客 355

结构化数据特征构建神器openfe的实战代码

最近订阅专栏的几位同学一起参加了AI比赛,该比赛的数据形式是结构化的。随着特征和模型的不断迭代优化,达到了一个难以跨越的瓶颈。希望我能够给出一些有效的方法,帮助他们提高成绩。在个人的调研和体验后,向他们推荐了结构化数据特征构建神器openfe,最终也帮助他们提升了十来名的成绩,个人也感到十分的欣慰。特意写此博客,希望能够帮助更多的同学。 文章目录 1. 安装 2. 实战例子一 3. 实战例子二

herosunly的博客 3万+

MATLAB流程控制进阶:switch-case、try-catch与循环优化实战

程序流程控制是编程的核心基础,它决定了代码的执行逻辑与顺序。其原理在于通过条件判断、循环和错误处理等机制,让计算机能够根据不同情况执行相应操作,实现复杂的自动化任务。掌握流程控制的技术价值在于提升代码的健壮性、可读性和执行效率,是算法实现和数据处理的关键。在工程实践中,无论是数据批处理、自动化脚本编写还是算法开发,都离不开对程序流程的精细控制。本文聚焦MATLAB中的进阶流程控制指令,深入解析switch-case在多路分支中的应用、try-catch在错误处理与程序健壮性方面的实践,并结合向量化操作探讨循

weixin_34293141的博客 408

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

MATLAB条件语句深度解析:if、switch、try-catch应用与性能优化

在编程中,条件控制是实现程序智能决策的核心机制,它使程序能够根据不同的输入或状态执行相应的操作。其基本原理是通过逻辑判断改变代码执行路径,这在算法设计、数据处理和系统控制中具有重要价值。从基础的if-else分支到多路选择的switch-case,再到异常处理的try-catch,这些结构构成了程序逻辑的骨架。在工程实践中,条件语句广泛应用于数值计算、算法收敛判断、分段函数建模等场景。特别是在MATLAB这样的科学计算环境中,条件语句与向量化操作结合,能高效处理大规模数据。本文深入探讨了MATLAB中if、

weixin_30432579的博客 329

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

上一篇: Seaborn入门到上头:让数据可视化变成享受的艺术(附防秃指南)
下一篇: Tensor2Tensor开源框架详解:打开AI模型训练的新大门
普通网友
博客等级 码龄2年 117粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值