加速Matlab编程指南—持续更新

  • 加速Matlab编程指南(CUDA实现)
    • 为什么使用MATLAB
    • MATLAB程序的性能评估
      • 运行程序前的性能评估
      • 运行程序后的性能评估
    • 基于多核处理器的MATLAB程序加速
      • 利用MATLAB内置函数更高效的运算
      • 向量化编程有利于矩阵高效运算
      • 矩阵运算中,MATLAB要要求参与的数组应具有相同的大小。

加速Matlab编程指南(CUDA实现)

本教程适用于具有一定Matlab编程基础的读者。说是教程,更像是读书笔记,文中出现的内容多是笔者阅读以下资料的归纳和整理。主要参考的书籍及资料有:
《加速MATLAB编程指南CUDA实现》 赵地 清华大学出版社
《Matlab从入门到精通》
https://www.mathworks.com
MATLAB正版下载

为什么使用MATLAB

众所周知,当前机器学习,深度学习的代码实现往往都是在python上。笔者为什么非要在MATLAB上编写代码呢,主要原因有以下几点:

  1. 配置简单 ,MATLAB更像是一款应用软件。环境配置和代码编译由程序后台自动执行,只用编写代码并执行即可,
  2. 语言简单,MATLAB更注重算法,而不是代码实现。这里的算法是指按照人类思维方式,系统而又完整地描述解决问题的方案,因此按照算法编写的MATLAB程序在语言上,与算法本身具有很大的相似性。在MATLAB实现某种算法,只需创建矩阵和对矩阵进行运算;
  3. 可视化高 ,往往一些数学运算的代码实现是繁琐的,例如:计算FFT(快速傅里叶变换),MATLAB提供了fft()函数,工程师们已经将该函数的底层代码优化到了尽可能的高效。因此我们无需自己设计代码和对其修改,拿来即用。除此之外还需许多丰富的工具箱,和简洁明了的图形化操作界面;
  4. 最后,其实最主要的原因还是因为笔者长期处在高校,学术界使用MATLAB的情况颇多。笔者科研中常常使用MATLAB,也遇到诸多麻烦,结合了自己使用MATLAB的情况,希望能够分享给大家一些使用MATLAB的技巧。

总结就是:MATLAB更注重算法的研究,而不是代码的实现。作为初学者,使用MATLAB学习,能够避免繁杂的编程语言学习,将更多的时间放在算法的数学思考上面。

MATLAB程序的性能评估

MATLAB程序的性能评估(profiling)是指对MATLAB程序的空间复杂度(space complexity)和时间复杂度(time complexity)进行分析。不过,最简单粗暴的方式,就是对MATLAB函数的运行时间进行分析,自然越快越好。

运行程序前的性能评估

运行MATLAB程序之前,程序员首先希望知道当前计算机的性能。MATLAB的 bench() 函数的功能是运行MATLAB基准程序,测试MATLAB在本计算机上的性能。
在命令窗口输入 bench( )

运行程序后的性能评估

在运行一段程序后,如果能够获得程序的运行时间,并再加以分析,将有利于对MATLAB程序进行优化。
MATLAB的tic()/toc()函数能够帮助我们快速地完成这个操作。 tic()toc() 函数一般配合使用。执行 tic() 函数时,程序将启动秒表计时器(stopwatch), toc() 函数将种植秒表计时器并读数, tic()toc() 函数的调用格式是:

tic% 程序中计时的部分;
toc
  • 程序员在度量CPU端MATLAB代码运行时间可以执行cputime()函数,该函数返回CPU运行时间,单位为秒。注意:与 tic()/toc() 函数不同之处在于, tic()/toc() 计算的是MATLAB程序运行的总的时间,包括CPU运行时间,内存读写时间等所有内容;而 cputime() 函数仅仅衡量MATLAB程序占用CPU的时间。

  • 程序员在度量CPU端MATLAB代码运行时间可以执行gputimeit()函数在一些GPU上运行的程序, gputimeit() 能为我们度量程序在GPU端的运行时间。

不管是在GPU端还是CPU端运行的函数,都可以timeit()函数度量。 timeit() 可以将被计时的函数调用多次并记录运行时间,返回多次运行时间的平均值。

最后MATLAB还为程序员提供了更简洁的图形化操作。仅需点击MATLAB图形化界面的 运行并计时(profiler)。程序执行完毕后将返回每一条命令、每一个函数耗时的细节。

本节涉及函数的参考连接:
bench()
tic()/toc()
timeit()
cputime
gputimeit()

基于多核处理器的MATLAB程序加速

