Consider Preallocating for Speed

1 次查看(过去 30 天)
Tony Rankin
Tony Rankin 2021-5-21
评论: Stephen23 2021-5-22
I have the following code and I am being informed that I can "preallocate for speed". When attempting to set up an array which I think is the solution to this issue, I am told "Index exceeds the number of array elements (1)".
What is the correct array to use for the code?
A= 2; %area (m^2)
T = 0.1; %tau, integral time constant (min)
h=0.001; %stepsize
t_final= 100; %the total time (min)
N=t_final/h;
Kc1 = 1; %p
roportional gain, m^2/min
t1(1)=0; %Kc=1 at 0 minutes
x1(1)=0; %deviation of liquid height (difference between actual height and desired height)
v1(1)=2; %derivative of change in height with respect to time
for i=1:N
t1(i+1)=t1(i)+h;
x1(i+1)=x1(i)+h*(v1(i));
v1(i+1)=v1(i)+h*((-Kc1*v1(i)/A)-(Kc1/(T*A))*x1(i));
end
Kc2 = 2;
t2(1)=0;
v2(1)=2;
x2(1)=0;
for i=1:N
t2(i+1)=t2(i)+h;
x2(i+1)=x2(i)+h*(v2(i));
v2(i+1)=v2(i)+h*((-Kc2.*v2(i)/A)-(Kc2./(T*A))*x2(i));
end
Kc3 = 3;
t3(1)=0;
v3(1)=2;
x3(1)=0;
for i=1:N
t3(i+1)=t3(i)+h;
x3(i+1)=x3(i)+h*(v3(i));
v3(i+1)=v3(i)+h*((-Kc3.*v3(i)/A)-(Kc3./(T*A))*x3(i));
end
Kc4 = 4;
t4(1)=0;
v4(1)=2;
x4(1)=0;
for i=1:N
t4(i+1)=t4(i)+h;
x4(i+1)=x4(i)+h*(v4(i));
v4(i+1)=v4(i)+h*((-Kc4.*v4(i)/A)-(Kc4./(T*A))*x4(i));
end
Kc5 = 5;
t5(1)=0;
v5(1)=2;
x5(1)=0;
for i=1:N
t5(i+1)=t5(i)+h;
x5(i+1)=x5(i)+h*(v5(i));
v5(i+1)=v5(i)+h*((-Kc5.*v5(i)/A)-(Kc5./(T*A))*x5(i));
end
Kc75 = 7.5;
t6(1)=0;
v6(1)=2;
x6(1)=0;
for i=1:N
t6(i+1)=t6(i)+h;
x6(i+1)=x6(i)+h*(v6(i));
v6(i+1)=v6(i)+h*((-Kc75.*v6(i)/A)-(Kc75./(T*A))*x6(i));
end
Kc10 = 10;
t7(1)=0;
v7(1)=2;
x7(1)=0;
for i=1:N
t7(i+1)=t7(i)+h;
x7(i+1)=x7(i)+h*(v7(i));
v7(i+1)=v7(i)+h*((-Kc10.*v7(i)/A)-(Kc10./(T*A))*x7(i));
end
Kc20 = 20;
t8(1)=0;
v8(1)=2;
x8(1)=0;
for i=1:N
t8(i+1)=t8(i)+h;
x8(i+1)=x8(i)+h*(v8(i));
v8(i+1)=v8(i)+h*((-Kc20.*v8(i)/A)-(Kc20./(T*A))*x8(i));
end
  1 个评论
Stephen23
Stephen23 2021-5-22
Duplicating code like that is a very strong code smell
and seems to be caused by forcing meta-data into the variable names (Kc1, Kc2, Kc5, Kc10, Kc20).
To simplify your code keep the meta-data in a separate array and use indexing rather than separate variables. Then you can trivially avoid duplicating code like that.

请先登录,再进行评论。

回答(1 个)

Daniel Bengtson
Daniel Bengtson 2021-5-21
编辑:Daniel Bengtson 2021-5-21
You just need to initialize your vectors before entering the for loops. Something like the below sample would satisfy the preallocation for the kc1 case. You'd have to do the same for the other loops as well.
A= 2; %area (m^2)
T = 0.1; %tau, integral time constant (min)
h=0.001; %stepsize
t_final= 100; %the total time (min)
N=t_final/h;
Kc1 = 1; %proportional gain, m^2/min
%% preallocate vectors of zeros
t1 = zeros(N+1,1);
x1 = zeros(N+1,1);
v1 = zeros(N+1,1);
t1(1)=0; %Kc=1 at 0 minutes
x1(1)=0; %deviation of liquid height (difference between actual height and desired height)
v1(1)=2; %derivative of change in height with respect to time
for i=1:N
t1(i+1)=t1(i)+h;
x1(i+1)=x1(i)+h*(v1(i));
v1(i+1)=v1(i)+h*((-Kc1*v1(i)/A)-(Kc1/(T*A))*x1(i));
end

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by