MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   MATLAB论坛 (https://www.labfans.com/bbs/forumdisplay.php?f=6)
-   -   [MATLAB基础] 还是矩阵乘方运算优化的问题。。。 (https://www.labfans.com/bbs/showthread.php?t=13813)

heinz_2008 2011-08-18 04:25

还是矩阵乘方运算优化的问题。。。
 
之前用一维数组计算矩阵的乘方,但算法有个缺点,若Ti=1000,算y(500),M作500次的乘方; 再算y(501),M又要再作501次的乘方。。。当Ti特别大时,运算就显得特别没有效率。后来想到用三维数组来计算,数学上是优化了,但没想到三维数组的存储那么费时间,大概是优化前的4倍。。。
现在我把2种方法都贴出来,请大家帮忙看看,还有什么方法可以减少运算时间啊,谢谢了!


优化后的(一万次方差不多用了我20秒钟。。。):

ldd=0;
ldu=50* 10 ^ -9;
dt=1;
mttr=8;
Ti=10000;
mdd=1/mttr;
mdu=1/(Ti/2+mttr);
M=[1-(ldd+ldu)*dt mdd*dt mdu*dt 0
ldd*dt 1-(ldu+mdd)*dt 0 mdu*dt
ldu*dt 0 1-(ldd+mdu)*dt mdd*dt
0 ldu*dt ldd*dt 1-(mdd+mdu)*dt];
pfd=[0 1 1 1]*M^(Ti/dt)*[1;0;0;0];
pfdg=ldu*(Ti/2+mttr)+ldd*mttr;
Y(:,:,1)=eye(4);

for i=1:Ti/dt
X(i)=i;
Y(:,:,i+1)=Y(:,:,i)*M;
Z1(i)=[0 1 1 1]*Y(:,:,i+1)*[1;0;0;0];
Z2(i)=ldu*(Ti/2+mttr)+ldd*mttr;
end

plot(X,Z1,'b',X,Z2,'r');
legend ('pfd','pfdg');


优化前的(一万次方差不多5,6秒):

ldd=0;
ldu=50* 10 ^ -9;
dt=1;
mttr=8;
Ti=10000;
mdd=1/mttr;
mdu=1/(Ti/2+mttr);
M=[1-(ldd+ldu)*dt mdd*dt mdu*dt 0
ldd*dt 1-(ldu+mdd)*dt 0 mdu*dt
ldu*dt 0 1-(ldd+mdu)*dt mdd*dt
0 ldu*dt ldd*dt 1-(mdd+mdu)*dt];
pfd=[0 1 1 1]*M^(Ti/dt)*[1;0;0;0];
pfdg=ldu*(Ti/2+mttr)+ldd*mttr;

for i=1:1:Ti
x(i)=i;
y1(i)=[0 1 1 1]*M^x(i)*[1;0;0;0];
y2(i)=ldu*(Ti/2+mttr)+ldd*mttr;
end
plot(x,y1,'r',x,y2,'b');
legend ('pfd','pfdg')

heinz_2008 2011-08-21 20:29

回复: 还是矩阵乘方运算优化的问题。。。
 
没人关注吗?
。。。只好自己来顶一下了


所有时间均为北京时间。现在的时间是 13:24

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.