Consider the following two vectors of temperatures in Celsius degrees to Fahrenheit, using a for-loop and then prints them on screen.
Cdegrees = [-20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40]
Fdegrees = [-20, -15, -5, 0, 10, 15, 30, 35, 40]
(A) Write a function that takes an input vector of temperatures, and a string which is either 'F2C'
or C2F
. Then, converts the input temperature vector from Fahrenheit to Celsius if the input string is 'F2C'
, otherwise converts the input temperature vector from Celsius to Fahrenheit if the input string is 'C2F'
, otherwise outputs an error message and aborts the program.
(A) Write this function using while-loop construct (you can name the function convertTempFor.m
).
(B) Write this function using for-loop construct (you can name the function convertTempWhile.m
).
(C) Write this function using vectorization concept (you can name the function convertTempVec.m
).
(D) Use MATLAB built-in timing functions to measure the performance of the three functions in the above.
Here are some example calls to these functions,
InVec = [-20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40];
convertTempFor(InVec,'C2F')
ans =
-4 5 14 23 32 41 50 59 68 77 86 95 104
convertTempWhile(InVec,'C2F')
ans =
-4 5 14 23 32 41 50 59 68 77 86 95 104
convertTempVec(InVec,'C2F')
ans = -4 5 14 23 32 41 50 59 68 77 86 95 104
Consider the following example code, which converts a list of temperature values from Celsius to Fahrenheit, using a for-loop and then prints them on screen.
Cdegrees = [-20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40]
print (' C F')
for C in Cdegrees:
F = (9.0/5)*C + 32
print ('%5d %5.1f' % (C, F))
C F
-20 -4.0
-15 5.0
-10 14.0
-5 23.0
0 32.0
5 41.0
10 50.0
15 59.0
20 68.0
25 77.0
30 86.0
35 95.0
40 104.0
Write a while-loop implementation of the above code.
Here are the three function,
- (A) convertTempFor.m,
function OutVec = convertTempFor(InVec,str) OutVec = zeros(size(InVec)); if strcmp(str,'C2F') for i = 1:length(InVec) OutVec(i) = (9.0/5.0)*InVec(i) + 32.0; end elseif strcmp(str,'F2C') for i = 1:length(InVec) OutVec(i) = (5.0/9.0)*(InVec(i) - 32.0); end else error(['the requested conversion ',str,' is not supported. Program aborted.']); end end
- (B) convertTempWhile.m,
function OutVec = convertTempWhile(InVec,str) i = 1; OutVec = zeros(size(InVec)); if strcmp(str,'C2F') while i <= length(InVec) OutVec(i) = (9.0/5.0)*InVec(i) + 32.0; i = i + 1; end elseif strcmp(str,'F2C') while i <= length(InVec) OutVec(i) = (5.0/9.0)*(InVec(i) - 32.0); i = i + 1; end else error(['the requested conversion ',str,' is not supported. Program aborted.']); end end
- (C) convertTempVec.m,
function OutVec = convertTempVec(InVec,str) if strcmp(str,'C2F') OutVec = (9.0/5.0)*InVec + 32.0; elseif strcmp(str,'F2C') OutVec = (5.0/9.0)*(InVec - 32.0); else error(['the requested conversion ',str,' is not supported. Program aborted.']); end end
(D) Here is one way, (timing.m script), of timing the functions,
InVec = randi(100,1,10^7);
disp(['Timing for convertTempVec: ' , num2str(timeit(@()convertTempVec(InVec,'C2F'))), ' seconds.' ]);
disp(['Timing for convertTempFor: ' , num2str(timeit(@()convertTempVec(InVec,'C2F'))), ' seconds.' ]);
disp(['Timing for convertTempWhile: ', num2str(timeit(@()convertTempWhile(InVec,'C2F'))), ' seconds.' ]);
Here is a test result,
timing
Timing for convertTempVec: 0.038723 seconds.
Timing for convertTempFor: 0.03936 seconds.
Timing for convertTempWhile: 0.18011 seconds.
The while-loop implementation is far slower than the vectorized and for-loop versions.
Cdegrees = [-20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40]
index = 0
print (' C F')
while index < len(Cdegrees):
C = Cdegrees[index]
F = (9.0/5)*C + 32
print('%5d %5.1f' % (C, F))
index += 1
C F
-20 -4.0
-15 5.0
-10 14.0
-5 23.0
0 32.0
5 41.0
10 50.0
15 59.0
20 68.0
25 77.0
30 86.0
35 95.0
40 104.0