声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1170|回复: 6

[编程技巧] 求助matlab程序优化

[复制链接]
发表于 2008-3-18 20:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
当程序中含有4个for循环体套用时,怎么办能使它运行快些?目前运行速度以天计算
回复
分享到:

使用道具 举报

发表于 2008-3-18 20:36 | 显示全部楼层
具体问题具体分析,矢量化编程问题本版有专门的帖子收集,请在置顶帖找。权限不够也请先熟悉论坛
 楼主| 发表于 2008-3-19 11:53 | 显示全部楼层

帮忙看看这个matlab程序如何优化

我想编一个4行10000列的矩阵,矩阵元素要求是1到10这10个数的全排列,不知道我说的清楚不。下面是我自己编的程序,大家帮我看看怎么优化一下。我已经看过置顶区的矢量化编成的技巧。可是没找到我想要的技巧。请大家帮我想想,好吗?:handshake
程序如下:
clc
clear
X=zeros(4,10000);
a=0;
b=0;
c=0;
d=0;
i=0;
for a=1:1:10
for b=1:1:10
for c=1:1:10
for d=1:1:10
    i=i+1;
     X(:,i)=[a;b;c;d];
     
end;
end;
end;
end;
X
发表于 2008-3-19 12:31 | 显示全部楼层
clc
clear
X1=zeros(4,10000);
X1(1,:) = kron(1:10,ones(1,1000));
X1(2,:) = kron(kron(ones(1,10),1:10),ones(1,100));
X1(3,:) = kron(kron(ones(1,100),1:10),ones(1,10));
X1(4,:) = kron(ones(1,1000),1:10);

评分

1

查看全部评分

 楼主| 发表于 2008-3-20 09:50 | 显示全部楼层
谢谢楼上的朋友。:victory:
 楼主| 发表于 2008-3-20 13:35 | 显示全部楼层
我还有问题,我的编程思想是这样的:对二阶非线性微分方程通过赋予不同的初值求出方程的解,一旦初始值赋新值就求解,然后将所得的新解与前面的结果作比较,如果结果相同就输出本次初始值。我编了一个程序大家看看能不能优化。我通过profile分析出每次解方程都要费很多时间。
X=zeros(4,10000);
X(1,:)=kron(1:10,ones(1,1000));
X(2,:)=kron(kron(ones(1,10),1:10),ones(1,100));
X(3,:)=kron(kron(ones(1,100),1:10),ones(1,10));
X(4,:)=kron(ones(1,1000),1:10);
refine =10;
G=[];
T=[];
n=[];   
Z=[];
Y=[];
y0=[];
for j=1:10000
        o=1;
        w=1;
        k=1;
        aa=X(1,j);bb=X(2,j);cc=X(3,j);dd=X(4,j);
        while o==k
           T(:,o)=[aa;bb;cc;dd] ;
                s=aa;
                p=bb;
                ss=cc;
                yy=dd;
y0=[ (s-1/2)*h1+xmin   (p-1/2)*h2+ymin   (ss-1/2)*h3+zmin  (yy-1/2)*h4+umin];

options = odeset('Events',@events,'AbsTol',1e-10,'OutputSel',1,...
                 'Refine',refine);
for i=1:1
[t,y,te,ye,ie] = ode23(@f,[tstart tfinal],y0,options);%此处费时最多
te
if isempty(ye)==1
    break;
end
n=size(ye);
alfa=abs(ye(n(1),1)-ye(n(1),2))/2;%%%%
dy=collision( [ ye(n(1),3)  ye(n(1),4) ] );
y0=[ ye(n(1),2)   ye(n(1),1)   dy(1)   dy(2) ];
Z(w:w+3)=y0;
end
if isempty(ye)==1
              aa=0;
    break;
end
              n=size(y0);
              aa=round((y0(n(1),1)-xmin)/h1+1/2;
              bb=round((y0(n(1),2)-ymin)/h2+1/2);
              cc=round((y0(n(1),3)-zmin)/h3+1/2);
              dd=round((y0(n(1),4)-umin)/h4+1/2);
              o=o+1;
              if aa<1|aa>10| bb<1|bb>10|cc<1|cc>10|dd<1|dd>10
                             aa=0;
              else
                  T(:,o)=[aa;bb;cc;dd] ;
              end
      
              if aa==0
                 break;
              else
                     k=1;
                     w=1;
                  G(:,k)=X(:,j);
             while T(1,o)~=G(1,k)|T(2,o)~=G(2,k)|T(3,o)~=G(3,k)|T(4,o)~=G(4,k)
                                k=k+1;
                              y0=Z(w:w+3);
                              n=size(y0)
              r=round((y0(n(1),1)-xmin)/h1+1/2);%bao ying she
              q=round((y0(n(1),2)-ymin)/h2+1/2);%%%%%
              rr=round((y0(n(1),3)-zmin)/h3+1/2);
              qq=round((y0(n(1),4)-umin)/h4+1/2);
                    G(:,k)=[r;q;rr;qq];
                         w=w+4;
                          end  
              end  
              
        end
         if aa~=0
            pp=pp+1;
           Y(1,pp)=(X(1,j)-1/2)*h1+xmin;
           Y(2,pp)=(X(2,j)-1/2)*h2+ymin;
           Y(3,pp)=(X(3,j)-1/2)*h3+zmin;
           Y(4,pp)=(X(4,j)-1/2)*h4+umin;
         
           Y(:,pp)
        end
  end
发表于 2008-3-20 15:37 | 显示全部楼层
原帖由 梅梅 于 2008-3-20 13:35 发表
我还有问题,我的编程思想是这样的:对二阶非线性微分方程通过赋予不同的初值求出方程的解,一旦初始值赋新值就求解,然后将所得的新解与前面的结果作比较,如果结果相同就输出本次初始值。我编了一个程序大家看看能 ...
你懂得用profile,就知道哪个地方有问题,然后优化就可以了。解方程我都不懂,而且也没有这个时间帮你具体调试、跟踪
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-28 17:01 , Processed in 0.065646 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表