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和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循环后优化代码的一点收获,应该还有其他的优化技巧,希望能同大家共同交流进步!
一,采用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循环优化
- 请教嵌套for循环对比优化方法
- Matlab的for循环优化
- Matlab中统计矩阵中相同元素的个数的方法
- JavaScript--for循环和获取元素的第二种方法
- MATLAB中,可以用于计算数组或者矩阵元素总个数的方法
- 在Matlab中,想要将两个字符串连接在一起,有以下的方法: 假定有两个字符串 >> str1='Iloveyou';str2='123'; 方法一:用中括号将str1和str2像矩阵元素一样包含起来
- Matlab中统计矩阵中相同元素的个数的方法
- Matlab如何把for循环的结果以矩阵的形式显示
- matlab 矩阵元素表示方法转换 A(a) to A(x,y)
- 网站性能优化实践-for循环中的数据库操作
- 关于Matlab中矩阵元素的表示方法 .
- 关于Matlab中矩阵元素的表示方法
- 使用Javascript操作DOM的一些方法--元素的访问/复制等
- matlab如何统计矩阵各元素的出现次数
- 对FOR循环优化心得
- 程序碎片- 矩阵乘法优化(dp,循环)
- JavaScript性能优化之循环操作
- STL:循环删除容器中元素的方法和陷阱
- php for 循环语句使用方法详细说明