首页 > 解决方案 > 如何简化我的 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 次,表示长度(theta)=1000,u1~u1000,del_u1~del_u999,y1~y1000,yy=y1+y2+...y1000。
如何简化我的代码?

标签: matlabfor-loopvectorization

解决方案


这是 Matlab,又名矩阵实验室。写成矩阵形式!

而不是u1, u2, ... 写 vector\array udel_u将变成u(1:end-1,:)-u(2:end,:)等。

if yis a vector\array [ y1 y2 y3...]... then也一样yy=sum(y)

这是非常非常基本的 matlab 编程,您可以在文档中阅读所有相关信息。

编辑:

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

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) ;

推荐阅读