MATLAB for循环优化三例
最近一周,对MATLAB有进行了新一轮的学习,对其矩阵化编程的思维有了更深入的了解。确实精妙!
例1:
将矩阵A= [1 2 3; 2 4 3; 3 4 5]中所有的数字3替换为33.
如果还停留在C语言的思维可能就是
>> for i=1:3
for j=1:3
if A(i,j)==3
A(i,j) = 33;
end
end
end
>> A
A =
1 2 33
2 4 33
33 4 5
而MATLAB语言则有更灵活的语法,
>> A(A==3) = 33
A =
1 2 33
2 4 33
33 4 5
这句的意思就是讲matlab中等于3的数复制为33;
>> A==3
ans =
0 0 1
0 0 1
1 0 0
当在MATLAB中输入A==3
>> A==3
ans =
0 0 1
0 0 1
1 0 0
得到的是一个逻辑数组,接下来的复制操作只对逻辑为真的部分进行。显然后一种写法代码更加简洁。
例2
将A= [1 2;2 3; 3 4; 4 5]每行视为坐标;将5阶零矩阵的这四个位置复制为1;
继续常规思维,也是最正常的思维就是每个位置赋值:
>> A= [1 2;2 3; 3 4; 4 5];
B = zeros(5);
for i=1:4
B(A(i,1),A(i,2)) = 1;
end
>> B
B =
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
0 0 0 0 0
这里可以使用sub2ind这个函数,从字面意思已经知道,是将下标转换为索引值,具体原理可以help sub2ind以及type sub2ind(查看源码)
所以可以直接写成
>> A= [1 2;2 3; 3 4; 4 5];
>> B = zeros(5);
>> B(sub2ind(size(B), A(:,1), A(:,2)))=1
B =
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
0 0 0 0 0
深刻体会到矩阵处理问题的简洁之美!
例3
统计矩阵A = [1 3 4; 5 3 2; 4 2 1]中3的个数
如果还停在初学C语言的思维,恐怕又是靠for解决问题
>> A = [1 3 4; 5 3 2; 4 2 1];
>> a = 0;
>> for i=1:3
for j=1:3
if A(i,j)==3
a = a+1;
end
end
end
>> a
a =
2
这使如果知道find函数和length函数,就会轻松不少:
>> length(find(A==3))
ans =
2
总结,通过以上三个例子,可以看到:
1、学习一门新的东西,一定要把握其精髓,不要固定步自封(比如一味使用for循环)、生搬硬套;
2、就我现在体会,学习matlab最重要的是学习它丰富的函数和灵活的语法,也就是说这门语言处理运算的思维。
3、作为一个技术人员,一定要偷懒,抠门。什么是偷懒,相同的功能,能用一行代码解决绝不用两行,什么是抠门,用最简洁的思维,最快的时间、最小的内存。
4、敢想敢做,敢想:为什么不能用一行代码解决;敢做,敢于通过学习实现自己的想法。
2015-12-13
MATLAB for循环优化三例的更多相关文章
- matlab for循环的三种类型
学习了一半了,发现一个好网站,就是我想写这篇博客用的,网络真是个好东西!纪念下国庆啦 网址:http://www.yiibai.com/matlab/matlab_for_loop.html ---- ...
- MATLAB 的循环语句
1.MATLAB while循环语法 在MATLAB 中 while循环的语法如下: while <expression> <statements> end while 循环反 ...
- MATLAB粒子群优化算法(PSO)
MATLAB粒子群优化算法(PSO) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.介绍 粒子群优化算法(Particle Swarm Optim ...
- MySQL性能优化(三):索引
原文:MySQL性能优化(三):索引 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbi ...
- MATLAB中多行注释的三种方法
MATLAB中多行注释的三种方法 A. %{ 若干语句 %} B. 多行注释: 选中要注释的若干语句, 编辑器菜单Text->Comment, 或者快捷键Ctrl+R 取消注释: 选中要取消注释 ...
- MySQL优化三(InnoDB优化)
body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...
- App架构师实践指南六之性能优化三
App架构师实践指南六之性能优化三 2018年08月02日 13:57:57 nicolelili1 阅读数:190 内存性能优化1.内存机制和原理 1.1 内存管理内存时一个基础又高深的话题,从 ...
- MySQL派生表(derived)优化一例
1.什么是派生表derived 关键字:子查询–>在From后where前的子查询 mysql; +----+-------------+------------+------+-------- ...
- 用循环将三个DIV变成红色
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- document.elementFromPoint在IE8下无法稳定获取当前坐标元素的解决方法
document.elementFromPoint(e.clientX, e.clientY) document.elementFromPoint(e.clientX, e.clientY) 执行2次 ...
- InputStream复用,mark和reset
markSupported InputStream是否支持mark,默认不支持. public boolean markSupported() { return false; } InputStrea ...
- express:webpack dev-server中如何将对后端的http请求转到https的后端服务器中?
在上一篇文章(Webpack系列:在Webpack+Vue开发中如何调用tomcat的后端服务器的接口?)我们介绍了如何将对于webpack-dev-server的数据请求转发到后端服务器上,这在大部 ...
- unix环境高级编程基础知识之第四章
1.从当前用户转到root用户:直接输入su命令,然后输入root密码,如果之前没有设置root命令密码会登陆不成功,这里需要命令sudo passwd命令设置密码,然后按照上面输入就成:从root命 ...
- 记 FineUI 官方论坛所遭受的一次真实网络攻击!做一个像 ice 有道德的黑客!
在开始正文之前,请帮忙为当前 排名前 10 唯一的 .Net 开源软件 FineUI 投一票: 投票地址: https://code.csdn.net/2013OSSurvey/gitop/code ...
- 绝对干货:供个人开发者赚钱免费使用的一些好的API接口
不久前,我写了一篇文章,名为<科普技术贴:个人开发者的那些赚钱方式>,讲了一些个人开发者接私活和自己做软件加广告的一些科普知识.可是做软件,需要服务器,需要后台,对于一些小的开发者,想赚点 ...
- 用程序集编写clr表值函数:把正则表达式引入数据库中
正则表达式非常好,但在数据库中就是没有,但可以通过程序集方式扩展 先编写一个dll,标量函数很好写,表值函数麻烦一点 下面是C#代码 using System; using System.Data; ...
- 优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案
简介 本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发 ...
- 70 sudo-用来以其他身份来执行命令
sudo命令用来以其他身份来执行命令,预设的身份为root.在/etc/sudoers中设置了可执行sudo指令的用户.若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员.用户使用sudo ...
- C++的异常处理之一:throw是个一无是处的东西
看这篇文章学习C++异常处理的基础知识.看完后,还不过瘾,为什么大家在C++代码中都不用Exception?为什么C++11会引入一些变化? 为什么C++ exception handling需要un ...