PDA

查看完整版本 : [MATLAB基础] 还是矩阵乘方运算优化的问题。。。


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
没人关注吗?
。。。只好自己来顶一下了