首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何简化我的matlab代码?找不到一种工作正常的方法

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

Stack Overflow用户
提问于 2020-10-27 11:30:59
回答 2查看 79关注 0票数 0

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

代码语言:javascript
复制
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。

我如何简化我的代码?

EN

回答 2

Stack Overflow用户

发布于 2020-10-27 11:51:40

这是Matlab,也就是矩阵实验室。以矩阵的形式写出来!

而不是u1u2,...写入向量\数组udel_u将变为u(1:end-1,:)-u(2:end,:),依此类推。

如果y是一个向量\数组y1 y2 y3...,情况也是如此...然后是yy=sum(y)

这是非常非常基础的matlab编程,你可以在文档中阅读到。

编辑:

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

代码语言:javascript
复制
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) ;
票数 3
EN

Stack Overflow用户

发布于 2020-10-29 04:07:07

这段代码工作得很好,当数据大小发生变化时,不需要对其进行更改。这段代码也运行得更快:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64547947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档