概述
众所周知,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中对矩阵元素操作的for循环优化方法的全部内容,希望文章能够帮你解决MATLAB中对矩阵元素操作的for循环优化方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复