完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
向量化操作
这个应该是用过Matlab的同学都清楚的一点,Matlab中操作向量和矩阵的速度要比使用for循环的速度快很多,是因为其底层调用了高性能线性代数库BLAS库和LAPACK库。这个就不多说了。 |
|
|
|
向量化操作
这个应该是用过Matlab的同学都清楚的一点,Matlab中操作向量和矩阵的速度要比使用for循环的速度快很多,是因为其底层调用了高性能线性代数库BLAS库和LAPACK库。这个就不多说了。 |
|
|
|
mtx = []; 然后后面再给它加入一些数据,而且这个矩阵大小可以随着我们填入数据的多少而变化。像下面这个程序 tic n = 1000; mtrx = []; init = 1.0; for i = 1:n for j=1:n mtrx(i,j) = init + 1.0; end end toc 这个程序的运行时间是多久呢?在我电脑上是0.2秒。 那这个程序有什么问题呢?就是我们没有为这个矩阵分配一个内存空间,而且在循环中,矩阵大小是变化的,这就导致每次循环时都浪费额外的时间去寻找满足需求的内存空间,将改变大小后的矩阵整体移动到这个新的内容空间中,并释放原来的内存空间,这除了会影响代码的运行效率,还容易形成内存碎片,让程序越来越难找到满足条件的内存。 因此在循环前给矩阵预分配内存是很一个良好的习惯,如果没有这个习惯,你还可以通过Matlab自带的代码检查器来查看是否存在类似问题。 所以,我们应该把程序修改如下: tic n = 1000; mtrx = zeros(n,n); init = 1.0; for i = 1:n for j=1:n mtrx(i,j) = init + 1.0; end end toc 这个程序只用了0.007秒的时间就运行完成了,可见它们的差距有多大。 |
|
|
|
n = 10000; mtrx = rand(n,n); mcol = zeros(n,1); mrow = zeros(1,n); tic for i=1:n mcol(i) = sum(mtrx(:,i)); end toc 我们对矩阵中的每一列都求和,总共用了0.17秒。 tic for i=1:n mrow(i) = sum(mtrx(i,:)); end toc 再对矩阵中的每一行求和,用了0.8秒。 可以看出,对列操作比对行操作速度要快很多。 |
|
|
|
高效编程的内容就先写这么多,后面还会继续补充。下面说一个Matlab调试中断点设置问题。在一个for循环中,比如for i=1:n,我们想在i=100的进入断点,这个时候应该怎么用?以前的时候我们都会这么写 for i=1:n if(i==100) pass end end 把断点设置在pass处,但其实不用这么弄。Matlab中提供了条件断点的设置方式。在循环中右键选择设置条件断点,如下图所示。 Figure 1. 条件断点设置1 在下面的窗口中填入条件即可,比如i==100。 Figure 2. 条件断点设置2 这样,当程序运行到i==100时就会进入断点,不需要自己再写额外的语句。 |
|
|
|
只有小组成员才能发言,加入小组>>
2413 浏览 7 评论
2820 浏览 4 评论
Spartan 3-AN时钟和VHDL让ISE合成时出现错误该怎么办?
2292 浏览 9 评论
3371 浏览 0 评论
如何在RTL或xilinx spartan fpga的约束文件中插入1.56ns延迟缓冲区?
2456 浏览 15 评论
有输入,但是LVDS_25的FPGA内部接收不到数据,为什么?
1030浏览 1评论
请问vc707的电源线是如何连接的,我这边可能出现了缺失元件的情况导致无法供电
576浏览 1评论
求一块XILINX开发板KC705,VC707,KC105和KCU1500
434浏览 1评论
1998浏览 0评论
721浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 16:02 , Processed in 2.067813 second(s), Total 85, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号