MATLAB储存的数值数据是由矩阵(matrix)构成的。这也正式MATLAB的名字由来:Matrix Lab 矩阵实验室。

  • 标量:可以认为是1X1的矩阵,表示为:xxx
  • 向量(数组):可以认为是一维矩阵,表示为: (x0x1x2)\left(\begin{array}{ccccc}x_0\\x_1\\x_2\\\end{array}\right)⎝⎛​x0​x1​x2​​⎠⎞​
  • 矩阵:表示为: G=(a11a12...a1na21a22...a2n⋮an1an2...ann)G=\left(\begin{array}{ccccc}a_{11}&a_{12}&...&a_{1n}\\a_{21}&a_{22}&...&a_{2n}\\\varvdots\\a_{n1}&a_{n2}&...&a_{nn}\\\end{array}\right)G=⎝⎜⎜⎛​a11​a21​⋮an1​​a12​a22​an2​​.........​a1n​a2n​ann​​⎠⎟⎟⎞​
  • 张量:可以认为是多个矩阵的叠加,比较难表示,用的也少。

因为,为叙述方便,以后对所有的此类结构都用矩阵来描述。这些矩阵的创建方式也有多种,在任何一本入门级的教程都有详细的介绍,这里就不赘述了。
需要注意的是:MATLAB矩阵默认的数据类型为双精度型(double)。与C/C++等语言不同,MATLAB具有对不同类型数据进行转换的内在机制,这就使得不需要对数据类型严格的定义。

利用MATLAB内置函数更高效的运算

在MATLAB的程序的编制过程中,程序员经常需要对矩阵的性质判断。由于大多数MATLAB内置函数已经做了多核多线程的优化,通过利用如下内置函数,可以实现更高效的运算:

函数名称 实现功能
isempty() 检验矩阵是否为空集
isinf() 检验矩阵每一个元素是否为Inf
isnan() 检验矩阵每一个元素是否为NaN
isprime() 检验矩阵每一个元素是否为素数
issorted() 检验矩阵是否经过排序
ismember() 检验一个元素是否被矩阵包含
histcounts() 计算矩阵中某一数值区间的元素数量
prod() 计算矩阵中元素的乘积
intersect() 计算两个矩阵的交集
setdiff() 计算两个矩阵的集合差
setxor() 计算两个矩阵的集合对称差
union() 计算两个矩阵的元素集合,每个元素只出现一次

例如:计算100的阶乘
利用prod()函数要比利用循环要高效得多

tic%循环计算阶乘;p = 1;for i=1:100p = p * i;end
toc

计算时间:

tic%prod()函数计算阶乘;a = 1:100;p = prod(a);
toc

计算时间:

向量化编程有利于矩阵高效运算

所谓“向量化编程”,即尽量使用矩阵运算来代替使用for循环。这要求使用者要较为熟练高等代数的内容。
向量化编程更快同样是因为MATLAB矩阵运算已经做了多核多线程的优化,
例如:计算不同 xxx 下多项式的值的和:
对于 P(x)=1+2x+3x2+4x3+5x4+6x5P(x)=1+2x+3x^2+4x^3+5x^4+6x^5P(x)=1+2x+3x2+4x3+5x4+6x5
当 x=1,2,3,..,50x=1,2,3,..,50x=1,2,3,..,50 时,所有P(x)的和P(x)的和P(x)的和 ?

tic% 循环计算;s = 0;for i=1:50p = 1 + 2*i + 3*i^2 + 4*i^3 + 5*i^4 + 6*i^5;s = s + p;end
toc

计算时间:

tic% 向量化编程;i = 1:50';x = [i^0 i^1 i^2 i^3 i^4 i^5];s = sum(x*[1 2 3 4 5]');
toc

计算时间:

矩阵运算中,MATLAB要要求参与的数组应具有相同的大小。

  • 如果数组大小不一致,采用 repmat() 或者 repelem() 将尺寸一致化。
  • 如果矩阵维度不一致,则用 reshape() 将尺寸一致化。
  • repmat()repelem()reshape() 计算开销、内存开销大。bsxfun()cellfun()arrayfun()

例如在深度学习工具箱DeepLearnToolbox的卷积神经网络(Convolutional Neural Network, CNN)中,训练数据进行归一化的代码为:

funtion x = normalize(x, mu, sigma)x = bsxfun(@minux, x, mu);x = bsxfun(@rdivide, x, sigma);
end

计算softmax()函数的代码为:

funtion mu = softmax(eta)tmp = exp(3 * eta);denom = sum(tmp, 2);mu = bsxfun(@rdivide, tmp, denom);
end

