三重for循环优化_MATALB中对循环操作的优化
众所周知,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中对循环操作的优化相关推荐
- oracle delete not in 优化,Oracle中的sql语句优化
1.选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表driving table)将被最先处理,在 ...
- 中小型企业开展网站关键词优化,怎样才能达到理想优化效果?
在网站优化工作中关键词才是优化过程中的头等大事,然而在搜索引擎的优化效果实际上也会受到关键词的影响,那么对于网站优化过程当中关键词的这一层面上,我们应该如何提升优化能力以达到预计中的网站优化效果呢?下 ...
- python双层for循环优化,如何优化Python中的嵌套for循环
纽比广播 如果不受内存限制,优化numpy中嵌套循环的第一步是使用广播并以矢量化的方式执行操作:import numpy as np def mb_r(forecasted_array, observ ...
- AI中pass架构设计优化
AI中pass架构设计优化 Relay 和 TVM IR,包含一系列优化passes,可提高模型的性能指标,例如平均推理,内存占用,或特定设备的功耗.有一套标准优化,及特定机器学习的优化,包括常量折叠 ...
- 机器学习:贝叶斯和优化方法_Facebook使用贝叶斯优化在机器学习模型中进行更好的实验
机器学习:贝叶斯和优化方法 I recently started a new newsletter focus on AI education. TheSequence is a no-BS( mea ...
- 逆向知识第十讲,循环在汇编中的表现形式,以及代码还原
逆向知识第十讲,循环在汇编中的表现形式,以及代码还原 一丶do While在汇编中的表现形式 1.1高级代码: #include "stdafx.h"int main(int ar ...
- synchronized 中的 4 个优化,你知道几个?
作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) synchronized 在 JDK 1.5 时性能是比较低的,然而在后续的版本中 ...
- 关于mysql的项目_项目中常用的MySQL 优化
本文我们来谈谈项目中常用的MySQL优化方法,共19条,具体如下: 一.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我 ...
- 学习中碰到的一些优化工具包和库
1.linear svm 这个工具包目前用的比较多.例如面部特征点的回归方法中,学习线性回归的权重,例如:Face Alignment at 3000 FPS中: minWt∑i=1N||△s^ti− ...
最新文章
- springmvc @responsebody json字符编码
- 2 获取对象 IDbDataAdapter 用于填充 DataSet 和更新数据源
- Linux Shell常用技巧(五)
- 拟态防御_纯素食汉堡的拟态
- linux安装虚拟环境virtualenv
- 【C++ grammar】重载、内联、变量作用域、带默认参数的函数
- 深度神经网络课程总结_了解深度神经网络如何工作(完整课程)
- 七、matplotlib的使用
- 电子计算机的应用是第四次信息技术革命,造纸术和印刷术的发明和应用第四次电报.PPT...
- python自学-分享一位小伙伴的python自学之路,走了哪些弯路?
- 视频会议受追捧,省钱又节能
- 基于R语言绘制BBC风格图表
- 利用ldirectord实现lvs后端realserver健康状态检查
- Python爬虫笔记【一】模拟用户访问之验证码清理(4)
- android相片拼板源码,实现仿微信拍照和选取相片(转自网络)
- java mocked_java – 使mocked方法返回传递给它的参数
- 货拉拉 Android 动态资源管理系统原理与实践(上)
- linux怎么下载安装软件
- 使用LaTeX的中文字体出现Package fontspec Error: The font “宋体“ cannot be found.解决方案
- 基于ThinkPHP6+Layui后台开发框架
热门文章
- 011_SpringBoot视图层技术thymeleaf-日期格式化
- 007_JavaScript关键字和保留字
- csrf防御 java_一分钟了解【CSRF攻击与防御】
- 串口屏与6050_MPU6050温度值的读取与转换及串口通信,请指导
- 算法和数据结构c语言源代码,【资料分享】 数据结构与算法全集(C源代码+详细注释)!...
- Java数据结构和算法:HashMap的实现原理
- ClassLoader工作机制
- WEB初学者简介,web入门
- VS2019调试查看变量_PL/SQL调试存储过程?看这篇就够了
- android程序db文件用什么编辑器,在 Android Studio 上调试数据库 ( SQLite )