BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / matlab / #10790同步于 2014/4/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Matlab机器人发帖

自己的程序运行时间太长,求大牛指导下,是啥原因

xbsky2013
2014/4/12镜像同步6 回复
用matlab做如下运算,比如说有一个数组,大小为50000*30.(array[50000,30]) 我要进行如下运算,将每一行的1,2列平方相加,3,4列平方相加,...29,30列平方相加。 如果我这样写: for ii = 1 : 50000 for jj = 1 : 15 a(jj) = array(ii,2 * jj - 1)^2 + array(ii,2 * jj)^2; end end 粗略估计,大概5s能搞定。 但是,由于我可能要先进行列上的累加操作,比如说,先将第1至10行的第1列的10个数累加起来,得到一个值,第2列的10个数累加起来,得到一个值,然后平方相加得到a(1),剩下的a(2),a(3)...a(15),也是这样。 所以我这个渣渣就设计如下的渣渣程序: for ii = 1 : X %% X可变,如果不累加,即每行上的两个数平方相加的话则X = 50000 for jj = 1 : 15 %%如果是累加,比如累加10行,则X = 5000 Array(ii,2 * jj - 1) = 0; Array(ii,2 * jj) = 0; for sum = 1 : M + 1 %% M可变,如果不累加,则M=0,累加10行,则M=9 Array(ii,2 * jj - 1) = array(sum + (ii - 1) * (M + 1),2 * jj - 1) + Array(ii,2 * jj - 1); Array(ii,2 * jj ) = array(sum + (ii - 1) * (M + 1),2 * jj ) + Array(ii,2 * jj ); end end for kk = 1 : 15 a(kk) = Array(ii,2 * jj - 1)^2 + Array(ii,2 * jj)^2 end end %%Array相当于是因为要累加,我重新赋值的一个数组 此时问题就来了,当我此时不累加,即M=0时,随着X的增大,运行时间非线性增大。 比如说,X = 2000时,要4s X = 20000时,需要50s。 X= 50000时,需要5min. 但我上面单独写的不累加的程序只要5s啊。这是啥原因呢? 我自己也查了一下,问题也应该就是给Array累加赋值的地方,但是也不至于慢这么多吧。 这如何解释呢。。。? 求大牛们指导。。。
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
dannian机器人#1 · 2014/4/12
话说楼主代码里面的一些变量是不是在运行的时候会自动变大?也就是一种用来存储结果的矩阵会随着代码的运行而增加尺寸? 【 在 xbsky2013 (土豆王子) 的大作中提到: 】 : 用matlab做如下运算,比如说有一个数组,大小为50000*30.(array[50000,30]) : 我要进行如下运算,将每一行的1,2列平方相加,3,4列平方相加,...29,30列平方相加。 : 如果我这样写: for ii = 1 : 50000 : ...................
xbsky2013机器人#2 · 2014/4/12
我听我同学说,只要某个数组变量,的下面划了小红线,就说明这个数组可能变大。。?但我给它赋了初值啊,那它的大小不应该不变么。。。?咋还有小红线呢?有几个变量的下面有小红线,就那个Array下面就有 【 在 dannian 的大作中提到: 】 : 话说楼主代码里面的一些变量是不是在运行的时候会自动变大?也就是一种用来存储结果的矩阵会随着代码的运行而增加尺寸?
z2642x机器人#3 · 2014/4/12
1.matlab的优势在于矩阵运算 能不用for循环就不用for循环 不要像其他语言那样写for循环 所以 一上来的例子应该这么写 a = array(:, 1:2:end).^2 + array(:, 2:2:end).^2; 2.所有的数组尽量的提前分配好空间, 而不是像list之类的容器一样一个一个往里面添, 这样可以极大的减少运行时间 你写的第一个例子中 如果提前分配好了a的空间再进行for循环 比如 a = zeros(50000, 15); for ii = 1 : 50000 for jj = 1 : 15 a(ii, jj) = array(ii,2 * jj - 1)^2 + array(ii,2 * jj)^2; end end (觉得你的代码和你的描述有点不符, 就把a(jj)改成a(ii, jj)了, 这样得到的就是奇数列与偶数列的平方和矩阵) 这样分配完再循环你可以感受一下, 绝对用不了5s. 3.尽量使用matlab自带的功能函数, 你说的求和, 直接用sum就可以解决了. tmp = sum(Array); a = Array(:, 1:2:end).^2 + array(:, 2:2:end).^2; 这两句就完成了对Array的所有列向量求和然后再奇偶列平方和的运算...
xbsky2013机器人#4 · 2014/4/12
大牛。。。。谢谢你哈,。。。 【 在 z2642x 的大作中提到: 】 : 1.matlab的优势在于矩阵运算 能不用for循环就不用for循环 不要像其他语言那样写for循环 : 所以 一上来的例子应该这么写 : a = array(:, 1:2:end).^2 + array(:, 2:2:end).^2; : ................... [ema23]
dannian机器人#5 · 2014/4/13
小红线是说明这个变量在运行的时候大小会改变 所以我猜测你的代码里面大部分时间都用在寻找一片合适大小的内存 最好就是一开始就给这个变量定义一个足够大的尺寸,速度快很多 【 在 xbsky2013 (土豆王子) 的大作中提到: 】 : 我听我同学说,只要某个数组变量,的下面划了小红线,就说明这个数组可能变大。。?但我给它赋了初值啊,那它的大小不应该不变么。。。?咋还有小红线呢?有几个变量的下面有小红线,就那个Array下面就有
dannian机器人#6 · 2014/4/13
嗯。。我觉得主要原因还是第二点 以前我也试过,没有预分配空间跑了四个小时没结束,后来改进了一下先给分配空间了,半个小时就完成了 【 在 z2642x (zx) 的大作中提到: 】 : 1.matlab的优势在于矩阵运算 能不用for循环就不用for循环 不要像其他语言那样写for循环 : 所以 一上来的例子应该这么写 : a = array(:, 1:2:end).^2 + array(:, 2:2:end).^2; : ...................