如何简化我的 matlab 代码?找不到正常工作的方法



需要帮助简化我的matlab代码。

lambda = 1;
k = 2*pi/lambda;
w = 2*pi*v/lambda;
z=linspace(0,10,10000);
t=linspace(0,10,10);  %time
theta=(pi)*rand(1,length(t));   %random phase
for a=1:length(t)
u1=1./(1+exp(-2.*(10e4).*(t(a)-z./v)));   %step function
u2=1./(1+exp(-2.*(10e4).*(t(a)-z./v-1)));
u3=1./(1+exp(-2.*(10e4).*(t(a)-z./v-2)));
u4=1./(1+exp(-2.*(10e4).*(t(a)-z./v-3)));
u5=1./(1+exp(-2.*(10e4).*(t(a)-z./v-4)));
u6=1./(1+exp(-2.*(10e4).*(t(a)-z./v-5)));
u7=1./(1+exp(-2.*(10e4).*(t(a)-z./v-6)));
u8=1./(1+exp(-2.*(10e4).*(t(a)-z./v-7)));
u9=1./(1+exp(-2.*(10e4).*(t(a)-z./v-8)));
u10=1./(1+exp(-2.*(10e4).*(t(a)-z./v-9)));
del_u1=u1-u2;
del_u2=u2-u3;
del_u3=u3-u4;
del_u4=u4-u5;
del_u5=u5-u6;
del_u6=u6-u7;
del_u7=u7-u8;
del_u8=u8-u9;
del_u9=u9-u10;
y1=del_u1.*cos(k.*z-w.*t(a)+theta(1));
y2=del_u2.*cos(k.*z-w.*t(a)+theta(2));
y3=del_u3.*cos(k.*z-w.*t(a)+theta(3));
y4=del_u4.*cos(k.*z-w.*t(a)+theta(4));
y5=del_u5.*cos(k.*z-w.*t(a)+theta(5));
y6=del_u6.*cos(k.*z-w.*t(a)+theta(6));
y7=del_u7.*cos(k.*z-w.*t(a)+theta(7));
y8=del_u8.*cos(k.*z-w.*t(a)+theta(8));
y9=del_u9.*cos(k.*z-w.*t(a)+theta(9));
y10=u10.*cos(k.*z-w.*t(a)+theta(10));
yy=y1+y2+y3+y4+y5+y6+y7+y8+y9+y10;
figure(1)
plot(z,yy); grid on; axis image;
drawnow;
end

这个方程式并不复杂,但我很难把它简化。我想把这个方程式重复1000次,意思是长度(θ(=1000,u1~u1000,del_u1~del_u999,y1~y1000,yy=y1+y2+。。。y1000。
如何简化代码?

这是Matlab,也就是矩阵实验室用矩阵形式写

代替u1u2。。。写入矢量\数组udel_u将变为u(1:end-1,:)-u(2:end,:)

如果y是矢量\数组[y1 y2 y3...]。。。然后是CCD_ 8。

这是非常非常基本的matlab编程,你可以在文档中阅读所有关于它的内容。

编辑:

以下是问题中代码的相同版本(在Matlab 2019b中编写和测试(,显示了如何获得数组并实现矢量化,而不是变量u1u2和循环等的膨胀。

u        = 1./(1+exp(-2.*(10e4).*  (t'-permute(0:9,[3 1 2])-z./v) ));
del_u    = cat(3,u(:,:,1:end-1)-u(:,:,2:end), u(:,:,end)); 
cos_term = cos(k.*z-w.*t'+permute(theta,[3 1 2]));
yy       = sum(del_u.*cos_term,3) ;

此代码运行良好,当数据大小发生变化时无需更改。此代码运行速度也更快:

v = 1;
lambda = 1;
k = 2*pi/lambda;
w = 2*pi.*v./lambda;
z=linspace(0,10,10000);
t=linspace(0,10,10);  %time
theta=(pi)*rand(1,length(t));   %random phase
for a=1:length(t)
u = 1./(1+exp(-2.*(10e4).*(bsxfun(@minus, t(a) - z./v, [0:9]'))));
del_u = [u(1:end-1, :)-u(2:end, :); u(end, :)];
y = del_u.*cos(bsxfun(@plus, k.*z - w.*t(a), theta'));
yy = sum(y);
figure(1)
plot(z,yy); grid on; axis image;
drawnow;
end

最新更新