本人小白,编了一个MATLAB程序,想要计算有约束的最优解。但是计算太慢,一个五行四列的测试用文件,竟然需要算2个半小时。可是我的真实文件有1500行,那得算足足一个月。。跪求高手帮忙优化,让计算速度得到实质提高!不甚感激!
程序如下:
z1=[0.54;1.09];
z2=[0;0.90];
z3=[0.54;1.09];
dz=0.01;
num_z3=fix((z3(2,1)-z3(1,1))/dz+1);
num_z2=fix((z2(2,1)-z2(1,1))/dz+1);
num_z1=fix((z1(2,1)-z1(1,1))/dz+1);
mm_total=num_z2*(num_z1*2+1-num_z3)*num_z3/2;
yy=zeros(mm_total,5);
load data.txt -ASCII
mm=1;
for zz3=z3(1,1):dz:z3(2,1)
for zz1=zz3:dz:z1(2,1)
for zz2=z2(1,1):dz:z2(2,1)
idata=1:length(data(:,1));
yy(mm,1)=sum((data(idata,4)-data(idata,1).*zz1-data(idata,2).*zz2+data(idata,3).*zz3).^2);
%%原方程形如y=z1*a1+z2*a2+z3*a3,其中z1z2z3为要拟合的有限定范围的量
yy(mm,2)=mm;
yy(mm,3)=zz1; %%用于后期调用最小值的相应ZZ1
yy(mm,4)=zz2;
yy(mm,5)=zz3;
mm=mm+1;
end
end
end
for i=1:length(yy(:,1))
if yy(i,1)==min(yy(:,1))
mmmin=yy(i,2);
%zz1min=yy(i,3);
%zz2min=yy(i,4);
%zz3min=yy(i,5);
end
end
优化matlab程序,加快运算速度
答案:2 悬赏:0 手机版
解决时间 2021-02-19 18:29
- 提问者网友:我是女神我骄傲
- 2021-02-18 21:06
最佳答案
- 五星知识达人网友:过活
- 2021-02-18 21:40
z1=[0.54;1.09];z2=[0;0.90];
z3=[0.54;1.09];
dz=0.01;
num_z3=fix(diff(z3)/dz+1);num_z2=fix(diff(z2)/dz+1);
num_z1=fix(diff(z1)/dz+1);
mm_total=num_z2*(num_z1*2+1-num_z3)*num_z3/2;
yy=zeros(mm_total,5);
load data.txt -ASCII
mm=1;
for zz3=z3(1,1):dz:z3(2,1)
for zz1=zz3:dz:z1(2,1)
for zz2=z2(1,1):dz:z2(2,1)
idata=1:length(data(:,1));
yy(mm,1)=sum((data(idata,4)-data(idata,1).*zz1-data(idata,2).*zz2+data(idata,3).*zz3).^2);
%%原方程形如y=z1*a1+z2*a2+z3*a3,其中z1z2z3为要拟合的有限定范围的量
yy(mm,2)=mm;
yy(mm,3)=zz1; %%用于后期调用最小值的相应ZZ1
yy(mm,4)=zz2;
yy(mm,5)=zz3;
mm=mm+1;
end
end
end
Y=yy(:,1)a=find(Y==min(Y))
mmmin=yy(a,2)
你中间那个循环着实看不懂你要表达的数学意思是什么,主要是中间三个循环影响了你的速度。都是可以去掉的。
或许你可以把你一开始的数学模型和目的说出来,是优化函数,还是拟合参数等等,辅之以一定的数据,别人才能更好给你解答。
你的matlab 代码里面全是 C、C++、VB等语言的影子
z3=[0.54;1.09];
dz=0.01;
num_z3=fix(diff(z3)/dz+1);num_z2=fix(diff(z2)/dz+1);
num_z1=fix(diff(z1)/dz+1);
mm_total=num_z2*(num_z1*2+1-num_z3)*num_z3/2;
yy=zeros(mm_total,5);
load data.txt -ASCII
mm=1;
for zz3=z3(1,1):dz:z3(2,1)
for zz1=zz3:dz:z1(2,1)
for zz2=z2(1,1):dz:z2(2,1)
idata=1:length(data(:,1));
yy(mm,1)=sum((data(idata,4)-data(idata,1).*zz1-data(idata,2).*zz2+data(idata,3).*zz3).^2);
%%原方程形如y=z1*a1+z2*a2+z3*a3,其中z1z2z3为要拟合的有限定范围的量
yy(mm,2)=mm;
yy(mm,3)=zz1; %%用于后期调用最小值的相应ZZ1
yy(mm,4)=zz2;
yy(mm,5)=zz3;
mm=mm+1;
end
end
end
Y=yy(:,1)a=find(Y==min(Y))
mmmin=yy(a,2)
你中间那个循环着实看不懂你要表达的数学意思是什么,主要是中间三个循环影响了你的速度。都是可以去掉的。
或许你可以把你一开始的数学模型和目的说出来,是优化函数,还是拟合参数等等,辅之以一定的数据,别人才能更好给你解答。
你的matlab 代码里面全是 C、C++、VB等语言的影子
全部回答
- 1楼网友:迟山
- 2021-02-18 21:51
没有工具箱支持mathematica与matlab的相互调用,除非编程实现。如果要在matlab中使用符号计算,最好用maple+maple toolbox for matlab+matlab,可以把maple当作matlab的内置工具箱使用。如果有maple 14那就不需要maple toolbox for matlab,maple 14安装时会自动检测电脑中是否安装了matlab。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