众所周知,MATLAB程序效率最低最有潜力的地方便是循环了。最常见的循环莫过于对矩阵中的每一个元素进行操作,对于编程思维还在C语言或者C++,JAVA的人来说,第一反应就是两层循环,先来个 “for i=1:m”对矩阵的行进行循环,再来个“for j=1:n”对矩阵的列进行循环。所以我前面就直接写出了一个四重for循环,被自己蠢哭了!程序时间长到压根没法等。其实自己知道这四重循环是可以优化的,但一直没专门研究过MATLAB循环优化的问题,既然碰到了,也就专门考虑了下这个问题。下面有两种对于矩阵元素操作for循环的优化方法。

一,采用meshgrid函数。

大家都知道采用向量化或者矩阵化运算来代替循环是MATLAB里最好的最有效率的优化方法。这里对于2*3大小的矩阵A的元素进行操作,就可以采用meshgrid函数对for循环进行矩阵化替代。对于

i=1:2;

j=1:3;

可以替代为

[m,n]=meshgrid(i , j);
m=[ 1   1  1  2   2  2 ]
n=[1  2  31  2  3 ]

可以看到这里,生成的矩阵m和n的规模大小是相等的,都是2*3 。

A(m(1,1),n(1,1))=A(1,1)  A(m(2,2),n(2,2))=A(2,2)

A(m(2,1),n(2,1))=A(2,1)   A(m(2,3),n(2,3))=A(2,3)

大家发现规律没,m,n其实就是矩阵A的下角标行和列的索引。例如:求函数f(x,y)=x^2+y^3,x=1:256,y=257:512,

优化后的代码:

x=1:256;

y=257:512;

[m,n]=meshgrid(x,y);

f=m.^2+n.^3;

完全没有用到for循环,采用矩阵化运算,速度大幅度提高。

二,通过求余优化

在电脑内存里,矩阵作为二维向量,其实也是当成一维矩阵存放的。假设A为3*4的矩阵,即A(2,3)=A(7)。所以,也可以把二维矩阵当成一位向量来看。我们可以把一维矩阵A(k)通过求余的方法得到这个元素才二维矩阵里对应的行i和列j。

同样采用A(2,3)=A(7)的例子,(7-1)/4+1,再向下取整得到2,(7-1)mod(4)+1=3 ,从而得到了A(7)元素在二维矩阵中对应的下标位置(2,3)。

例如,对于大小为m*n的矩阵A,计算B(i,j)=A(i,j)+i+j后的矩阵B,具体程序实现:

for k=1:m*n

row=floor(k-1,n)+1;

col=mod(k-1,n)+1;

B(k)=A(k)+row+col;

end

这样就把两层for循环优化成了一层,虽然计算量并没有减少多少,但可以这样可以开MATLAB的并行运算了,照样可以大幅度提高运算速度,因为parfor是不支持两层两层以上的循环的,所以这种优化是有意义的。并且在适合的情况下,也可以进一步把for k=1:m*n循环改成向量化运算k=1:m*n,一层循环都不用。

总结:

1)用矢量运算代替循环,可以极大提升运算效率

2)在不可避免使用多重循环过程中,内外循环次数的设置和列优先是存在一个平衡点的。当内外循环次数相差较大,用内重外轻的设计方案可以有效地提升程序的运行效率,而此时的列访问的优势正在失去;当内外循环次数相差不大时,此时列访问的运算效率上的提升更加明显!

