logical ops on arrays saving time / avoiding loops 1. logical operators 2. logical operations 3....

79
Logical Ops on Arrays Saving time / avoiding loops 1.Logical Operators 2.Logical Operations 3.Examples: numbers and letters 1

Upload: amos-martin

Post on 03-Jan-2016

224 views

Category:

Documents


0 download

TRANSCRIPT

General Idea Applied to arrays, this solves problems such as…

Find where the positives are positioned Count the number of negatives Delete the negatives, or maybe replace them by zeros Replace letters by other letters

In MATLAB, these can easily be solved in 1 or 2 lines, without the use of any loop and if statement (necessary in Java, C, C++..)

This is very useful in engineering, as tables of data always have to be filtered before use!

Note this is UNIQUE to MATLAB. No other software out there does this, so learn your loops and if statements anyway….

2

General Idea

Suppose an array of values (vector or matrix) exists. The values came from sensors on a rocket, on a robot, on a car, etc...

1. How many sensors gave negative values? 3

2. Which sensors returned negative values? #1 #5 #288

3. What were the actual negative values? 2003.2 100.2 552.45

3

General Idea

Suppose a document with letters, words and sentences. (An array of letters).

1. How many capital letters are there?

2. Extract the capital letters, keep them in order.

3. At what positions are the capital letters located?

4. Encrypt the document by changing all a's to z's?

4

General Idea Recall the relational and logical operators

(> >= < <= ~= == && ||)

Logical Operations return a: true – this can be evaluated as 1 false – this can be evaluated as 0

2>5 is false, and can be evaluated as 0

2==4 is false, and can be evaluated as 0

6>=0 is true, and can be evaluated as 1

7

General Idea Recall the relational and logical operators

(> >= < <= ~= == && ||)

Logical Operations return a: true – this can be evaluated as 1 false – this can be evaluated as 0

2>5 is false, and can be evaluated as 0

2==4 is false, and can be evaluated as 0

6>=0 is true, and can be evaluated as 1

X=4 %X is a scalar

0<=X && mod(X,2)==0 %positive and even

is ______, and can be evaluated as __8

General Idea Recall the relational and logical operators

(> >= < <= ~= == && ||)

Logical Operations return a: true – this can be evaluated as 1 false – this can be evaluated as 0

X= [ … ]; %X is a not a scalar

0<=X & mod(X,2)==0 %positive and even

9

In this section on arrays, only type 1 symbol: &, or |

“element-wise” AND, OR

Logical Operations

1. Suppose we want to know how many sensors gave negative values…

What operation can be done to count the number of negatives? ________ 10

When MATLAB applies an operation to each element in an array, we say that it is a “vector operation”.

Here, MATLAB evaluates the condition on each element and assigns a 1 when true, a 0 when false.

This creates a “logical vector”

Quick Summary To get a logical vector (mask):

result1 = (x>=0); % var=condition;result = 0 1 0 1 0 0 0 1

To get the indices:

result2 = find(x>=0); %var=find(condition);result = 2 4 8

To get the actual values:

result = x(result1); %use the logical vectorresult = x(result2); %use the positionsresult = x(x>=0); %use the condition

result = 34.2 55.5 9.9 21

Let's see examples…

Ex1 – Filtering Data

Wind tunnels are commonly used to measure pressure changes, velocities changes, etc… Some use powerful electronic sensors, some use HD cameras and dyes in the air, others (like ERAU lab) use manometers.

22

www.allamericanracers.com

http://ceit.uq.edu.au

www.trucktrend.com

AIRFLOW

Static Fluid Equation: ΔP = ρgh±h

Ex1 – Filtering the readings

% assume a vector of manometer reading

% h difference in millimeters: -500<values<500

% indicate which tubes may not have not-worked, and

% should be looked at (+/- 50 millimeter change)

%if at least 1 was bad

%display which tubes, and what were the readings

% calculate difference in pressure at each point… 24

Ex1 – Filtering the readings

% assume a vector of manometer reading

% h difference in millimeters: -500<values<500

ManoReadings = rand(1,20)*1000-500;

% indicate which tubes may not have not-worked, and

% should be looked at (+/- 50 millimeter change)

shouldBeFixed = find(-50<=ManoReadings & ManoReadings<=50);

if length(shouldBeFixed) ~=0 %if at least 1 was bad

%display which tubes, and what were the readings

end

% calculate difference in pressure at each point… 25

Ex1 – Filtering the readings

% assume a vector of manometer reading

% h difference in millimeters: -500<values<500

ManoReadings = rand(1,20)*1000-500;

% indicate which tubes may not have not-worked, and

% should be looked at (+/- 50 millimeter change)

shouldBeFixed = find(-50<=ManoReadings & ManoReadings<=50);

if length(shouldBeFixed) ~=0 %if at least 1 was bad

disp('These tube numbers did not change much:')

disp(shouldBeFixed)

disp('Their values were:')

