• 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

  • 相关阅读:
    关于本Blog无法进行评论问题的说明
    Apusic Operamasks例子部署过程
    JVM启动参数(转)
    20070724中间件产品培训方式总结
    写Blog的意义
    磁碟機讀取光碟片時遇故障7/9
    .aspx沒有語言擴充功能8/14
    水晶報表公式的dateadd及cstr應用7/11
    中毒了:Trojar6/26
    學位英語考試通過啦8/28
  • 原文地址:https://www.cnblogs.com/zhaoyu1995/p/5042580.html
Copyright © 2020-2023  润新知