三重for循环优化_MATALB中对循环操作的优化相关推荐

  1. oracle delete not in 优化,Oracle中的sql语句优化

    1.选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表driving table)将被最先处理,在 ...

  2. 中小型企业开展网站关键词优化,怎样才能达到理想优化效果?

    在网站优化工作中关键词才是优化过程中的头等大事,然而在搜索引擎的优化效果实际上也会受到关键词的影响,那么对于网站优化过程当中关键词的这一层面上,我们应该如何提升优化能力以达到预计中的网站优化效果呢?下 ...

  3. python双层for循环优化,如何优化Python中的嵌套for循环

    纽比广播 如果不受内存限制,优化numpy中嵌套循环的第一步是使用广播并以矢量化的方式执行操作:import numpy as np def mb_r(forecasted_array, observ ...

  4. AI中pass架构设计优化

    AI中pass架构设计优化 Relay 和 TVM IR,包含一系列优化passes,可提高模型的性能指标,例如平均推理,内存占用,或特定设备的功耗.有一套标准优化,及特定机器学习的优化,包括常量折叠 ...

  5. 机器学习:贝叶斯和优化方法_Facebook使用贝叶斯优化在机器学习模型中进行更好的实验

    机器学习:贝叶斯和优化方法 I recently started a new newsletter focus on AI education. TheSequence is a no-BS( mea ...

  6. 逆向知识第十讲,循环在汇编中的表现形式,以及代码还原

    逆向知识第十讲,循环在汇编中的表现形式,以及代码还原 一丶do While在汇编中的表现形式 1.1高级代码: #include "stdafx.h"int main(int ar ...

  7. synchronized 中的 4 个优化,你知道几个?

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) synchronized 在 JDK 1.5 时性能是比较低的,然而在后续的版本中 ...

  8. 关于mysql的项目_项目中常用的MySQL 优化

    本文我们来谈谈项目中常用的MySQL优化方法,共19条,具体如下: 一.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我 ...

  9. 学习中碰到的一些优化工具包和库

    1.linear svm 这个工具包目前用的比较多.例如面部特征点的回归方法中,学习线性回归的权重,例如:Face Alignment at 3000 FPS中: minWt∑i=1N||△s^ti− ...

最新文章

  1. springmvc @responsebody json字符编码
  2. 2 获取对象 IDbDataAdapter 用于填充 DataSet 和更新数据源
  3. Linux Shell常用技巧(五)
  4. 拟态防御_纯素食汉堡的拟态
  5. linux安装虚拟环境virtualenv
  6. 【C++ grammar】重载、内联、变量作用域、带默认参数的函数
  7. 深度神经网络课程总结_了解深度神经网络如何工作(完整课程)
  8. 七、matplotlib的使用
  9. 电子计算机的应用是第四次信息技术革命,造纸术和印刷术的发明和应用第四次电报.PPT...
  10. python自学-分享一位小伙伴的python自学之路,走了哪些弯路?
  11. 视频会议受追捧,省钱又节能
  12. 基于R语言绘制BBC风格图表
  13. 利用ldirectord实现lvs后端realserver健康状态检查
  14. Python爬虫笔记【一】模拟用户访问之验证码清理(4)
  15. android相片拼板源码,实现仿微信拍照和选取相片(转自网络)
  16. java mocked_java – 使mocked方法返回传递给它的参数
  17. 货拉拉 Android 动态资源管理系统原理与实践(上)
  18. linux怎么下载安装软件
  19. 使用LaTeX的中文字体出现Package fontspec Error: The font “宋体“ cannot be found.解决方案
  20. 基于ThinkPHP6+Layui后台开发框架

热门文章

  1. 011_SpringBoot视图层技术thymeleaf-日期格式化
  2. 007_JavaScript关键字和保留字
  3. csrf防御 java_一分钟了解【CSRF攻击与防御】
  4. 串口屏与6050_MPU6050温度值的读取与转换及串口通信,请指导
  5. 算法和数据结构c语言源代码,【资料分享】 数据结构与算法全集(C源代码+详细注释)!...
  6. Java数据结构和算法:HashMap的实现原理
  7. ClassLoader工作机制
  8. WEB初学者简介,web入门
  9. VS2019调试查看变量_PL/SQL调试存储过程?看这篇就够了
  10. android程序db文件用什么编辑器,在 Android Studio 上调试数据库 ( SQLite )