这个3层循环如何提高其速度·····

jdxwind 2008-08-21 08:16:28
代码如下:
for (t = 2; t <= T; t++)
{
for (j = 1; j <= 10; j++)
{
maxval = (float)(-100000000);
for (i = 1; i <= 10; i++)
{
val = delta[t-1][i] + (A[i][j]);
if (val > maxval)
{
maxval = val;
}
}
delta[t][j] = maxval + biot[j][t];
}
}
其中delta、maxval、biot、val以及A矩阵都是float形,T的大小在100到200之间,···我想降低循环层数,可是不知道怎么拆解,请教高手帮忙分析下···多谢
...全文
216 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jdxwind 2008-08-25
  • 打赏
  • 举报
回复
T值是很大的,没办法,现在我采用的方法是在前期的操作中尽量压缩T的取值,用一些性能换速度吧。
感谢楼上诸位。
touta 2008-08-23
  • 打赏
  • 举报
回复
PC上while和for的性能不是这样看的

while翻译成汇编一般是直接的

xxx;
cmp xxx.xxx;
jxx xxx;

for在debug版本一般也是

xxx;
cmp xxx,xxx;
jxx xxx;

但非debug版本一般会做一些优化,当然未必是优化了性能,嵌套循环很有可能因而性能大降..

PS:最近极懒了,只想打字不想code.嗨嗨

LZ试试这种行不

求"A矩阵的对应列的10个值对应相加的结果中最大的一个"的循环在这个嵌套里面取出来,也即单独算出A矩阵中需要使用数据保存到一temp数组,其实没看LZ的代码是啥意思~_~说错了请无视罢!
这个循环放在嵌套里面会浪费一些时间在计算和无用功上

再一个,既然矩阵的长度已知,而矩阵长度也不是很长(delta[T][11]),可以试试把横行循环破开,在不优化算法的情况下这样也可以优化一点点时间
jdxwind 2008-08-23
  • 打赏
  • 举报
回复
感谢楼上诸位:
正如1楼所言,计算的过程是得到delta二维矩阵的值。3楼和4楼的朋友的方法中间的求取无法得到最大值的···
我尝试了将for循环改为while语句,VC6.0下的实测速度如下:
3层for循环:
Func
Time %
---------------------------------------------------
2.260 57.7 millisecond
3层while:
Func
Time %
----------------------------------------------------
0.646 23.7 millisecond
但我将代码移植到ARM上时,延时还是很明显,可能ARM编译器与VC有所不同吧,因此还是没能达到效果(PC上的开发3层循环使用while明显优啊)···

我的代码的环境大致是这样的:delta[T][11]是一个T*10的二维矩阵,循环计算之前第一行的10个值是已知的,A[11][11]是10*10的矩阵,值全部已知,biot[11][t]是10*t的矩阵,其值也是已知的,计算的目的是想得到delta矩阵最后一行的10个值中最大的一个。而delta矩阵每个元素的值是由其上一行的10个值与A矩阵的对应列的10个值对应相加的结果中最大的一个与biot的相对元素相加得到的,如delta[2][1]的值需要将delta[1][1],delta[1][2]、、delta[1][10]与A[1][1]、A[2][1]、、、A[10][1]对应相加得到的10个值中最大者与biot[1][2]相加得到。最后循环得到
过程就是这样的,不知道有没有什么方法可以克服我的3层循环的笨办法啊···
iambic 2008-08-22
  • 打赏
  • 举报
回复
实测速度如何?没数据怎么优化。
touta 2008-08-22
  • 打赏
  • 举报
回复
这样的嵌套循环的效率貌似不会因为 最多的循环安排到 里层节约运行开支罢?

性能是单独运行所需时间的乘积 ?
for1*for2*for3

若是循环里面做的计算有仅仅是本层循环使用的,最好把它放最里面,若有多层循环是这样,就要把循环数目大的放里层
自己的一点点想法,不敢确定是优化的对啊!有错误请指正

for(temp1 =2;t <= T;t++)
{
for(temp2 = 1;temp2 <= 10;temp2++)
{
float maxval=(float)(-100000000);
for(temp3 = 1;temp3 <= 10;temp++)
{
val = delt[temp1-1][temp3] + (A[temp3][temp2]);
if(val > maxval)
{
maxval = val;
}
}
delta[temp1][temp2] = maxval + biot[temp2][temp1];
}
}

若硬要优化,那个取最大值的算法可以,方法基本在每本算法书都有
最主要的是LZ这几个循环都是为了一个计算,不知这个计算是否可以分为多层分别计算?仅仅看这段代码似乎是不可以..


不清楚这段循环取得的结果有什么用,但居然需要用3层的循环,对性能影响太大了啊!
lijing_hi 2008-08-22
  • 打赏
  • 举报
回复
把次数最多的循环放到最内层可以节省部分运行开支
nwpulei 2008-08-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bitxinhai 的回复:]

maxval = (float)(-100000000);
for (t = 2; t <= T; t++)
{
for (j = 1; j <= 10; j++)
{
for (i = 1; i <= 10; i++)
{
val = delta[t-1][i] + (A[i][j]);
if (val > maxval)
{
maxval = val;
}
}
delta[t][j] = maxval + biot[j][t];
}
}
[/Quote]
会有问题的.在进入最内层循环时对maxval要赋一个足够小的一个值
bitxinhai 2008-08-22
  • 打赏
  • 举报
回复

maxval = (float)(-100000000);
for (t = 2; t <= T; t++)
{
for (j = 1; j <= 10; j++)
{
for (i = 1; i <= 10; i++)
{
val = delta[t-1][i] + (A[i][j]);
if (val > maxval)
{
maxval = val;
}
}
delta[t][j] = maxval + biot[j][t];
}
}
weiyijiji 2008-08-22
  • 打赏
  • 举报
回复
算法上的优化不知道,么细看代码,不过单从代码优化上
可以做些事
循环展开,减少循环的次数.
for (i = 1; i <= 10; i++)
{
val = delta[t-1][i] + (A[i][j]);
if (val > maxval)
{
maxval = val;
}
}
可为
for (i = 1; i <= 10; i=i+2)
{
val = delta[t-1][i] + (A[i][j]);
val = delta[t-1][i+1] + (A[i+1][j]);
if (val > maxval)
{
maxval = val;
}
}
skyandlw 2008-08-22
  • 打赏
  • 举报
回复
确实很难优化...至少我看不出来还有什么办法了
xianyuxiaoqiang 2008-08-22
  • 打赏
  • 举报
回复
for (t = 2; t <= T; t++) 
{
for (j = 1; j <= 10; j++)
{
maxval = (float)(-100000000);
for (i = 1; i <= 10; i++)
{
val = delta[t-1][i] + (A[i][j]);
if (val > maxval)
{
maxval = val;
}
}
delta[t][j] = maxval + biot[j][t];
}
}

最里层循环是为了计算最大值,次层循环是为了给delta某一行赋值,外层循环
是为了给delta每一行都赋值。
delta是二维矩阵,其赋值肯定要两重循环,delta的每个数值都是满足某种条件
的值,其计算必不可少,也要一重循环。
本题无法优化。鉴定完毕。

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