matlab程序加速与优化(系统全面)相关推荐

  1. matlab程序加速与优化

    其实自己写matlab也有两年多时间了,虽然基本都能做到随用随会,满足基本所有的功能需求.但是作为一个通用计算平台,matlab其实有很多特定用途的工具箱,以及加速运算的小技巧,不同于一些语法或者函数 ...

  2. matlab 动态优化,基于Matlab的测控系统动态性能优化与仿真

    随着测试技术的发展,人们采用传感器测控系统的动态性能指标来表征系统性能.描述传感器的主要动态性能指标是工作频带,系统的动态性能研究的重要一步是在辨识出合适的模型结构和模型参数的基础上,根据现有的工作频 ...

  3. matlab悬置解耦优化,《基于Matlab的动力总成悬置系统解耦优化.pdf》-支持高清全文免费浏览-max文档...

    第35 卷 第2 期 噪 声 与 振 动 控 制 Vol 35 No.2 2015 年4 月 NOISE AND VIBRATION CONTROL Apr. 2015 文章编号:1006-1355( ...

  4. matlab自带的优化工具箱,MATLAB 自带优化工具箱(optimization Tool)之遗传算法简述...

    MATLAB 自带优化工具箱(optimization Tool)之遗传算法简述 MATLAB 自带优化工具箱(optimization Tool)之遗传算法简述 MATLAB 自带优化工具箱(opt ...

  5. 【MATLAB】不同优化算法整定PID控制器参数(七)—— 一阶带时延的被控对象

    [MATLAB]不同优化算法整定PID控制器参数(七)-- 一阶带时延的被控对象 [精品课设]不同优化算法整定PID控制参数 [MATLAB]不同优化算法整定PID控制器参数(七)-- 一阶带时延的被 ...

  6. 基于matlab测幅值,基于MATLAB的分析测试系统

    基于MATLAB的分析测试系统 来源:华强电子网 作者:华仔 浏览:663 时间:2016-08-10 14:18 标签: 摘要: 摘 要:介绍基于matlab的分析测试系统的结构,详细阐述了系统的工 ...

  7. 【MATLAB】FOA优化算法整定PID控制器参数(五)—— 一阶带时延的被控对象

    [MATLAB]FOA优化算法整定PID控制器参数(五)-- 一阶带时延的被控对象 目录 [MATLAB]FOA优化算法整定PID控制器参数(五)-- 一阶带时延的被控对象 1研究背景 2果蝇优化算法 ...

  8. 基于MATLAB的裂缝检测系统

    基于MATLAB的裂缝检测系统 [摘要]裂缝检测对混凝土的结构健康和结构安全保障起到了至关重要的作用.以往都是通过人工检测的方式去检测裂缝,但是人工检测裂纹的过程十分耗时费力,而且还会受到检测人员主观 ...

  9. 基于MATLAB的人脸识别系统[创新元素,界面GUI]

    第一章 绪论 本章提出了本文的研究背景及应用前景.首先阐述了人脸图像识别意义:然后介绍了人脸图像识别研究中存在的问题:接着介绍了自动人脸识别系统的一般框架构成:最后简要地介绍了本文的主要工作和章节结构 ...

最新文章

  1. jq取第一个子元素为select_jquery如何获取第一个或最后一个子元素?
  2. python 遍历目录或文件
  3. 单片机到底是不是嵌入式?
  4. 大并发下Timeout waiting for connection from pool 解决方案
  5. Bailian4107 19岁生日礼物-Birthday Gift【进制】
  6. Day8 二分-----A very hard mathematic problem
  7. JS红宝书学习记录(一)
  8. QT线程创建的两种方法
  9. base64编码解码离线工具windows,ubuntu
  10. STM32LCD液晶屏显示二值图片
  11. 启发式算法 Heuristic Algorithm
  12. 深扎实战技术 带你走进 MDCC 2016 移动开发者大会
  13. DSB算法C语言程序,单片机中使用DSB温度传感器C语言程序.doc
  14. 内存规格的解释(Unbuffered DIMM,Registered DIMM和SODIMM)
  15. 服务器系统控制台怎么打开,云服务器控制台怎么打开
  16. ubuntu安装cad快速看图linux版
  17. 软件测试的目的和原则是什么?
  18. Twitter开发者账号【推特开发者文档系列10】——API参考索引
  19. 周鸿祎产品秘笈:小版本成就大产品
  20. 线性代数(四十) : 正交补与正交投影

热门文章

  1. RTE 大会回顾 | 美团 WebRTC 电话终端工具实践
  2. Java——基本结构程序设计
  3. 刚学完python好找工作吗_《刚》字意思读音、组词解释及笔画数 - 新华字典 - 911查询...
  4. linux 如何禁用wifi,如何禁用内置 wifi并仅使用USB wifi卡?
  5. 阿里云服务器卡顿无法响应分析及解决方法
  6. Goby新一代网络安全工具
  7. php 原生sql 分页查询,Laravel框架执行原生SQL语句及使用paginate分页的方法
  8. 画完三角形再画谢尔宾斯基地毯
  9. 抖音带货什么产品都能带吗,抖音快手直播卖货技巧!
  10. 新手必须懂得什么叫OEP,以及查找的常用方式软件破解什么是oep?