【问题标题】:The same script/funktion different time with MatLabMatLab 的相同脚本/功能不同时间
【发布时间】:2016-04-27 20:51:15
【问题描述】:

我是某种编程方面的“高级”初学者。我找不到我的问题的答案,我找到了MATLAB Speed Difference in Identical Code,但这并不是我想要的。我有以下问题,我的脚本或函数由几个部分组成,当我使用运行部分手动运行它们时,我需要大约 15 秒。包括滚动和点击。当我将它们作为一项功能启动时,我需要 72 秒。代码是:

a=diff(Min_ZR);
b=zeros(38000000,1)*NaN;
i=1;

while i<length(a)
if a(i)==1;
    b(i)=1;
    i=i+1;

else
    b(i)=0;
    i=i+1;
end
end


 b(i:end) = [];
%%
iL=2;
kL=2;
L1=zeros(38000000,1)*0;

while iL<length(test_L)

if test_L(iL)==1

L1(iL)=L1(kL-1)+1;
iL=iL+1;
kL=iL;
else
    L1(iL)=L1(iL-1);
    iL=iL+1;

end
end
L1(iL:end)=[];

%%

iR=2;
kR=2;
L2=zeros(38000000,1)*0;

while iR<length(test_R)

if test_R(iR)==1

L2(iR)=L2(kR-1)+1;
iR=iR+1;
kR=iR;
else
    L2(iR)=L2(iR-1);
    iR=iR+1;

end
end
L2(iR:end)=[];
%%

iZ=2;
kZ=2;
ZR=zeros(38000000,1)*0;

%while i<length(test_R)
while iZ<length(b)
if b(iZ)==1

ZR(iZ)=ZR(kZ-1)+1;
iZ=iZ+1;
kZ=iZ;
else
    ZR(iZ)=ZR(iZ-1);
    iZ=iZ+1;

end
end
ZR(iZ:end)=[];





%%
L1=L1/4;
L2=L2/4;
ZR=ZR/8*34/22;
i=1;
diff_L1=zeros(38000000,1)*NaN;
diff_L2=zeros(38000000,1)*NaN;
while i<=length(ZR)

diff_L1(i)=L1(i)-ZR(i);
diff_L2(i)=L2(i)-ZR(i);
i=i+1;
end
diff_L1(i:end)=[];
diff_L2(i:end)=[];

l=length(ZR);
Drehmoment=zeros(l,1);
Drehmoment(1:10000)=100;
Drehmoment(10001:end)=380;
%%

figure % new figure
[hAx,hLine1,hLine2] = plotyy(ZR,diff_L2,ZR,Drehmoment);

title('Zahnradwandern 30.03.2016')
xlabel('Gesamtumdrehungen /1 ')

ylabel(hAx(1),'Differenzumdrehungen /1 ') % left y-axis
ylabel(hAx(2),'Drehmoment / Nm') % right y-axis

set(hAx(1),'Xlim',[0 1050000])
set(hAx(2),'Xlim',[0 1050000])
set(hAx(1),'Xtick',0:50000:1050000)
set(hAx(1),'XTickLabel',{'0','','100000','','200000','','300000','','400000','','500000','','600000','','700000','','800000','','900000','','1000000',''})
set(hAx(1),'Ylim',[-2 38])
set(hAx(1),'YTick',-2:2:38)
set(hAx(2),'YTick',0:20:400)
set(hAx(2),'Ylim',[0 400])
grid on
hold on 
plot (ZR,diff_L1,'color','g')
hold off
legend('Differenzumdrehungen PL2','Differenzumdrehungen PL1','Antriebsmoment')

对于每个部分,我需要不到 1 或 2 秒。只是为了情节,我需要更多,但正如我写的 15 秒。最重要的是,它离 72 秒还差得很远。当我运行函数时得到的。 提前谢谢你。

【问题讨论】:

  • 什么是Min_Zr?它的尺寸是多少?
  • test_Ltest_R 是什么?
  • 还有一个很好的信息是,@StewieGriffin 提到的内部变量可以是什么。它们是逻辑、整数、浮点数、...?

标签: matlab


【解决方案1】:

我发现了问题,如果我用运行和时间启动程序,它会告诉我 72 秒,或者在我使用提示 4 之后。从克劳利 60 秒。它还说“运行和时间 fkt”不使用资源,但如果我只是运行程序,它会在 10 秒内完成。

【讨论】:

  • 使用 MATLAB Profiler ("Run and Time"),即时编译器 (JIT) 无法优化某些东西,例如 for/while 循环,这 可以让你的代码变慢。
【解决方案2】:

您的代码在以下情况下是否会提高其性能:

  1. 您将索引i 更改为iiij 保留给虚数单位;
  2. 定义b=nan(length(a),1);L1=zeros(length(test_L),1);并省略b(:,end)=[];L1(iL:end)=[];;
  3. 使用for ii=1:length(a) 代替while 循环;
  4. 使用b=zeros(length(a),1);b(a==1)=1; 而不是整个while 循环;
  5. 使用diff_L=L1-R1 代替while 循环;
  6. 使用Drehmoment=ones(l,1)*380;Drehmoment(1:100000)=100;?

这些只是您可以消磨时间的建议...


编辑关于 hbadert 的评论

你试过了吗:

Block=1;
BlockTic(Block)=tic;
%%Block 1
BlockToc(Block)=toc;
Block=Block+1;
BlockTic(Block)=tic;
%%...
BlockToc(Block)=toc;

AllTime=BlockToc(end)-BlockTic(1);
Times=BlockToc-BlockTic;

disp(['Global time: ',num2str(AllTime)])
disp('Block times:')
disp(Times')

【讨论】:

  • 我想你不明白我的问题。我希望你能看到不同的部分,如果我只运行一个部分,它们中的任何一个都需要 0.5 秒。我很确定他们会尽可能快。如果我“分段”运行它们,我可以在 10 秒内运行整个代码,如果我运行整个程序,准确地说,它会在 72 秒内缓慢运行。我认为这与我的变量名称无关。 @Crowley thx 我使用 4 而不是我的循环 :) 5 不错,我使用循环是因为 LR 和 ZR 的长度不一样。
  • 使用ii 代替i 就像在马路右侧行驶(除非你是日语、英语……)。您可以在左侧驾驶汽车多年没有任何问题;直到你遇到对你不利的人......
  • 第 2 点和第 6 点可能会提高可读性,并且由于变量的正确分配可能会减少内存使用量。
  • 为什么LRZR的维度不同?也许你可以使用diff(LR(1:M),ZR(1:M)) where M=min([length(LR),length(ZR)]);
  • 你也不需要为每个循环使用唯一的计数器,你可以只使用 iijjkk 计数器为整个m-file
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
相关资源
最近更新 更多