声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1384|回复: 5

[综合讨论] 求助f一段for循环的优化

[复制链接]
发表于 2009-6-6 16:41 | 显示全部楼层 |阅读模式

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

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

x
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维数也不小所以速度很慢,我晚上会在
回复
分享到:

使用道具 举报

发表于 2009-6-6 17:09 | 显示全部楼层
我有一个疑问,满足条件时I(i)=i,不满足条件时不赋值,是这样吗?这样最后得到的I向量可能有很多的0。
你的代码可以这样优化
  1. nb=100;
  2. xp=randperm(20);
  3. n=length(xp);
  4. X=repmat(xp,[nb,1])+repmat([1:nb]',[1,n]);
  5. SumX=sum((X==0)')+sum((X==77)')+sum((X==155)');
  6. id=find(SumX);
  7. I(id)=id;
复制代码

只需把nb和xp换成你的数据就行了。

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

评分

1

查看全部评分

 楼主| 发表于 2009-6-6 23:24 | 显示全部楼层

回复 沙发 xiezhh 的帖子

非常感谢xiezhh的回复,和贴出来的源程序
由于晚上回的比较晚,所以现在才回复
是的,确实是满足条件时才赋值,多出来的零准备使用矩阵运算将其删除
你的程序把我的一维矩阵变为xp的维数乘nb维矩阵然后统计矩阵中满足条件逻辑项
最后找到找到 这些项所在行吧
谢谢,我明天再把程序运行一下
发表于 2009-6-7 09:26 | 显示全部楼层
我觉得只需找到这些项所在行就行了,没必要再产生一个I 向量,因为多出来的零你还要使用矩阵运算将其删除。
 楼主| 发表于 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,[nb,1])+repmat([1:nb]',[1,n]);
以下是我的全部程序

    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,[nb,1])+repmat([1:nb]',[1,n]);
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);

变量数

变量数
发表于 2009-6-7 12:27 | 显示全部楼层
好像已经是内存问题了!
我试过nb=22964712;n=20860; aa=rand(nb,n);会出现相同报错!
LZ的矩阵实在过大了!
建议从源头想想, 怎麽降低矩阵的大小!?
个人小看法, 改变自己的流程去配合现有的软件限制, 而非一昧追求改变软件的限制

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-5-16 14:36 , Processed in 0.070509 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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