您的位置:首页 > 编程语言 > MATLAB

MATLAB中对矩阵元素操作的for循环优化方法

2015-01-19 22:08 936 查看
           众所周知,MATLAB程序效率最低最有潜力的地方便是循环了。最常见的循环莫过于对矩阵中的每一个元素进行操作,对于编程思维还在C语言或者C++,JAVA的人来说,第一反应就是两层循环,先来个 “for i=1:m”对矩阵的行进行循环,再来个“for j=1:n”对矩阵的列进行循环。 所以我前面就直接写出了一个四重for循环,被自己蠢哭了!程序时间长到压根没法等。其实自己知道这四重循环是可以优化的,但一直没专门研究过MATLAB循环优化的问题,既然碰到了,也就专门考虑了下这个问题。下面有两种对于矩阵元素操作for循环的优化方法。

           一,采用meshgrid函数。

      大家都知道采用向量化或者矩阵化运算来代替循环是MATLAB里最好的最有效率的优化方法。这里对于2*3大小的矩阵A的元素进行操作,就可以采用meshgrid函数对for循环进行矩阵化替代。对于

i=1:2;
j=1:3;可以替代为
[m,n]=meshgrid(i , j);
m=[ 1   1  1
2   2  2 ]
n=[1  2  3
1  2  3 ]


可以看到这里,生成的矩阵m和n的规模大小是相等的,都是2*3 。

A(m(1,1),n(1,1))=A(1,1)  A(m(2,2),n(2,2))=A(2,2)

A(m(2,1),n(2,1))=A(2,1)   A(m(2,3),n(2,3))=A(2,3)  

    大家发现规律没,m,n其实就是矩阵A的下角标行和列的索引。例如:求函数f(x,y)=x^2+y^3,x=1:256,y=257:512,

优化后的代码:

x=1:256;

y=257:512;

[m,n]=meshgrid(x,y);

f=m.^2+n.^3;

完全没有用到for循环,采用矩阵化运算,速度大幅度提高。

    二,通过求余优化

        在电脑内存里,矩阵作为二维向量,其实也是当成一维矩阵存放的。假设A为3*4的矩阵,即A(2,3)=A(7)。所以,也可以把二维矩阵当成一位向量来看。我们可以把一维矩阵A(k)通过求余的方法得到这个元素才二维矩阵里对应的行i和列j。
       同样采用A(2,3)=A(7)的例子,(7-1)/4+1,再向下取整得到2,(7-1)mod(4)+1=3 ,从而得到了A(7)元素在二维矩阵中对应的下标位置(2,3)。

例如,对于大小为m*n的矩阵A,计算B(i,j)=A(i,j)+i+j后的矩阵B,具体程序实现:

for k=1:m*n

     row=floor(k-1,n)+1;

     col=mod(k-1,n)+1;

     B(k)=A(k)+row+col;

end

     这样就把两层for循环优化成了一层,虽然计算量并没有减少多少,但可以这样可以开MATLAB的并行运算了,照样可以大幅度提高运算速度,因为parfor是不支持两层两层以上的循环的,所以这种优化是有意义的。并且在适合的情况下,也可以进一步把for k=1:m*n循环改成向量化运算k=1:m*n,一层循环都不用。

    以上就是我前面在碰到四重for循环后优化代码的一点收获,应该还有其他的优化技巧,希望能同大家共同交流进步!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MATLAB 循环 优化 f