disp(ManoReadings(shouldBeFixed))

end

% calculate difference in pressure at each point… 26

Ex1 – Complete the program…

% assume a vector of manometer reading

% h difference in millimeters: -500<values<500

ManoReadings = rand(1,20)*1000-500;

% indicate which tubes may not have not-worked, and

% should be looked at (+/- 50 millimeter change)

shouldBeFixed = find(-50<=ManoReadings & ManoReadings<=50);

if length(shouldBeFixed) ~=0 %if at least 1 was bad

disp('These tube numbers did not change much:')

disp(shouldBeFixed)

disp('Their values were:')

disp(ManoReadings(shouldBeFixed))

end

% calculate difference in pressure at each point… 28

Replace by readings from machine!

Ex2 – Sum all the positive evens

% Suppose have a vector x of integers

% Determine where "numbers is even" is true

whereTrue = (mod(x,2)==0 & x>=0);

% Add up all the values that were even

result = sum(x(whereTrue));

30

Use element-wise AND

Ex2 – Sum all the positive evens

% Suppose have a vector x of integers

% Determine where "numbers is even" is true

whereTrue = (mod(x,2)==0 & x>=0);

% Add up all the values that were even

result = sum(x(whereTrue));

OR

% Suppose have a vector x of integers

% find the POSITIONS of the positive even numbers

% in x, sum the numbers at these positions

31

Use element-wise AND

Ex2 – Sum all the positive evens

% Suppose have a vector x of integers

% Determine where "numbers is even" is true

whereTrue = (mod(x,2)==0 & x>=0);

% Add up all the values that were even

result = sum(x(whereTrue));

OR

% Suppose have a vector x of integers

% find the POSITIONS of the positive even numbers

positions = find(mod(x,2)==0 & x>=0);

% in x, sum the numbers at these positions

result = sum(x(positions)); 32

Use only 1 symbol for AND and OR.

Ex3 – How about matrices?

34

Part Number UnitPrice ($)

101 3.25

65 20.50

290 56.00

450 1.75

The client orders 100 pieces of part number 65. How much is his total bill, with a tax of 6.5%? The part number and quantity can change, hard coding is not an option!

Ex3 – Analyze table, cont.

%ask user for part number, and quantitypart_number = input('Enter part number: ');quantity = input('Enter quantity: ');

%find the row of that part number

%in table, get the actual unit price

%calculate sub-total

%add in taxes .

35

Ex3 – Analyze table, cont.

%ask user for part number, and quantitypart_number = input('Enter part number: ');quantity = input('Enter quantity: ');

%find the row of that part number[row, col] = find(table == part_number);

%in table, get the actual unit price

%calculate sub-total

%add in taxes .

36

>> [row, col] = find(table == part_number)row = 2col = 1

Ex3 – Analyze table, cont.

%ask user for part number, and quantitypart_number = input('Enter part number: ');quantity = input('Enter quantity: ');

%find the row of that part number[row, col] = find(table == part_number);

%in table, get the actual unit priceunit_price = table(row,2);

%calculate sub-total

%add in taxes .

37

Ex3 – Analyze table, cont.

%ask user for part number, and quantitypart_number = input('Enter part number: ');quantity = input('Enter quantity: ');

%find the row of that part number[row, col] = find(table == part_number);

%in table, get the actual unit priceunit_price = table(row,2);

%calculate sub-totalsub_total = quantity * unit_price;

%add in taxestotal_bill = sub_total * (1+0.65);fprintf('Your bill adds up to: $%20.2f\n', total_bill)

38

Ex3 – Analyze table, cont.

Note that this would not go well if the part_number's value is actually also one of the unit price!

40

>> [row, col] = find(table == part_number)row = 2 3

col = 1 2

Part Number UnitPrice ($)

101 3.25

65 20.50

290 65.00

450 1.75

Ex3 – Analyze table, cont.

Note that this would not go well if the part_number's value is actually also one of the unit price!

%find the row of that part number, column1 ONLYrow = find(table == part_number);

41

>> [row, col] = find(table == part_number)row = 2 3

col = 1 2

Part Number UnitPrice ($)

101 3.25

65 20.50

290 65.00

450 1.75

That's SLICING again!

(:,1)

Ex4 – Works for strings too!

43

Using a loop, and an if statement

originalDNA ='GATACCAT';

matchDNA = []; %empty container for the matching DNA

%loop for each letter

for ctr = 1:length(originalDNA)

if originalDNA(ctr) == 'T' %Where it is a 'T', make the 'A'

matchDNA(ctr)='A';

elseif originalDNA(ctr) == 'A'

matchDNA(ctr)='T';

elseif originalDNA(ctr) == 'C'

matchDNA(ctr)='G';

elseif originalDNA(ctr) == 'G'

matchDNA(ctr)='C';

end

end

Ex4 – Works for strings too!

44

Using a loop, and an if statement

originalDNA ='GATACCAT';

matchDNA = []; %empty container for the matching DNA

