viviani1 发表于 2011-6-14 09:42

急求如何缩短此程序的运行时间,双循环加if结构

程序如下,其中t(i)是结构体变量,xii,yii,zii都是有243200个分量的向量,分别代表x,y,z坐标。程序的目的是如果有同一k值的xii,yii,zii与t(i)的坐标相差在规定范围内,就用t(i)的分量代替。此程序要运行三天三夜才出结果,求高手优化一下,感激不尽(我把第二个for改成k=1:243200;速度是快了,但结果不对)
for i=1:185998
for k=1:243200
if abs(t(i).x-xii(k))<=75 & abs(t(i).y-yii(k))<=75 & abs(t(i).z-zii(k))<=40
xii(k)=t(i).nx0;
yii(k)=t(i).ny0;
zii(k)=t(i).nz0;
continue
end
end
end

ChaChing 发表于 2011-6-14 11:01

本帖最后由 ChaChing 于 2011-6-14 22:51 编辑

回复 1 # viviani1 的帖子

先看下这些帖, LZ将功力大增
1.matlab矢量化编程技巧集锦 http://forum.vibunion.com/thread-41583-1-1.html
2.[原创] 提高matlab运行速度的一点心得 http://forum.vibunion.com/thread-25305-1-1.html
[原创] 提高matlab运行速度的一点心得(之二) http://forum.vibunion.com/thread-26449-1-1.html
[原创]提高matlab运行速度和节省空间的一点心得(之三) http://forum.vibunion.com/thread-33199-1-1.html
[原创]关于Profiler的介绍和使用心得 http://forum.vibunion.com/thread-32293-1-1.html
matlab 的内存如何管理 http://forum.vibunion.com/thread-35912-1-1.html
From http://forum.vibunion.com/home-space-uid-63979-do-blog-id-18250.html

ps:有问题再提! 并期待LZ的结果分享

viviani1 发表于 2011-6-14 20:22

回复 2 # ChaChing 的帖子

谢谢你的热心解答,我直接把算法的思路修改了一下,程序如下:
for k=1:243200
=min((xii(k)-t.x).^2+(yii(k)-t.y).^2+(zii(k)-t.z).^2);
xii(k)=t(I).nx0;
yii(k)=t(I).ny0;
zii(k)=t(I).nz0;
end
其中t是结构体变量,但是运行结果出现错误,显示为??? Error using ==> minus
Too many input arguments.
t.x是1x189599的向量,不会是因为这个t.x太大了吧?

ChaChing 发表于 2011-6-14 23:50

回复 3 # viviani1 的帖子

没LZ资料, 结构体变量不常用, 随便试下
运行不会出现错误!?xii=rand(1,243200);yii=rand(1,243200);zii=rand(1,243200);
tx=rand(1,185998); ty=rand(1,185998); tz=rand(1,185998);
for k=1:243200
    dd=(xii(k)-tx).^2+(yii(k)-ty).^2+(zii(k)-tz).^2;
    =min(dd);
    xii(k)=tx(I); yii(k)=ty(I); zii(k)=tz(I);
end

viviani1 发表于 2011-6-15 11:05

回复 4 # ChaChing 的帖子

非常感谢,运行时出现的错误应该和结构体有关,您给的这段程序运行就没有问题,我用这个语句:for i=1:185998
    tx(i)=t(i).x; ty(i)=t(i).y; tz(i)=t(i).z;
把结构体改成向量的形式就没有问题了,不明白为什么换成结构体就不行
页: [1]
查看完整版本: 急求如何缩短此程序的运行时间,双循环加if结构