Anonymous function or for loop?

3 次查看(过去 30 天)
Assume I have a simple electrical function of V=C*sin(t) where C is a constant which varies based on t intervals.
I have used 2 methods to generate the C and by using tic/toc to check, Method 2 seems to be faster than Method 1.
For efficiency and speed wise, should I always use anonymous function instead of for loop? Or is my loop not being coded efficient enough?
t = 0 : 0.1 : 20;
c1 = 53; % (0 <= t <= 10)
c2 = 68; % (10 < t <= 20)
% Method 1 (For Loop)
tic
n = length(t);
a = ones(1,n);
for i = 1:n
if t(i)>=0 && t(i)<=10
A = c1;
else
A = c2;
end
a(i) = A;
end
toc
% Method 2 (Anonymous Function)
tic
C = @(t) (t>=0 & t<=10).*c1 + (t>10).*c2;
c = C(t);
toc
v = sin(t);
v2 = c.*v;
v3 = a.*v;
% Checking
a==c;
v2==v3;

采纳的回答

KSSV
KSSV 2021-6-24
Off course, you can achieve the same without using anonymous function.
t = 0 : 0.1 : 20;
c1 = 53; % (0 <= t <= 10)
c2 = 68; % (10 < t <= 20)
tic
a = c1*ones(size(t)) ;
a(t>10) = c2 ;
toc
Elapsed time is 0.009947 seconds.
% Method 2 (Anonymous Function)
tic
C = @(t) (t>=0 & t<=10).*c1 + (t>10).*c2;
c = C(t);
toc
Elapsed time is 0.005566 seconds.
v = sin(t);
v3 = a.*v;
v4 = a.*v ;
% Checking
isequal(a,c)
ans = logical
1
isequal(v3,v4)
ans = logical
1

更多回答(2 个)

KSSV
KSSV 2021-6-24
编辑:KSSV 2021-6-24
The second version is a vectorised version and this will be fast compared to loop.
Your loop is implemented.
You check the finals values uisng:
% Checking
isequal(a,c)
isequal(v2,v3)

Sulaymon Eshkabilov
Your second method is much faster. Try to avoid for or while loop if feasible.
At the same time, you may improve your 2nd method by computing the values of C directly for the predefined values of t, e.g:
% Method 2 (Anonymous Function)
t1 =0:0.1:10; t2 =10.01:.1:20; % t is split up into two ranges
tic
C =t1*c1 + t2*c2;
toc
v = sin(t);
v2 = C.*v;
v3 = a.*v;
% Checking
a==c;
v2==v3;
  1 个评论
Amanda Liu
Amanda Liu 2021-6-24
编辑:Amanda Liu 2021-6-24
Ohh..so I wouldn't need an anonymous function anymore.
Btw, I think you meant
t2 = 10.1 : .1 : 20 % instead of 10.01 : .1 : 20
I'm getting dimension error in this line:
C = t1*c1 + t2*c2 % (t1 is of size 1x101 while t2 is 1x100)
What I understand from the line above is that C is the sum of 2 scalar values meaning that even if I change t1 and t2 to be of the same size, there will still only be a total of 101 Cs' even though it should be 201 Cs'.
Therefore, I changed it into:
C = [t1*c1 t2*c2];
However if i check C & a using isequal(a,C), it returns false because t itself should not be multiplied into the constants.
Anyways, thank you very much for helping me! I will avoid for/while loop if feasible.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Loops and Conditional Statements 的更多信息

产品


版本

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by