%loop for each letter

for ctr = 1:length(originalDNA)

if originalDNA(ctr) == 'T' %Where it is a 'T', make the 'A'

matchDNA(ctr)='A';

elseif originalDNA(ctr) == 'A'

matchDNA(ctr)='T';

elseif originalDNA(ctr) == 'C'

matchDNA(ctr)='G';

elseif originalDNA(ctr) == 'G'

matchDNA(ctr)='C';

end

end

length() is used to count the number of elements in a vector, here: number of characters

Ex4 – Works for strings too!

47

originalDNA =GATACCAT

matchDNA = A A

matchDNA = TAT TA

Or.. In 5 lines!

originalDNA ='GATACCAT'

%at the T's location, put an 'A'

matchDNA(originalDNA =='T')='A'

%at the A's location, put a T

matchDNA(originalDNA =='A')='T'

Ex4 – Works for strings too!

48

originalDNA =GATACCAT

matchDNA = A A

matchDNA = TAT TA

matchDNA =CTAT TA

matchDNA =CTATGGTA

Or.. In 5 lines!

originalDNA ='GATACCAT'

%at the T's location, put an 'A'

matchDNA(originalDNA =='T')='A'

%at the A's location, put a T

matchDNA(originalDNA =='A')='T'

%at the G's location, put a C

matchDNA(originalDNA =='G')='C'

%at the C's location, put a G

matchDNA(originalDNA =='C')='G'

Wrapping Up The OR and AND operators are slightly updated What does it mean: To “evaluate” True can be evaluated as 1 False can be evaluated as 0 Logical vectors are vectors of 0's and 1's. find(condition) returns a numerical vector of positions where

the condition is true. 3 methods to access (to refer to) the actual elements It works with letters too. (encryption) The keyword end (nothing to do with the if/switch/for/while) refers to

the last element in the array. (note it will be black, not blue!)

50

1. Definition

A file I/O function is considered HIGH-LEVEL if in ONE SINGLE COMMAND, it 1. Opens the file

2. Grabs the data

3. Stores it in variables

4. Closes the file

High-level functions can be used to:1. Load data from external sources (INPUT)

2. Save data back to a file (OUTPUT)

52

2. Wait.wait.wait…

Before you decide if using a high level function is possible, evaluate the following:

1. What type of file is it? (Excel, text, jpg..)

2. Find the organization overall (data in rows, or data in columns, data placed all over the place…)

3. Recognize the delimiters (space, tabs, new lines, -, :, / any specific symbol. What makes it obvious it is a new column? What makes it obvious it is a new row?)

4. Recognize the data types (all numerical? all strings? Or combination of both)

53

3. xlsread(), cont.

txt =

19 78

22 83

98 99

21 56

23 89

19 51

65

nbs =

'Name' 'Age' 'Grade'

'Fred' '' ''

'joe' '' ''

'SaLLy' '' ''

'CharliE' '' ''

'mary' '' ''

'Ann' '' ''

raw =

'Name' 'Age' 'Grade'

'Fred' [ 19] [ 78]

'joe' [ 22] [ 83]

'SaLLy' [ 98] [ 99]

'CharliE' [ 21] [ 56]

'mary' [ 23] [ 89]

'Ann' [ 19] [ 51]

>> [txt nbs raw] = xlsread('grades.xlsx‘)

Variable names are up to the programmer. If named badly by mistake… BAD.

The order of the return values is important.

3. xlsread(), cont.

Simply omit the 2nd and 3rd return value to collect only numerical values.values = xlsread(‘grades.xlsx’);

If a project needs all the data together, collect the 1st and 2nd return values into a dummy variable.[trash trash data] = xlsread(‘grades.xlsx’);

67

3. xlsread(), cont.

Simply omit the 2nd and 3rd return value to collect only numerical values.values = xlsread(‘grades.xlsx’);

If a project needs all the data together, collect the 1st and 2nd return values into a dummy variable.[trash trash data] = xlsread(‘grades.xlsx’);

If there happen to be ‘holes’ in the spreadsheet, MATLAB fills it with a NaN value (not a number). The function isnan() can help determine where those ‘holes’ are.

68

4. xlswrite()

Arrays can also be written to excel sheets:

xlswrite(<filename>, <array>, <sheet>, <range>)

The <sheet> and <range> arguments are optional.

70

clcclear %create phony datatable = rand(5,3)*100; %print to excelxlswrite('testingTesting.xls',table)

5. Using Delimiters

Rows are delimited by the new line character (enter key, invisible to the human eye).

Columns are delimited by the same delimiter each time: Default delimiters: commas, and white space Other delimiters: any other symbol : - /

F1 = help

72

dlmwrite()

By default, dlmwrite() saves files using Unix line endings – so if you look at the file in Notepad:

This is not “wrong” – just different. This can be changed by setting the “newline” attribute when you call the function:

dlmwrite('test.txt', M, ',', 'newline', 'pc');

79