避免for循环
http://www.360doc.com/content/10/0610/22/1217721_32411251.shtml
- 避免使用for循环:
在Matlab中,for循环运算效率非常低,因为Matlab是一种解释语言。像矩阵乘法的宏操作与诸如增加标号的微操作差不多一样快,因为代码解释的顶层都存在于这两个情形之中。for循环应该只用于做最后的手段,并且一般用于控制运算,而不是由于计算的原因。
一般的Matlab程序中,90%的for循环都可以用等效但更为快速的向量代码代替。(一般为寻找替代函数或使用
技巧)例如,求和运算就可以使用sum函数,也可以通过将该向量乘以所有元素都为1的列向量来求得。
- 向量化
转换一个for循环矩阵向量的操作过程可以称为向量化。有时向量化看上去似乎十分低效,因为可能它做了比
for循环更多的计算。然而,向量化后的程序运行速度要快得多,因为重复应用到这个向量的是一个简单运算。
1) 重复行与列经常需要从头至尾重复一个或多个数值来构建矩阵。如果矩阵所有的数值都要相同,则可以使用像ones和zeros这样的函数。但是假设有一个行向量x,并且要产生一个10行的矩阵,其每一行都是x的复制。这里应避免使用循环,而是使用外积矩阵乘法操作。
X = ones(10,1)*x
2) 向量逻辑操作
程序运行速率慢的一个地方是条件语句。表面上看,条件检验无法进行向量化,但实际上,在Matlab中,如大于、等于这些比较函数都能够在向量或矩阵上运算。这样,下面的Matlab代码
[1 2 3 4 5 6] < 4
将返回结果[1 1 1 0 0 0],其中0代表假,1代表真。由后面产生一个冲激信号向量的技巧给出另一个简单例
子:
nn = [-20:80];
impulse = (nn==0); stem(nn,impulse);
3) Clip函数向量化
Clip函数用来以给定的上限和下限剪切一个输入信号。用常用的语句编写的代码如下:
function y = clip(x,lo,hi)
%Clip --- threshold large and small elements in matrix x
%======>slowest possible version <========= [M,N] = size(x);
for m = 1:M for n = 1:N if x(m,n) > hi x(m,n) = hi;
elseif x(m,n) < lo x(m,n) = lo; end,end,end
y = x;
上面代码具有双重嵌套的for循环,用于经过矩阵所有的元素。为得到速度较快的版本,必须完全放弃该循环而利用逻辑操作的向量性质。进一步,我们可以利用:true和false具有1和0的数值作为屏蔽,例如上述代码可以改写如下:
function y = clip(x,lo,hi)
%=========>fast version<=========
%(uses matrix logicals to replace loops) y = (x .* [x<=hi]) + (hi .* [x>hi]);
y = (y .* [x>=10]) + (lo .* [x<lo]);
如果使用上面的方法,算术运算的次数大于第一个版本。(可以使用etime和flops函数对这两个版本的函数进行计时)。即使是产生第二个版本需要进行10倍次数的大量计算的情形,第二个版本仍运行得比第一个版本快上10 倍。
4)“:”算子
“:”符号可以通过给出起始序号、步长以及结尾序号来产生标号范围。因此,规则相间的整数(或实数)向量可经由下式得到
iii = start:skip:end
另外,“:”可以与矩阵结合起来操作,对矩阵A,A(2:5,1:3)分出一个4*3的子矩阵。而A(:)产生一个列向量,该向量正是A的连接在一起的列。矩阵A的更一般的“再成形”可以用reshape(A,M,N)函数实现。
5)经常使用help指令来查询函数的帮助信息,而用type指令查看函数内容
避免for循环的更多相关文章
- 【.net 深呼吸】细说CodeDom(8):分支与循环
有人会问,为啥 CodeDom 不会生成 switch 语句,为啥没生成 while 语句之类.要注意,CodeDom只关心代码逻辑,而不是语法,语法是给写代码的人用的.如果用.net的“反编译”工具 ...
- Recurrent Neural Network系列1--RNN(循环神经网络)概述
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...
- Python学习--04条件控制与循环结构
Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...
- 模仿Linux内核kfifo实现的循环缓存
想实现个循环缓冲区(Circular Buffer),搜了些资料多数是基于循环队列的实现方式.使用一个变量存放缓冲区中的数据长度或者空出来一个空间来判断缓冲区是否满了.偶然间看到分析Linux内核的循 ...
- 【JS基础】循环
for 循环的语法: for (语句 1; 语句 2; 语句 3) { 被执行的代码块 } 语句 1 在循环(代码块)开始前执行 语句 2 定义运行循环(代码块)的条件 语句 3 在循环(代码块)已被 ...
- 【python之路4】循环语句之while
1.while 循环语句 #!/usr/bin/env python # -*- coding:utf-8 -*- import time bol = True while bol: print '1 ...
- To Java程序员:切勿用普通for循环遍历LinkedList
ArrayList与LinkedList的普通for循环遍历 对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法: p ...
- JavaScript单线程和浏览器事件循环简述
JavaScript单线程 在上篇博客<Promise的前世今生和妙用技巧>的开篇中,我们曾简述了JavaScript的单线程机制和浏览器的事件模型.应很多网友的回复,在这篇文章中将继续展 ...
- .NET基础 一步步 一幕幕[循环、逻辑语句块]
循环.逻辑语句块 好久不写博客了,断更了好几天了,从上周五到今天,从北京到上海,跨越了1213.0公里,从一个熟悉的城市到陌生的城市,还好本人适应力比较好,还有感谢小伙伴的接风咯,一切都不是事,好 ...
- Linux进程管理及while循环
目录 进程的相关概念 进程查看及管理工具的使用 Linux系统作业控制 调整进程优先级 网络客户端工具 bash之while循环 20.1.进程类型 守护进程 daemon,在系统引导过程中启动的进程 ...
随机推荐
- 【Spring】1、Spring 中的监听器 Listener
一.接口 1.EventListener 2.HttpSessionAttributeListener 继承EventListener接口 HttpSessionAttributeListener ...
- springboot整合freemarker----一点小小的错误
最近小弟正在学习springboot,没办法,现在微服务太火了.小弟也要顺应时代的潮流啊 :( 好了,废话不多说了!!!! 首先在springboot的pom.xml添加freemarker的依赖 & ...
- 微信跳一跳Python辅助无需配置一键操作
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/8350329.html 邮箱:moyi@moyib ...
- API输出的时候是return还是echo?
写php API写的很少,最近才开始接口的写法,在框架里面一直用return,但是在api中retrun就失效了,为什么呢? 网友给出的答案: 1. return 一般用于函数或方法的返回. echo ...
- 浏览器兼容性问题——IE不支持却很实用的CSS属性Outline和Child
1. Outline(适用范围:鼠标悬浮hover加外边框) 我们在布局的时候,常常会因为添加边框border影响宽高的布局. 那么,outline是完美的替代品,因为它可以在不影响文档流的情况下呈现 ...
- CO配置步骤清单 - 2004
SAP配置步骤清单 SAP版本:2004 模块:CO(CCA/CEA/PCA) Note:大洋电机的SAP版本和此文档版本不同,少数配置路径有所变化,请参考使用. No. 配置对象 事务代码 配置内容 ...
- Ado.net 访问Oracle乱码问题
之前安装Oracle - OraClient10g_home1客户端,用Ado.net访问没有问题,后来安装ODP之后,自动的又安装了Oracle - OraClient12Home1,之后就出现乱码 ...
- wap2app(六)-- wap2app的原生标题头无法隐藏
大概有一个星期没有用HBuilder打包,今天更新了HBuilder版本再继续打包,就出现了一系列问题.其中有一个就是打包之后,除首页外,其他页面多出了原生标题,如下图: 查阅资料,打开 sitema ...
- 9.4、__del__、__doc__、__dict__、__module__、__getitem__、__setitem__、__delitem__、__str__、__repr__、__call__
相关内容: __del__.__doc__.__dict__.__module__.__getitem__.__setitem__.__delitem__.__str__.__repr__.__cal ...
- Cache 和 Buffer 都是缓存,主要区别是什么?【转】
作者:Towser 链接:https://www.zhihu.com/question/26190832/answer/32387918 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商 ...