避免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,在系统引导过程中启动的进程 ...
随机推荐
- CentOS6.5安装mysql以及常见问题的解决
前言 最近在学习Linux系统,今天在安装MySQL数据库时出现很多问题,花费了两个小时终于解决,故记录下来以供大家参考.(本人目前还在学习阶段,下面写到的是自己结合网上查到的资料以及各位前辈给出的解 ...
- 【开发工具之eclipse】7、eclipse代码自动提示,eclipse设置代码自动提示
首先打开Eclipse开发软件,然后在工具栏的[Window],点击后找到弹出列表中的[Preferences]选项,然后点击这个选项 现在弹出的窗口就是JAVA开发人员常见的设置窗口了,我们依次 ...
- userDefineFunc.js
var scareMe = function(){ console.log("cynthia") scareMe = function(){ console.log("w ...
- Docker 轻量级图形管理软件 Portainer
安装 docker swarm :https://www.cnblogs.com/klvchen/p/9437758.html portainer 集群启动 docker volume create ...
- Spark 跑 java 示例代码
一.下载示例代码: git clone https://github.com/melphi/spark-examples.git 从示例代码中可以看到 pox中引入了 Spark开发所需要的依赖. 二 ...
- 洛谷P3193 [HNOI2008]GT考试(dp 矩阵乘法)
题意 题目链接 Sol 设\(f[i][j]\)表示枚举到位置串的第i位,当前与未知串的第j位匹配,那么我们只要保证在转移的时候永远不会匹配即可 预处理出已知串的每个位置加上某个字符后能转移到的位置, ...
- ajax小知识
1.ajax发送get请求时,需要注意如下情况: var uri="http://127.0.0.1:8071/springmvcdemo/bigdataapi/publishdata&qu ...
- 【读书笔记】iOS-流式音频与Pandora Radio之路
复杂性是不可避免的,而且只会随时间增长,所以在增加特性时一定要为重构和代码简化留出时间.真正遇到问题这前先不要担心性能.iPhone非常强壮,你可能永远也不会遇到预想的性能问题. 能过互联网向一个设备 ...
- 安全测试 一次关于WEB的URL安全测试
一次关于WEB的URL安全测试 by:授客 QQ:1033553122 测试思路: 时间精力问题,对web安全这块也没咋深入研究,但因为某个小插曲,公司要求先做个简单的安全测试,主要是针对UR ...
- 安卓开发_深入理解Handler消息传递机制
一.概述 因为子线程的run()方法无法修改UI线程(主线程)的UI界面,所以Android引入了Handler消息传递机制,实现在新创建的线程中操作UI界面 二.消息类(Message) 消息类是存 ...