This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
gibson:teaching:spring-2016:math445:lecture:forloop [2016/02/16 10:45] gibson [Formatted printing with fprintf] |
gibson:teaching:spring-2016:math445:lecture:forloop [2016/02/17 07:38] (current) gibson |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Math 445 lecture 7: the "for" loop, fprintf ====== | + | ====== Math 445 lecture 7: fprintf, for loops, functions ====== |
- | ===== Formatted printing with fprintf ===== | + | ===== fprintf: formatted printing ===== |
**fprintf** is Matlab's **formatted print function**. It's used for printing variables to the screen (or files) in a format that you specify. The basic syntax is | **fprintf** is Matlab's **formatted print function**. It's used for printing variables to the screen (or files) in a format that you specify. The basic syntax is | ||
Line 24: | Line 24: | ||
* ''%d'' decimal (integer), e.g. 5 | * ''%d'' decimal (integer), e.g. 5 | ||
* ''%f'' floating-point, e.g. 2.75 | * ''%f'' floating-point, e.g. 2.75 | ||
+ | * ''%e'' floating-point in scientific (exponential) notation, e.g. 2.75e+00 for 2.75 | ||
* ''%s'' string (a sequence of characters), e.g. '' 'banana'''. | * ''%s'' string (a sequence of characters), e.g. '' 'banana'''. | ||
* ''%c'' character, e.g. '' 'q' '' | * ''%c'' character, e.g. '' 'q' '' | ||
- | ===== for loops ===== | + | |
+ | The decimal and floating-point slots can be specialized to print numbers in particular ways, for example, | ||
+ | |||
+ | <code matlab> | ||
+ | >> fprintf('The value of pi is %8.3f\n', pi) | ||
+ | The value of pi is 3.142 | ||
+ | </code> | ||
+ | |||
+ | This prints $\pi$ with 3 digits after the decimal in a fixed-width field of 8 characters. | ||
+ | |||
+ | You can put as many slots in a format string as you like. Just provide as many variables as slots, and make sure the types of the slots match the variables. | ||
+ | |||
+ | ===== for loops: repeating sequences of commands===== | ||
**for** loops are used to repeat a sequence of commands a specified number of times. A **for** loop has an index variable (often $n$ or $i$) whose value changes over every iteration of the loop. For example, this Matlab **for** loop | **for** loops are used to repeat a sequence of commands a specified number of times. A **for** loop has an index variable (often $n$ or $i$) whose value changes over every iteration of the loop. For example, this Matlab **for** loop | ||
Line 47: | Line 60: | ||
Note how the //body// of the loop (the fprintf) statement is executed four times, once for each value of $n$ from 1 to 4. | Note how the //body// of the loop (the fprintf) statement is executed four times, once for each value of $n$ from 1 to 4. | ||
+ | ===== functions ===== | ||
+ | The Matlab **function** command lets you define your own functions. For example, putting | ||
+ | the following code in a file named ''quadratic.m'' | ||
+ | |||
+ | <file matlab quadratic.m> | ||
+ | function y = quadratic(x) | ||
+ | y = x^2 + 3*x -7; | ||
+ | end | ||
+ | </file> | ||
+ | |||
+ | defines a function named ''quadratic'' that computes the polynomial $y(x) = x^2 +3x -7$. The filename must match the name of the function. If the ''quadratic.m'' function is in Matlab's current working directory, you'll be able to execute the function just like a regular Matlab built-in function, for example | ||
+ | |||
+ | <code> | ||
+ | >> quadratic(0) | ||
+ | ans = | ||
+ | -7 | ||
+ | |||
+ | >> quadratic(1) | ||
+ | ans = | ||
+ | -3 | ||
+ | |||
+ | >> quadratic(12.74) | ||
+ | ans = | ||
+ | 193.5276 | ||
+ | </code> | ||
+ | |||
+ | ===== example functions ===== | ||
+ | |||
+ | ==== sum the components of a vector ==== | ||
+ | This ''mysum'' function computes the sum of the components in the input vector $x$. There are a | ||
+ | number of extraneous print statements which show how the calculation works, step-by-step. | ||
+ | <file matlab mysum.m> | ||
+ | function s = mysum(x); | ||
+ | % compute the sum of the components of vector x | ||
+ | |||
+ | s = 0; % variable to hold partial sum | ||
+ | n = length(x); % get length of vector x | ||
+ | |||
+ | fprintf('Will need to do %d additions.\n\n', n); | ||
+ | | ||
+ | for i=1:n | ||
+ | fprintf('The current partial sum is s = %f.\n\n', s); | ||
+ | pause | ||
+ | fprintf('Add %f.\n', x(i)); | ||
+ | s = s + x(i); | ||
+ | end | ||
+ | | ||
+ | fprintf('The total sum is s = %f.\n', s); | ||
+ | pause | ||
+ | end | ||
+ | </file> | ||
+ | |||
+ | You can execute this function with on the input vector ''[4 2 9 1]]'' like this | ||
+ | <code> | ||
+ | >> mysum([4 2 9 1]) | ||
+ | Will need to do 4 additions. | ||
+ | |||
+ | The current partial sum is s = 0.000000. | ||
+ | |||
+ | Add 4.000000. | ||
+ | The current partial sum is s = 4.000000. | ||
+ | |||
+ | Add 2.000000. | ||
+ | The current partial sum is s = 6.000000. | ||
+ | |||
+ | Add 9.000000. | ||
+ | The current partial sum is s = 15.000000. | ||
+ | |||
+ | Add 1.000000. | ||
+ | The total sum is s = 16.000000. | ||
+ | ans = | ||
+ | 16 | ||
+ | >> | ||
+ | </code> | ||
+ | |||
+ | The function is a lot easier to read if you take out the print statements | ||
+ | |||
+ | <file matlab mysum.m> | ||
+ | function s = mysum(x); | ||
+ | % compute the sum of the components of vector x | ||
+ | |||
+ | s = 0; % variable to hold partial sum | ||
+ | n = length(x); % get length of vector x | ||
+ | |||
+ | for i=1:n % for each number i from 1 to n | ||
+ | s = s + x(i); % add x(i) to the partial sum | ||
+ | end | ||
+ | |||
+ | end | ||
+ | </file> | ||
+ | ==== compute the factorial ==== | ||
+ | |||
+ | This function computes $n!$, the factorial of $n$, according to the formula | ||
+ | |||
+ | \begin{eqnarray*} | ||
+ | n! = \prod_{i=1}^n i = 1\cdot 2 \cdot 3 \cdot \ldots \cdot (n-2) \cdot (n-1) \cdot n | ||
+ | \end{eqnarray*} | ||
+ | |||
+ | <file matlab myfactorial.m> | ||
+ | function p = myfactorial(n); | ||
+ | % compute factorial of n = 1 * 2 * ... (n-2)*(n-1)*n | ||
+ | |||
+ | p = 1; % variable to store partial products | ||
+ | | ||
+ | % each step through the loop does one more multiplication | ||
+ | % in the sequence of products 1, 1*2, 1*2*3, etc. | ||
+ | for i=1:n | ||
+ | p = p * i; | ||
+ | end | ||
+ | |||
+ | end | ||
+ | </file> |