% Assignment 2 - functions and flow control % % Nigel Stepp % % It might help to paste some of these things into their own files. % If you have questions, or want comments, feel free to email me % your answers. % % *** Note: if Question 1 is seeming too hard, just skip it and we can % go over it in class. *** % % Topics covered: functions, input and output parameters, flow control % Question 1: % % An undergrad messed up your data files, and instead of having % a column for each variable that you are measuring (3 of them), there % is just one long column. % % But, you know you took 5 observations of each variable! (we'll assume % that 5 observations is enough :) ) % % Since you know the number of observations, and the undergrad fortunately % kept the data in order, you should be able to reconstruct your data matrix. % % Take the data in 'bad_data' and create a 5x3 matrix of your % corrected data called 'data'. % % hint: you may need to *iterate*. % other hint: if you want to be extra elegant, consider using % the 'mod' builtin function which computes the modulus. % If you use mod, you will want to look up 'ceil' as well. bad_data = [5,8,3,4,5,10,14,27,19,2,18.2,72,89,105,37]; % 'data' should end up like this: % 5 10 18.2 % 8 14 72 % 3 27 89 % 4 19 105 % 5 2 37 % Here are 4 ways to solve this problem (not the only 4, though): % Matlab vector slicing non-loop method (this is an instance of "hard-coding" % which is usually discouraged). data(:,1) = bad_data(1:5); data(:,2) = bad_data(6:10); data(:,3) = bad_data(11:15); % Uses matlab vector slicing with a for loop (notice how it is more general) for i=1:3 data(:,i) = bad_data( 5*(i-1)+1:5*i ); end; % nested loop example for i=1:3 for j=1:5 data(j,i) = bad_data( j + 5*(i-1) ); end; end; % Uses the mod() and ceil() builtin functions for i=1:length(bad_data) row = mod(i-1,5) + 1; column = ceil(i/5); data(row, column) = bad_data(i); end; % Question 2: % % Great, looks like this poor undergrad did this with *all* of % your data files. So you have to run this on all of them. % % Write a function which takes a bad_data vector as an input parameter % and returns a corrected matrix. % % hint: This is just an extension of Question 1. % % If you want to be really general, also make the function take % the number of observations as an % additional input parameter. In Question 1, this would be % 5. function data = fix_data( bad_data, observations ) for i=1:length(bad_data) row = mod(i-1, observations) + 1; column = ceil(i/observations); data(row, column) = bad_data(i); end; end; % Question 3: % % Here is a while loop which asks the user for input. Notice that % it loops while true is true (forever!). This is called an infinite % loop. % % Add code where requested. % % This uses the builtin functions 'input', 'disp', and 'strcmp'. See MATLAB help % for their uses (it's good to get in the habit of using it as a reference). while true entry = input('Please type something and hit enter: ', 's'); if strcmp(entry, 'Knock knock') disp('Who is there?'); end; if strcmp(entry, 'What is your name?') disp('Hi, my name is MATLAB, thank you for programming me.'); end; % Here, place some code that will stop the loop if the user % enters 'quit'. You might want to say goodbye, also. if strcmp(entry, 'quit') disp('Bye!'); break; end; disp( ['(By the way, you entered "', entry, '")'] ); end;