避免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,在系统引导过程中启动的进程 ...
随机推荐
- One Person Game(zoj3593+扩展欧几里德)
One Person Game Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submit Status ...
- canvas处理压缩照片并回显:https://cengjingdeshuige.oss-cn-beijing.aliyuncs.com/20180512/cannovs%E5%AD%A6%E4%B9%A0.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js keyup、keypress和keydown事件
js keyup.keypress和keydown事件都是有关于键盘的事件 当一个按键被pressed 或released在每一个现代浏览器中,都可能有三种客户端事件. keydown event k ...
- PyCharm 添加签名和时间
工具栏上添加上 Toolbar 点击 Editor -> File and Code Templates -> Python Script 在文本框上填写需要的数据
- 深入研究HTML5实现图片压缩上传
上篇文章中提到移动端上传图片,我们知道现在流量还是挺贵的,手机的像素是越来越高,拍个照动不动就是好几M,伤不起.虽然客户端可以轻轻松松实现图片压缩再上传,但是我们的应用还可能在浏览器里面打开,怎么办呢 ...
- vue.js 键盘enter事件的使用
在监听键盘事件时,我们经常需要检查常见的键值.Vue 允许为 v-on 在监听键盘事件时添加按键修饰符: <!-- 只有在 `keyCode` 是 13 时调用 `vm.submit()` -- ...
- TUM数据集rgbd_benchmark工具的使用方法
# 在学习视觉slam过程中,需要对数据集合进行预处理和对slam或者跟踪结果进行评价,TUM提供一组这样的工具,为了自己以后方便查找,于是把它记录下来 一.RGBD_Benchmark工具下载链接: ...
- 【BI学习笔记】在Linux上安装Wyn Enterprise商业智能报表服务器
在百度文库上找来的,放到这里,避免以后丢了. 葡萄城出品的Wyn Enterprise商业智能软件的设计器和查看视图是通过浏览器使用的,不需要安装专门的程序.Wyn Enterprise的服务器端可以 ...
- 自定义控件详解(五):onMeasure()、onLayout()
前言: 自定义控件的三大方法: 测量: onMeasure(): 测量自己的大小,为正式布局提供建议 布局: onLayout(): 使用layout()函数对所有子控件布局 绘制: onDraw() ...
- Access删除某一字段重复的数据但是要保留一条
如下图所示,Checktime这个字段有很多重复数据,我需要把所有Checktime这个字段重复的都删掉,但是还需要保留一条: 在Access做删除查询怎么做呀,来个Access高手,复制粘贴党请手下 ...