The function call mechanism in the current version of MATLAB is pretty expensive, for any kind of function. One of the most important tasks facing our...

0 downloads 0 Views 2MB Size

Loading...

© 2007 The MathWorks, Inc.

Advanced Programming Techniques in MATLAB®

Agenda MATLAB and memory What you as a programmer should know Passing arrays How structures use memory

Functions of all types Introduction/Review of MATLAB function types Applications of new nested functions Solving optimization problems Building a graphical user interface for volume visualization Building 2-figure GUIs (Optional)

2

SH1

MATLAB and Memory Passing arrays to functions When does MATLAB copy memory?

function y = foo(x,a,b) a(1) = a(1) + 12; y = a*x+b; Calling foo

y = foo(1:3,2,4) i.e., x = 1:3, a = 2, b = 4

>> edit foo.m 3

Slide 3 SH1

Show foo. Run it. Nothing exciting happens, but it's more interesting and pacing is better when watching you work in ML instead of talking to a slide. Scott Hirsch, 1/12/2007

In-place Optimizations When does MATLAB do calculations “in-place”?

x = 2*x + 3; y = 2*x + 3;

4

In-place Optimizations When does MATLAB do calculations “in-place”?

function testInPlace x = randn(n,1); x = myfunc(x); % vs. y = myfunc(x) x = myfuncInPlace(x); % vs. y = myfuncInPlace(x) function x = myfuncInPlace(x) x = sin(2*x.^2+3*x+4); function y = myfunc(x) y = sin(2*x.^2+3*x+4); >> edit myfuncInPlace myfunc testInPlace % separate functions, separate files

5

Memory Used for Different Array Types d = [1 2] dcell = {d} dstruct.d = d

% Double array % Cell array containing

whos

>> edit overhead.m

6

MATLAB and Memory How does MATLAB store structures? s.A = rand(3000,3000); s.B = rand(3000,3000); sNew = s; s.A(1,1) = 17;

>> edit structmem1.m 7

MATLAB and Memory How does MATLAB store structures? im1.red = redPlane; % each plane is m x n im1.green = greenPlane; im1.blue = bluePlane; versus

% each 1x3 im2(1,1).pixel = [red(1) green(1) blue(1)]; im2(2,1).pixel = [red(2) green(2) blue(2)]; ... im2(m,n).pixel = [red(m*n) green(m*n) … blue(m*n)];

>> edit structmem2.m 8

Summary of MATLAB and Memory How MATLAB passes arrays to functions By value, with “lazy” copy or copy on write In-place optimization code pattern

Memory use in array storage Atomic types vs. cell arrays and structures Array of structs vs. struct arrays i.e., s(300,300).red vs. s.red(300,300)

9

MATLAB and Memory: Additional Resources Recorded Webinar: Handling Large Data Sets Efficiently in MATLAB mathworks.com -> Recorded Webinars

Memory Management Guide (Tech Note 1106) Search mathworks.com for “1106”

10

Functions

Everything you wanted to know, but were afraid to ask

11

A comp.soft-sys.matlab Post Question: With the new function types introduced in R14, I am curious as to which methods would be preferable from a speed standpoint. We have: 1. Functions defined in separate files 2. Subfunctions 3. Inline functions 4. Anonymous functions 5. Nested functions

Other than scope, persistence, or program structure, is there some difference that makes MATLAB work better with the type?

12

comp.soft-sys.matlab Post Answered Cleve’s Answer Good question, and a hard one to answer. As MATLAB evolves, the answer will change. The function call mechanism in the current version of MATLAB is pretty expensive, for any kind of function. One of the most important tasks facing our Accelerator/JIT team today is to make function calls faster. This is why we have introduced the @ notation for both function handles and anonymous functions. Future versions of MATLAB should have improved speed for anything involving the @ sign. Inline functions were an experiment in the use of the overloading mechanism that turned out to be useful. But we've always regarded them as a bit of a hack. So our advice now is to phase out their use over time. Other than that, your choice today among the other kinds of functions should be based on style and convenience.

