最近一周,对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循环优化三例的更多相关文章

  1. matlab for循环的三种类型

    学习了一半了,发现一个好网站,就是我想写这篇博客用的,网络真是个好东西!纪念下国庆啦 网址:http://www.yiibai.com/matlab/matlab_for_loop.html ---- ...

  2. MATLAB中多行注释的三种方法

    MATLAB中多行注释的三种方法 A. %{ 若干语句 %} B. 多行注释: 选中要注释的若干语句, 编辑器菜单Text->Comment, 或者快捷键Ctrl+R 取消注释: 选中要取消注释 ...

  3. MySQL优化三(InnoDB优化)

    body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...

  4. MATLAB学习笔记(三)——程序设计

    (一)M文件 一.概述 1.自己的体会就是把相应的操作写成一个文本文件,这样子的话方便进行修改(记事本就行了),又可以达到封装的目的,当然我发现2014a版本的Matlab貌似已经采用的面向对象的设计 ...

  5. Android 性能优化 三 布局优化ViewStub标签的使用

    小黑与小白的故事,通过虚拟这两个人物进行一问一答的形式来共同学习ViewStub的使用 小白:Hi,小黑,ViewStub是什么?听说能够用来进行布局优化. 小黑:ViewStub 是一个隐藏的,不占 ...

  6. Mysql性能优化三(分表、增量备份、还原)

    接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ...

  7. for循环的三种写法

    第一种写法  传统的方法,遍历数组 String[] arr = { "amy", "heinrich", "cindy", "g ...

  8. MATLAB的循环结构

    循环结构有两种基本形式:while 循环和for 循环.两者之间的最大不同在于代码的重复是如何控制的.在while 循环中,代码的重复的次数是不能确定的,只要满足用户定义的条件,重复就进行下去.相对地 ...

  9. js加载优化三

    Javascript性能优化之异步加载和执行 Author:小欧2013-09-17 随着科技的发展,如今的网站和五六年前相比,现在的人们对web的要求越来越高了,用户体验,交互效果,视觉效果等等都有 ...

随机推荐

  1. Struts2+Spring+Hibernate框架整合总结详细教程

    一.SSH三大框架知识总结 Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.其全新的Struts 2的体系结构与S ...

  2. C#设计模式系列:职责链模式(Chain of Responsibility)

    1.职责链模式简介 1.1>.定义 职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求.将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对 ...

  3. Oracle的 Pfile生成

    SQL> create pfile from spfile; File created. SQL> [oracle@localhost dbs]$ ls -lrttotal 24-rw-r ...

  4. 给VMware下的Linux扩展磁盘空间(以CentOS6.3为例)转

    #查看挂载点:df -h#显示:文件系统 容量 已用 可用 已用%% 挂载点/dev/mapper/vg_dc01-lv_root 47G 12G 34G 25% /tmpfs 504M 88K 50 ...

  5. Tools - RSS

    RSS RSS是在线共享和阅读内容的一种方式,能够简洁高效地获取订阅内容的更新. 全称Really Simple Syndication (真正简易联合),也叫聚合内容. 有选择地浏览感兴趣的以及与工 ...

  6. linux下syscall函数,SYS_gettid,SYS_tgkill

    出处:http://blog.chinaunix.net/uid-28458801-id-4630215.html     linux下syscall函数,SYS_gettid,SYS_tgkill  ...

  7. Duilib实现圆形头像控件

    .h文件 #ifndef __UIHEADICON_H__ #define __UIHEADICON_H__ /* 名称:圆形头像控件(派生CButtonUI类) */ class CHeadUI: ...

  8. bug数量问题研究

    最近感觉很扯蛋的事情就是测试人员提bug的问题.先说下前提,公司测试会以提bug数量来做为一部分员工绩效的成份.再说一下公司从需求到开发 到测试,先是需求出一个文档,开发根据文档做功能的开发,然后测试 ...

  9. linux 大并发下 内核优化

     To support over 500k users, you *need* - A 64 bits hardware/kernel (AMD64, Opterons) - At least 8GB ...

  10. 高效率的全组合算法(Java版实现)

    博客上看到的一个算法,用Java实现了一个 算法描述: 算法说明:当n大于2时,n个数的全组合一共有(2^n)-1种. 当对n个元素进行全组合的时候,可以用一个n位的二进制数表示取法. 1表示在该位取 ...