Computer Science 121 Scientific Computing Winter 2014 Chapter 4 Collections and Indexing
● We've seen two kinds of collection –Vector (sequence of numbers) –Text/string (sequence of characters) ● Two main issues –How to access individual elements of a collection –How to group related elements together (even when their types differ)
4.1 Indexing ● Consider census data for a single street: >> elmstreet = [ ]; ● Matlab can give us various stats about this data >> sum(elmstreet) % total # residents ans = 20 >> mean(elmstreet) % mean household size ans = >> max(elmstreet) % largest household size ans = 5 >> min(elmstreet) % smallest household size ans = 0
4.1 Indexing ● Some data may be bogus >> min(elmstreet) % smallest size ans = 0 ● Need to know bogus values, and where they “live” ● In general, need to know –Value of an element –Position (index) of the element
4.1 Indexing: find ● Recall boolean operators on vectors >> elmstreet == 0 ans = ● The find operator tells us the indices of the non-zero elements >> find(elmstreet == 0) ans = 4 >> find(elmstreet > 2) ans = >> find(elmstreet < 0) ans = []
4.1 Indexing: First and last Elements ● First element has index 1 (unlike Java, C++) >> elmstreet ans = >> elmstreet(1) ans = 3 ● Last element can be referenced by special end index >> elmstreet(end) ans = 1
4.1 Indexing: Subsequences ● Can use a vector of indices instead of a single index >> elmstreet([1 3 5]) ans = >> elmstreet([1 3 5]) = -1 elmstreet =
4.1 Indexing: Extending a Vector ● Use end+1 to add an element at end of vector: >> elmstreet ans = >> elmstreet(end+1) = 8 elmstreet = ● If we go beyond end, Matlab fills gaps with 0's: >> elmstreet(12) = 9 elmstreet =
Fibonacci Redux ● With vectors, we only need a single variable, line (versus three) to do Fibonacci: >> fib = [0 1]; >> fib(end+1) = fib(end) + fib(end-1) fib = >> fib(end+1) = fib(end) + fib(end-1) fib = >> fib(end+1) = fib(end) + fib(end-1) fib = etc.
4.2 Matrices ● Lots of data are best represented as tables:
4.2 Matrices ● We can store such data in a matrix: >> elmstreet = [ ; ; ; ; ; ; ] ● Household index is implicit (as row number)
4.2 Matrices ● Like length operator for vectors, size operator reports size of matrix: >> size(elmstreet) ans = 7 4 ● With matrices, we use two indices (instead of one) for referencing values: >> elmstreet(3, 4) ans = >> elmstreet(4, 3) ans = 0
4.2 Matrices ● As with vectors, can access part of matrix by using a vector of indices >> elmstreet([4 5 7], 4) ans = ● Grab a whole row using colon notation >> elmstreet(1, :) % whole first row ans =
4.2 Matrices ● Also works for columns: >> elmstreet(:, 1) % whole first col ans =
4.2 Matrices ● Recall that a scalar is a length-one vector >> length(7) ans = 1 ● A scalar is also a one-by-one matrix >> size(7) ans = 1 1
● As with a vector, we can do operations on a scalar and a matrix: >> [1 2 3; 4 5 6; 7 8 9] * 2 ans =
●... and element-by-element on two matrices: >> a = [1 2 3; 4 5 6; 7 8 9]; >> b = [1 0 1; 0 0 1; 1 1 0]; >> a.* b ans =
● Of course, matrices must be same size for.* >> [1 2 3; 4 5 6; 7 8 9].* [3 4; 5 6] ??? Error using ==> times Matrix dimensions must agree... And your socks don’t match either.
● We can get a lot of mileage by combining colon and other operations >> children = elmstreet( :, 3) children = >> nokidshouses = find(children == 0) nokidshouses = 4 7 >> incomenokids =... elmstreet(nokidshouses, 4) incomenokids = >> mean (incomenokids) ans = 55000
● Some matrix operations yield a vector: >> [r,c] =... find (elmstreet >3 & elmstreet <= 5) r = c = 1
4.3 Mixed Data Types ● Not all data is (are?) numerical:
4.3 Mixed Data Types ● We can't put text into a matrix >> smiths(1,1) = 'Emily' ??? Subscripted assignment dimensions mismatch… oh no you di’n’t! ● Because how do we know that next element ( 'George' ) will be same size? ● Old-school solution was to enforce fixed sizes for everything – led to Y2K problem!
4.3 Mixed Data Types: Structures ● Structures (a.k.a. Data Structures) allow us to put different types of data into the same collection: >> pt.x = 3 pt = x : 3 >> pt.name = ‘R.E. Lee' pt = x: 3 name: R.E. Lee
4.3 Mixed Data Types: Structures ● Structure arrays contain structures with similar contents: >> people(3).name = 'Stimpy'; >> people(3).IQ = 80 people = 1x3 struct array with fields: name IQ
4.3 Mixed Data Types: Structures ● Matlab fills in missing array members with empty structures: >> people(1) ans = name: [] IQ: []
4.3 Mixed Data Types: Cell Arrays ● A cell array is a matrix that can contain any type of data: >> people = {'Ren', 60;... 'Stimpy', 80;... 'Muddy', 100} people = ‘Ren' [ 60] 'Stimpy’ [ 80] 'Muddy' [100]
4.3 Mixed Data Types: Cell Arrays ● Cell array is referenced using curly braces {, } >> people{1, :} ans = Ren ans = 60
4.3 Mixed Data Types: Cell Arrays ● But if we want to store output values, we use ordinary parens: >> hs = people{1, :} ??? Illegal right hand side in assignment. Too many elements. Please make it stop... >> hs = people(1,:) hs = 'Ren' [60]