13

Function Quiz Let’s see how much you know about functions in MATLAB This quiz covers Anonymous functions Nested functions Function handles Regular (“simple”) functions Subfunctions

This quiz does not cover MEX functions, private functions, … 14

Function Quiz Review

Regular (“simple”) functions Function handles Anonymous functions Subfunctions Nested functions

Q: Which of these function types can be combined in a single file?

15

Nested Function Applications Solving optimization problems Building a graphical user interface for volume visualization Building 2-figure GUIs (Optional)

16

Application 1: Solving Optimization Problems We get many posts on comp.soft-sys.matlab about optimization. The problems fall into several catgories. The one we will address to today is: How to include extra parameters to define the objective function

17

Optimization Example (unconstrained) Objective function: a x1^2 + b x1 x2 + c x2^2 + d abs(x2 – x1)+ e*randn a,b,c – “Regular” parameters d,e – Additional parameters that might alter the type of problem by making the objective function either non-smooth (d) or stochastic (e)

>> edit optimS.m optimAnon.m

18

Optimization Example Using Subfunctions

19

Optimization Example Using Nested Functions Use nested functions in place of subfunctions Start with code in optimS1.m (end up with code in optimN.m) Simplify the interfaces, with nesting Objective function function f = objfun(x) Output function function stop

= ... myoutputfcn(x,optimvalues,state)

>> edit optimS1.m

20

Application 2: Building a Graphical User Interface for Volume Visualization Application: Building a custom

tool for volume visualization This example illustrates: Using function handles to export

nested functions Using nested functions for object callbacks

21

Application 3 (Optional): Creating Two-Figure GUIs This is a frequent comp.soft-sys.matlab request (several times each month). Challenges: Managing handles Sharing information between figures

Nested functions can simplify and improve performance.

>> edit redBlueN 22

Red-Blue Exercise

Start with code in redBlueN2.m Change so there are 2 figures, "Blue" button in one figure "Red" in the other

Have each button change the color of BOTH figures

23

Red-Blue Exercise Solution

Create a second figure Change the parent for one of the buttons Change the callback

24

Why Use Nested and Anonymous Functions?

Benefits of nested and anonymous functions More robust Changes in path cause fewer problems with function handles Data sharing and number of copies of data Memory savings, especially for large shared data Program structure Over time, higher performance Additional benefits of nested (and sub) functions Scope and persistence Reduce variable and function namespace clutter 25

Function Usage Advice You can now (as of Release 14) call functions without inputs using

this notation: y = foo(); Put all nested functions at the bottom of the enclosing function. You

may prefer to have them defined right where you will use them, but this can become unwieldy. Place a comment next to a call to a nested function stating what

workspace variables are altered by the call (since the nested function can see the enclosing workspace).

26

More Function Usage Advice Nested functions are good when there is significant shared

information (many pieces or large arrays). Nested functions are very good when there is much large data to

share for reading and writing. Subfunctions (or private functions) are useful when users don't need

these directly. Those who need them can see. Data sharing inside subfunctions is only reading large arrays, not

making copies and changing them.

27

MATLAB Function Types: Additional Resources MATLAB Digest - September 2005 Dynamic Function Creation with Anonymous and Nested Functions

http://www.mathworks.com/company/newsletters/digest/2005/ sept/dynfunctions.html

Examples Anonymous functions

http://www.mathworks.com/products/matlab/demos.html?file=/products/dem os/shipping/matlab/anondemo.html

Nested Functions

http://www.mathworks.com/products/matlab/demos.html?file=/products/dem os/shipping/matlab/nesteddemo.html

The Art of MATLAB Blog Look at Category: Function Handles

http://blogs.mathworks.com/loren/

28

Summary MATLAB memory usage When is data copied Nested and anonymous functions Very good at data encapsulation Efficient for sharing memory between functions Another choice for name / variable scope Less clutter on MATLAB path

29