--- tags: Matlab Workshop --- # Lesson 3: Loops :::info There are two types of loops: - `for` loop: for statements loop **a specific number of times**, and keep track of each iteration with an incrementing index variable. - `while` loop: while statements **loop as long as a condition remains true.** ::: ## 1. `for` and `while` loop A `for` loop is a programming construct that allows you to execute a block of code repeatedly, **with a fixed number of times**. It is used to iterate over a sequence of elements, such as an array, list or matrix. ```matlab for i = 1:3 disp(i); end % output: 1 2 3 ``` As for the `while` loop, once the **condition is true**, the looping block is executed repeatedly. ```matlab i = 0; % initial value while i < 3 i = i + 1; disp(i); end % output: 1 2 3 ``` :::warning ### Example 1 Using `for` loop to do summation. Calculate the result for 1 + 2 + 3 + ... + 10 = ? ```matlab %Initialization n = 10; sum = 0; for i = 1:n % sum = sum + i; disp(sum) end ``` Using `while` loop to do summation. Calculate the result for 1 + 2 + 3 + ... + 10 = ? ```matlab n = 10; sum = 0; i = 0; % Initialize the counter while i < n i = i + 1; sum = sum + i; disp(sum) end ``` ::: :::warning ### Example 2 Here, we go back to our previous example in the if-else statement workshop. How can you apply `for` or `while` loop? ```matlab! % Define nucleotide sequences as a list of character seq1 = ['A', 'C', 'G', 'T', 'A', 'C']; % ACGTAC seq2 = ['A', 'C', 'G', 'A', 'A', 'T']; % ACGAAT % Check if the sequences are of the same length if length(seq1) ~= length(seq2) disp('Error: Sequences must be of the same length.'); else % Use for/while loop to count the mismatch ... end ``` [Here](https://hackmd.io/k4ni6ad7TRKt85VCPVQmeg?both)'s the place that you can put your code. ::: :::success ### Take-home exercise Calculate the geometric series 1 * 2 * 3 * ... * 5 using loops ::: ### Terminating condition ### :::danger To prevent an infinite loop using `while` loop, ensure the loop's condition becomes `false` at some point. If the condition remains true indefinitely, the program will get stuck in an endless loop. ```matlab i = 0; while i >= 0 i = i + 1; fprintf("%d\n", i); end % program would not stop ``` If you inadvertently create an infinite loop (a loop that never ends on its own), stop execution of the loop by pressing **`Ctrl+C`**. ::: ## 2. Loop control | Control Statement | Purpose | |-------------------|----------------------------------| | `break` | Stops the loop manually when a condition is met. | | `continue` | Skips the current iteration when a condition is met. | Using `break` ... ```matlab i = 0; while i < 3 i = i + 1; if i == 2 break; % Exit the loop when i equals 2 end disp(i); end % output: 1 ``` Using `continue` ... ```matlab i = 0; while i < 3 i = i + 1; if i == 2 continue; % Skip the current iteration when i equals 2 end disp(i); end % output: 1 3 ``` :::warning ### Example 3 After doing multiple sequence alignment using a pool of sequences (`seqA`, `seqB`, `seqC`, `seqD`, ...) having a length of 8 nucleotides, we want to find the sequences (i.e., `seqB`, `seqC`, `seqD`,...) that does not contain any **gap** and have more than 3 matches with `seqA` (we call this `valid_sequences`). ```matlab % Define sequences seqA = 'ACGTACGT'; % Reference sequence sequences = {'AGGCACCT', 'ACCTCCGA', 'ACGTA--T', 'AAGTACGT', 'ACGTGCGT', '--G-C---'}; % Initialize a cell array to store valid sequences valid_sequences = {}; for i = 1:length(sequences) current_seq = sequences{i}; % Check current_seq has `gap` if ... end % Count matches with seqA matches = 0 for/while ... % Check the number of matches is larger than 3 if matches > 3 ... end end end % Display valid sequences disp('Valid sequences without gaps and with more than 3 matches:'); disp(valid_sequences); ``` [Here](https://hackmd.io/k4ni6ad7TRKt85VCPVQmeg?edit)'s the place that you can put your code. :::spoiler HELLO ```matlab= % Define sequences seqA = 'ACGTACGT'; % Reference sequence sequences = {'AGGCACCT', 'ACCTCCGA', 'ACGTA--T', 'AAGTACGT', 'ACGTGCGT', '--G-C---'}; % Initialize a cell array to store valid sequences valid_sequences = {}; for i = 1:length(sequences) current_seq = sequences{i}; % Check for gaps if contains(current_seq, '-') continue; % Skip sequences with gaps end % Initialize match counter matches = 0; % Count matches with seqA for j = 1:length(seqA) if seqA(j) == current_seq(j) matches = matches + 1; % Increment match counter end % Break if matches exceed 3 if matches > 3 valid_sequences{end+1} = current_seq; % Store valid sequence break; % Exit the inner loop end end end ``` ::: :::success ### Take-home exercise Assume x>0 and x is an integer, find the minimum x that statisfies ```x^2 - 27x + 170 = 0``` ::: ## 3. Useful info: Nested Loops Just like if-else statements, we can nest as many loops as we want. ```matlab for i = 0:2 for j = 0:1 fprintf("%d %d\n", i, j); end end % output 0 0 0 1 1 0 1 1 2 0 2 1 ``` :::info ### Exercise #### Multiplication Table Print Nine-Nine Multiplication Table (九九乘法表) ```matlab for i = ... for j = ... fprintf(...) end end % You should print 1 x 1 = 1 1 x 2 = 2 1 x 3 = 3 ... 9 x 9 = 81 ``` ::: :::success ### Take-Home Exercise #### Prime Number Print all the prime numbers ranging from 2 to 100 ```matlab <solution> for num = 2:100 % we check whether "num" is a prime number % check prime by looping through all factors is_prime = true; for divisible_factor = 2:num-1 if mod(num, divisible_factor) == 0 % whole division is_prime = false; break; end end % print the prime number if is_prime fprintf("%d\n", num); end end ``` :::