huangxingaho 发表于 2009-6-6 16:41

求助f一段for循环的优化

for i=1:nb
    xp=xp+1;
      if ((any(xp==0))|(any(xp==77))|(any(xp==155)))
    I(i)=i;
      end;
end;
xp是1Xn维矩阵
nb循环太大xp维数也不小所以速度很慢,我晚上会在

xiezhh 发表于 2009-6-6 17:09

我有一个疑问,满足条件时I(i)=i,不满足条件时不赋值,是这样吗?这样最后得到的I向量可能有很多的0。
你的代码可以这样优化
nb=100;
xp=randperm(20);
n=length(xp);
X=repmat(xp,)+repmat(',);
SumX=sum((X==0)')+sum((X==77)')+sum((X==155)');
id=find(SumX);
I(id)=id;
只需把nb和xp换成你的数据就行了。

[ 本帖最后由 xiezhh 于 2009-6-6 17:15 编辑 ]

huangxingaho 发表于 2009-6-6 23:24

回复 沙发 xiezhh 的帖子

非常感谢xiezhh的回复,和贴出来的源程序
由于晚上回的比较晚,所以现在才回复
是的,确实是满足条件时才赋值,多出来的零准备使用矩阵运算将其删除
你的程序把我的一维矩阵变为xp的维数乘nb维矩阵然后统计矩阵中满足条件逻辑项
最后找到找到 这些项所在行吧
谢谢,我明天再把程序运行一下

xiezhh 发表于 2009-6-7 09:26

我觉得只需找到这些项所在行就行了,没必要再产生一个I 向量,因为多出来的零你还要使用矩阵运算将其删除。

huangxingaho 发表于 2009-6-7 10:37

晕,好像不行啊,报错
??? Maximum variable size allowed by the program is exceeded.

Error in ==> repmat at 60
      B = A(ones(siz(1), 1), :);

Error in ==> vehicle3 at 24
X=repmat(xp,)+repmat(',);
以下是我的全部程序

    clear
clc
fid=fopen('nu.bin','r');
n=fread(fid,inf,'int32');
status=fclose(fid);
fid1=fopen('distance.bin','r');
D=round(10*fread(fid1,inf,'single'))/10;
status=fclose(fid1);
fid2=fopen('weight.bin','r');
W=fread(fid2,inf,'uint32');
status=fclose(fid2);
xp(1)=0;
for i=1:n-1
xp(i+1)=-D(i)+xp(i);
end;
lb=15.50;%梁长度
ne=155;   %梁划分的单元数(太小不行)
deltl=lb/ne;
d=lb-xp(n);
nb=int32(d/deltl);
I=zeros(1,nb);
xp=int32(xp*10);
n=length(xp);
X=repmat(xp,)+repmat(',);
SumX=sum((X==0)')+sum((X==77)')+sum((X==155)');
id=find(SumX);
      xp=0*xp;
      M=int32(zeros(1,length(id)));
i=1:n-1
xp(i+1)=-D(i)+xp(i);
      for i=1:length(id)
            XP=xp+id(i)*deltl;
            k=1:n
            M(i)=int32(W(k)*YXX(XP(k))+M(i));
      end;
% M(:,M(1,:)==0)=[];
fid3=fopen('M.bin','w');
count=fwrite(fid3,M,'int32');
status=fclose(fid3);
fid4=fopen('nb.bin','w');
count=fwrite(fid4,nb,'uint64');
status=fclose(fid4);
fid5=fopen('M.txt','w');
fprintf(fid5,'%6.1f\n',M);
status=fclose(fid5);

ChaChing 发表于 2009-6-7 12:27

好像已经是内存问题了!
我试过nb=22964712;n=20860; aa=rand(nb,n);会出现相同报错!
LZ的矩阵实在过大了!
建议从源头想想, 怎麽降低矩阵的大小!?
个人小看法, 改变自己的流程去配合现有的软件限制, 而非一昧追求改变软件的限制
页: [1]
查看完整版本: 求助f一段for循环的优化