computer science 121 scientific computing winter 2014 chapter 4 collections and indexing
Post on 25-Dec-2015
215 Views
Preview:
TRANSCRIPT
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 = [3 5 2 0 4 5 1];● Matlab can give us various stats about this data
>> sum(elmstreet) % total # residents
ans = 20
>> mean(elmstreet) % mean household size
ans = 2.8571
>> 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 = 0 0 0 1 0 0 0
● The find operator tells us the indices of the non-zero elements
>> find(elmstreet == 0)
ans = 4
>> find(elmstreet > 2)
ans = 1 2 5 6
>> find(elmstreet < 0)
ans = []
4.1 Indexing: First and last Elements
● First element has index 1 (unlike Java, C++)>> elmstreet
ans = 3 5 2 0 4 5 1
>> 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 = 3 2 4
>> elmstreet([1 3 5]) = -1
elmstreet = -1 5 -1 0 -1 5 1
4.1 Indexing: Extending a Vector
● Use end+1 to add an element at end of vector:>> elmstreet
ans = 3 5 2 0 4 5 1
>> elmstreet(end+1) = 8
elmstreet = 3 5 2 0 4 5 1 8
● If we go beyond end, Matlab fills gaps with 0's:>> elmstreet(12) = 9
elmstreet = 3 5 2 0 4 5 1 8 0 0 0 9
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 = 0 1 1
>> fib(end+1) = fib(end) + fib(end-1)
fib = 0 1 1 2
>> fib(end+1) = fib(end) + fib(end-1)
fib = 0 1 1 2 3
etc.
4.2 Matrices● We can store such data in a matrix:
>> elmstreet = [3 2 1 35000; 5 2 3 41000;
2 1 1 25000; 2 2 0 56000; 4 2 2 62000; 5 3 2 83000; 1 1 0 52000]
● 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 = 25000>> 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 = 56000 62000 52000
● Grab a whole row using colon notation
>> elmstreet(1, :) % whole first rowans = 3 2 1 35000
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] * 2ans = 2 4 6 8 10 12
14 16 18
● ... 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 .* bans = 1 0 3 0 0 6 7 8 0
● Of course, matrices must be same size for .*
>> [1 2 3; 4 5 6; 7 8 9] .* [3 4; 5 6]??? Error using ==> timesMatrix 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 = 1 3 1 0 2 2 0>> nokidshouses = find(children == 0)nokidshouses = 4 7>> incomenokids = ... elmstreet(nokidshouses, 4)incomenokids = 56000
52000>> mean (incomenokids)ans = 55000
● Some matrix operations yield a vector:
>> [r,c] = ... find (elmstreet >3 & elmstreet <= 5)
r = 2
56
c = 111
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 = 3pt =
x : 3
>> pt.name = ‘R.E. Lee'pt =
x: 3name: R.E. Lee
4.3 Mixed Data Types: Structures
● Structure arrays contain structures with similar contents:
>> people(3).name = 'Stimpy';>> people(3).IQ = 80people = 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
top related