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:55] gibson [functions] |
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 49: | Line 62: | ||
===== functions ===== | ===== functions ===== | ||
- | The Matlab **function** command lets you define your own functions. For example, | + | 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> | <file matlab quadratic.m> | ||
Line 57: | Line 71: | ||
</file> | </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, e.g. filename ''quadratic.m'' matches function name ''quadratic''. If the ''quadratic.m'' function is placed in Matlab's current working directory, you'll be able to execute the function just like a regular matlab built-in function, for example | + | 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> | <code> | ||
Line 72: | Line 86: | ||
193.5276 | 193.5276 | ||
</code> | </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> |