matlab programming - wikibooks

60
MATLAB Programming/Print Version Chapter 1: A Tutorial Introduction Chapter 2: Basic MATLAB Concepts The Current Directory and Defined Path It is necessary to declare a current directory before saving a file, loading a file, or running an M-file. By default, unless you edit the MATLAB shortcut, the current directory will be .../MATLAB/work. After you start MATLAB, change the current directory by either using the toolbar at the left-hand side of the screen, or entering the path in the bar at the top. The current directory is the directory MATLAB will look in first for a function you try to call. Therefore if you have multiple folders and each of them has an M-file of the same name, there will not be a discrepancy if you set the current directory beforehand. The current directory is also the directory in which MATLAB will first look for a data file. If you still want to call a function but it is not part of the current directory, you must define it using MATLAB's 'set path' utility. To access this utility, follow the path: file > set path... > add folder... You could also go to "add folder with subfolders...", if you're adding an entire group ,as you would if you were installing a toolbox. Then look for and select the folder you want. If you forget to do this and attempt to access a file that is not part of your defined path list, you will get an 'undefined function' error. Saving Files There are many ways to save to files in MATLAB. save - saves data to files, *.mat by default uisave - includes user interface hgsave - saves figures to files, *.fig by default diary [filename] - saves all the text input in the command window to a text file. All of them use the syntax: save filename.ext or similar for the other functions. The files are saved in your current directory, as seen on the top of the window. By default the current directory is .../MATLAB/work. Loading Files Likewise, there are many ways to load files into the workspace. One way is to use the "file" menu. To open a .m file click "open", whereas to import data from a data file select "import data..." and follow the wizard's instructions. An alternative way to load a saved .mat file (within a function, for example) is to type: >> load filename.ext The file must be in a recognized directory (usually your current directory, but at least one for which the path has been set). The data in the .mat file is stored with the same name as the variable originally had when it was saved. To get the name of this and all other environment variables, type "who". To open an .m file, you can use file -> open, or type >>open filename.ext File Naming Constraints You can name files whatever you want (usually simpler is better though), with a few exceptions:

Upload: sethuchidambaram

Post on 23-Oct-2014

262 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: MATLAB Programming - Wikibooks

MATLAB Programming/Print Version

Chapter 1: A Tutorial Introduction

Chapter 2: Basic MATLAB Concepts

The Current Directory and Defined Path

It is necessary to declare a current directory before saving a file, loading a file, or running an M-file. By default, unless you edit the MATLAB shortcut, thecurrent directory will be .../MATLAB/work. After you start MATLAB, change the current directory by either using the toolbar at the left-hand side of thescreen, or entering the path in the bar at the top.

The current directory is the directory MATLAB will look in first for a function you try to call. Therefore if you have multiple folders and each of them hasan M-file of the same name, there will not be a discrepancy if you set the current directory beforehand. The current directory is also the directory in whichMATLAB will first look for a data file.

If you still want to call a function but it is not part of the current directory, you must define it using MATLAB's 'set path' utility. To access this utility, followthe path:

file > set path... > add folder...

You could also go to "add folder with subfolders...", if you're adding an entire group ,as you would if you were installing a toolbox. Then look for andselect the folder you want. If you forget to do this and attempt to access a file that is not part of your defined path list, you will get an 'undefined function'error.

Saving Files

There are many ways to save to files in MATLAB.

save - saves data to files, *.mat by defaultuisave - includes user interface

hgsave - saves figures to files, *.fig by defaultdiary [filename] - saves all the text input in the command window to a text file.

All of them use the syntax:

save filename.ext

or similar for the other functions. The files are saved in your current directory, as seen on the top of the window. By default the current directory is.../MATLAB/work.

Loading Files

Likewise, there are many ways to load files into the workspace. One way is to use the "file" menu. To open a .m file click "open", whereas to import datafrom a data file select "import data..." and follow the wizard's instructions.

An alternative way to load a saved .mat file (within a function, for example) is to type:

>> load filename.ext

The file must be in a recognized directory (usually your current directory, but at least one for which the path has been set).

The data in the .mat file is stored with the same name as the variable originally had when it was saved. To get the name of this and all other environmentvariables, type "who".

To open an .m file, you can use file -> open, or type

>>open filename.ext

File Naming Constraints

You can name files whatever you want (usually simpler is better though), with a few exceptions:

Page 2: MATLAB Programming - Wikibooks

MATLAB for Windows retains the file naming constraints set by DOS. The following characters cannot be used in filenames:

" / : * < > | ?

You're not allowed to use the name of a reserved word as the name of a file. For example, while.m is not a valid file name because while is one ofMATLAB's reserved words.

When you declare an m-file function, the m-file must be the same name as the function or MATLAB will not be able to run it. For example, if you

declare a function called 'factorial':

function Y = factorial(X)

You must save it as "factorial.m" in order to use it. MATLAB will name it for you if you save it after typing the function declaration, but if

you :change the name of the function you must change the name of the file manually, and vice versa.

Introduction

MATLAB is interesting in that it is dynamically compiled. In other words, when you're using it, you won't run all your code through a compiler, generatean executable, and then run the executable file to obtain a result. Instead, MATLAB simply goes line by line and performs the calculations without theneed for an executable.

Partly because of this, it is possible to do calculations one line at a time at the command line using the same syntax as would be used in a file. It's evenpossible to write loops and branches at the command line if you want to! Of course this would lead to a lot of wasted effort a lot of the time, so doinganything beyond very simple calculations, testing to see if a certain function, syntax, etc. works, or calling a function you put into an .m file should be donewithin an .m file.

Calculator

MATLAB, among other things, can perform the functions of a simple calculator from the command line. Let us try to solve a simple problem: Sam's car'sodometer reading was 3215 when he last filled the fuel tank. Yesterday he checked his odometer and it read 3503. He filled the tank and noticed that ittook 10 gallons to do that. If his car's gas tank holds 15.4 gallons, how long can he drive before he is going to run out of gas, assuming the gas mileage isthe same as before?

First let us compute the distance Sam's car has travelled in between the two gas fillings

>> 3503-3215

ans =

288

Gas mileage of Sam's car is

>> 288/10

ans =

28.8

With this, he can drive

>> 28.8 * 15.4

ans =

443.5200

443.52 miles before he runs out of gas.

Let us do the same example, now by creating named variables

>> distance = 3503-3215

distance =

288

>> mileage = distance/10

mileage =

28.8000

>> projected_distance = mileage * 15.4

projected_distance =

443.5200

To prevent the result from printing out in the command window, use a semicolon after the statement. The result will be stored in memory. You can thenaccess the variable by calling its name. Example:

Page 3: MATLAB Programming - Wikibooks

>>projected_distance = mileage * 15.4;

>>

>>projected_distance

projected_distance =

443.5200

Using the command line to call functions

The command line can be used to call any function that's in a defined path. To call a function, the following general syntax is used:

>> [Output1, Output2, ..] = functionname(input1, input2,..)

MATLAB will look for a file called functionname.m and will execute all of the code inside it until it either encounters an error or finishes the file. If theformer is true, you'll hear an annoying noise and will get an error message in red. In the latter case, MATLAB will relinquish control to you, which you cansee when the >> symbol is visible on the bottom of the workspace and the text next to "start" button on the bottom-left of the screen says "ready".

Use this in order to call homemade functions as well as those built into MATLAB. MATLAB has a large array of functions, and the help file as well as thiswikibook are good places to look for help on what you need to provide as inputs and what you will get back.

BE CAREFUL because the syntax for functions and for indexing arrays is the same! To avoid confusion, just make sure you don't name a variable thesame as any function. To ensure this, type the name of the variable you want to define in the command prompt. If it tells you:

Error using ==> (functionname)

Not enough input arguments.

then you'll have a conflict with an existing function. If it tells you:

??? Undefined function or variable '(functionname)'

you'll be OK.

External Resources

ControlTheoryPro.com (http://wikis.controltheorypro.com/index.php?title=Basic_Tutorial)

Reading and Writing from a file: Command Line

Reading and Writing data from/to a .mat file

The quickest means of saving and retrieving data is through the binary .mat file format MATLAB provides. This is the native format for MATLAB.

Note: This author has had some problems with certain classes not being saved correctly when saving data using version 7 for use in version 6. Mostdata items will work just fine. Of particular interest was an issue with State-Space objects that were saved using version 7 to a version 6

compatible file. When the file was opend in MATLAB version 6+ the State-Space objects did not load.Spradlig (talk) 04:52, 31 March 2008

(UTC).

Saving Data

The save command is used to save workspace data to a file.

Save all workspace data to the file mySave.mat in the current directory.

>> save('mySave.mat')

>> save(fullfile(pwd, 'mySave.mat'))

Save just the variables myData1 and myData2 to mySave.mat.

>> save('mySave.mat', 'myData1', 'myData2')

Save all myData variables to mySave.mat.

Page 4: MATLAB Programming - Wikibooks

>> save('mySave.mat', 'myData*')

Save all myData variables to a mySave.mat file compatible with version 6 of MATLAB.

>> save('mySave.mat', 'myData*', '-v6')

Save all myData variables to an ASCII file.

>> save('mySave.txt', 'myData*', '-ASCII')

Append new variables to the data file.

>> save('mySave.mat', 'newData*', '-append')

Loading Data

The load command is used to load data from a file into the current workspace.

Load all variables from the file mySave.mat into the current workspace.

>> load('mySave.mat')

>> load(fullfile(pwd, 'mySave.mat'))

Load just the variables myData1 and myData2.

>> load('mySave.mat', 'myData1', 'myData2')

Load all myData variables.

>> load('mySave.mat', 'myData*')

Get a cell array of variables in saved file.

>> whos('-file', 'mySave.mat')

Reading and Writing from an Excel spreadsheet

Since analyzing data is one of the more common motivations for using input output I will start with reading and writing from a spreadsheet. I cover thecommand line first since it is often necessary to import the data while an m-function is being evaluated.

MATLAB makes it easy to read from an Excel spreadsheet. It has the built in command "xlsread". To use the xlsread function use the syntax:

>>g=xlsread('filename');

This line of code reads filename.xls (from the current directory) and places it in an identical array inside MATLAB called g. You can then manipulate thearray g any way you want. Make sure that the file you choose is in the same directory were you save your M-files (usually the work directory) otherwiseyou get an error. You can specify the path to a file but, this can get messy.

To write data to an .xls the procedure is very similar. The xlswrite command below creates a spreadsheet called filename.xls in the current directoryfrom the variable g:

>> xlswrite('filename',g);

NOTE: if you are using MATLAB 6.5 there is no "xlswrite" command (that I'm aware of). There are several ways to write to a file. The simplest way Ihave found is

fid=fopen('newFile.xls', 'w');

fprintf(fid,'%6.3f %6.3f %10.3f\n', g);

fclose(fid);

You can substitute newFile.xls with .txt. Also, there might be some issues with formatting in Excel. The formatting issues can usually be handled insideExcel but if they can't you might have to play around with the fopen command parameters. This is pretty similar (if not the same) way you would write to afile in C.

Page 5: MATLAB Programming - Wikibooks

Reading and Writing from and to other text files

If a file is not an excel spreadsheet, it can still be read using "load" function:

>> load newfile.txt

This works only if the text is entirely numerical, without special formatting. Otherwise you get a 'unrecognized character' error.

The easiest way to write to a non-excel file, or using MATLAB 6.5 or less, is to use the same code as that for writing excel files but change the extension.Usually there are no formatting difficulties with plain text files.

For reading more general text files, MATLAB does not have a function to do it easily (unless you have excel), but you can read very general text files(with different delimiters for both cells and text within cells) using the "textread.m" function in the MATLAB file exchange (do a google search to find it).You can also try to use fscanf if the formatting is consistent enough (i.e. consistent numbers of spaces, no mixing of strings and numbers in columns, and soon).

Reading and Writing from a data file: GUI

MATLAB contains a nice GUI application that will guide you through importing data from any recognized data file (usually .mat, .txt, or .xls on aWindows system). To use it, go to file > import data, and select the file you want. Then, choose what column separators are present (by selecting theappropriate radio button). Finally, click "next".

MATLAB saves the variable under a name similar to that of the file, but with modifications to make it conform with MATLAB syntax. Spaces areomitted, plusses and minuses are turned into other characters. To see the name MATLAB generated (and probably change it) type "who" in the commandprompt.

External Resources

ControlTheoryPro.com (http://wikis.controltheorypro.com/index.php?title=Category:MATLAB)

MatlabCodes.Webs.com (http://matlabcodes.webs.com?title=Category:MATLAB)

Chapter 3: Data Storage and Manipulation

Data Types and Operations on Point Values

Introduction

A large number of MATLAB's functions are operations on two types of numbers: rational numbers and boolean numbers.

Rational numbers are what we usually think of when we think of what a number is. 1, 3, and -4.5 are all rational numbers. MATLAB stores rationalnumbers as doubles by default, which is a measure of the number of decimal places that are stored in each variable and thus of how accurate the valuesare. Note that MATLAB represents irrational numbers such as pi with rational approximations, except when using the symbolic math toolbox. See thatsection for details.

Boolean numbers are either "TRUE" or "FALSE", represented in MATLAB by a 1 and a 0 respectively. Boolean variables in MATLAB are actuallyinterchangable with doubles, in that boolean operators can be performed with arrays of doubles and vice versa. Any non-zero number in this case isconsidered "TRUE".

Most of the rational operators also work with complex numbers. Complex numbers, however, cannot be interchanged with boolean values like the realrationals can. See the complex numbers section for details on how to use them.

Rational Operators on Single Values

MATLAB has all the standard rational operators. It is important to note, however, that Unless told otherwise, all rational operations are done onentire arrays, and use the matrix definitions. Thus, even though for now we're only talking about operations on a single value, when we get into arrays,it will be important to distinguish between matrix and componentwise multiplication, for example.

Add, Subtract, multiply, divide, exponent operators:

Page 6: MATLAB Programming - Wikibooks

%addition a = 1 + 2 %subtraction b = 2 - 1 %matrix multiplication c = a * b %matrix division (pseudoinverse) d = a / b %exponentiation e = a ^ b

The modulo function returns the remainder when the arguments are divided together, so a modulo b means the remainder when a is divided by b.

%modulo remainder = mod(a,b)

All of these functions except for the modulus work for complex numbers as well.

Relational Operators

Equality '==' returns the value "TRUE" (1) if both arguments are equal. This must not be confused with the assignment operator '=' which assigns a valueto a variable.

>> %relational >>a=5;b=5; >>a==b ans = 1 %Assignment >>a=5;b=3; >>a=b a = 3

Note that in the first case, a value of 1 (true) is returned, however for the second case a gets assigned the value of b.

Greater than, less than and greater than or equal to, less than or equal to are given by >, <, >=, <= respectively. All of them return a value of true or false.Example:

>>a=3;b=5; >>a<=b ans = 1 >>b<a ans = 0

Boolean Operators on Single Values

The boolean operators are & (boolean AND) | (boolean OR) and ~ (boolean NOT /negation). A value of zero means false, any non-zero value (usually1) is considered true.

Here's what they do:

Page 7: MATLAB Programming - Wikibooks

>>%boolean AND >> y = 1 & 0 y = 0 >> y = 1 & 1 y = 1 >>%boolean OR >> y = 1 | 0 y = 1 >> y = 1 | 1 y = 1

The negation operation in MATLAB is given by the symbol ~, which turns any FALSE values into TRUE and vice versa:

>> c = (a == b) c = 1 >> ~c ans = 0

This is necessary because conditionals (IF/SWITCH/TRY) and loops (FOR/WHILE) always look for statements that are TRUE, so if you want it to dosomething only when the statement is FALSE you need to use the negation to change it into a true statement.

The NOT operator has precedence over the AND and OR operators in MATLAB unless the AND or OR statements are in parenthesis:

>> y = ~1 & 0 y = 0 >> y = ~(1&0) y = 1

Terminology

Matlab refers to Booleans as "logicals" and does not use the word "Boolean" in code or documentation.

Declaring Strings

Besides numbers, MATLAB can also manipulate strings. They should be enclosed in single quotes:

>> fstring = 'hello' fstring = hello

If you would like to include a single quote this is one way to do it:

>> fstring = '''' fstring = '>> fstring = 'you''re' fstring = you're

An important thing to remember about strings is that MATLAB treats them as array of characters. To see this, try executing the following code:

>> fstring = 'hello'; >> class(fstring) ans = char

Therefore, many of the array manipulation functions will work the same with these arrays as any other, such as the 'size' function, transpose, and so on.You can also access specific parts of it by using standard indexing syntax.

Attempting to perform arithmetic operations on character arrays converts them into doubles.

Page 8: MATLAB Programming - Wikibooks

>> fstring2 = 'world'; >> fstring + fstring2 ans = 223 212 222 216 211

These numbers come from the standard numbers for each character in the array. These values are obtained by using the 'double' function to turn the arrayinto an array of doubles.

>> double(fstring) ans = 104 101 108 108 111

The 'char' function can turn an array of integer-valued doubles back into characters. Attempting to turn a decimal into a character causes MATLAB toround down:

>> char(104.6) ans = h >> char(104) ans = h

Since the MATLAB strings are treated as character arrays, they have some special functions if you wish to compare the entire string at once rather thanjust its components:

findstr(bigstring, smallstring) looks to see if a small string is contained in a bigger string, and if it is returns the index of where the smaller string starts.

Otherwise it returns [].

strrep(string1, replaced, replacement) replaces all instances of replaced in string1 with replacement

Displaying values of string variables

If all you want to do is display the value of a string, you can omit the semicolon as is standard in MATLAB.

If you want to display a string in the command window in combination with other text, one way is to use array notation combined with either the 'display'or the 'disp' function:

>> fstring = 'hello'; >> display( [ fstring 'world'] ) helloworld

MATLAB doesn't put the space in between the two strings. If you want one there you must put it in yourself.

This syntax is also used to concatenate two or more strings into one variable, which allows insertion of unusual characters into strings:

>> fstring = ['you' char(39) 're'] fstring = you're

Any other function that returns a string can also be used in the array.

You can also use the "strcat" function to concatenate strings, which does the same thing as above when you use two strings, but it is especially useful if youare using a cell array of strings because it lets you concatenate the same thing to all of the strings at once. Unfortunately you can't use it to add white space(strcat discards what MATLAB considers extraneous whitespace). Here's the syntax for this use.

>> strCell = {'A', 'B'}; >> strcat(strCell, '_'); ans = A_ B_

Finally, although MATLAB doesn't have a printf function you can do essentially the same thing by using 1 as your file identifier in the fprintf function. Theformat identifiers are essentially the same as they are in C.

Page 9: MATLAB Programming - Wikibooks

>> X = 9.2 >> fprintf(1, '%1.3f\n', X); 9.200

The "9.200" is printed to the screen. fprintf is nice compared to display because you don't have to call num2str on all of the numbers in a string - just usethe appropriate format identifer in the place you want it.

>> X = 9.2 >> fprintf(1, 'The value of X is %1.3f meters per second \n', X); The value of X is 9.200 meters per second

Cell arrays of strings

In many applications (particularly those where you are parsing text files, reading excel sheets with text, etc.) you will encounter cell arrays of strings.

You can use the function "iscellstr" to tell if all of the elements in a given cell array are strings or not.

>> notStrCell = {'AA', []}; >> iscellstr(notStrCell) ans = 0

This is useful since functions that work with cell arrays of strings will fail if provided with something that's not a cell array of strings. In particular, they allfail if any elements of the provided cell array are the empty array ( [] ) which is somewhat frustrating if the provided text file contains empty cells. Youmust catch this exception before calling cellstr manipulation functions.

Searching a cell array of strings can be done with the "strmatch", "strfind", and "regexp" functions. Strmatch looks for a string within a cell array of stringswhose first characters exactly match the string you pass to it, and returns the index of all strings in the array for which it found a match. If you give it the'exact' option, it will only return the indexes of elements that are exactly the same as what you passed. For example:

>> strCell = {'Aa', 'AA'}; >> strmatch('A', strCell); ans = 1, 2 >> strmatch('A', strCell, 'exact'); ans = [] >> strmatch('Aa', strCell, 'exact'); ans = 1

Strfind looks for a specific string within a cell array of strings, but it tries to find it in any part of each string. For each element x of the given cell array ofstrings, it will return an empty array if there is no match found in x and the starting index (remember, strings are arrays of characters) of all matches in x if amatch to the query is found.

>> strCell = {'Aa', 'AA'}; >> strfind(strCell, 'A'); ans = % answer is a cell array with two elements (same size as strCell): 1 % Index of the beginning of string "A" in the first cell 1 2 % Index of each instance of the beginning of string "A" in the second cell >> strfind(strCell, 'a'); ans = 2 [] % 'a' is not found

The "cellfun" / "isempty" combination is very useful for identifying cases where the string was or was not found. You can use the find function incombination with these two functions to return the index of all the cells in which the query string was found.

>> strCell = {'Aa', 'AA'}; >> idxCell = strfind(strCell, 'a'); >> isFound = ~cellfun('isempty', idxCell); % Returns "0" if idxCell is empty and a "1" otherwise >> foundIdx = find(isFound) foundIdx = 2

Page 10: MATLAB Programming - Wikibooks

The strfind function also has some other options, such as the option to only return the index of the first or last match. See the documentation for details.

The regexp function works the same way as strfind but instead of looking for strings literally, it tries to find matches within the cell array of strings usingregular expressions. Regular expressions are a powerful way to match patterns within strings (not just specific strings within strings). Entire books havebeen written about regular expressions, so they cannot be covered in as much detail here. However, some good resources online include regular-expresions.info (http://www.regular-expressions.info/) and the MATLAB documentation for the matlab-specific syntax. Note that MATLAB implementssome, but not all, of the extended regular expressions available in other languages such as Perl.

Unfortunately, MATLAB does not innately have functions to do common string operations in some other languages such as string splitting. However, it isquite possible to find many of these functions in a google search.

Comparing strings

Unlike with rational arrays, strings will not be compared correctly with the relational operator, because this will treat the string as an array of characters.To get the comparison you probably intended, use the strcmp function as follows:

>> string1 = 'a'; >> strcmp(string1, 'a') ans = 1 >> strcmp(string1, 'A') ans = 0

Note that MATLAB strings are case sensitive so that 'a' and 'A' are not the same. In addition the strcmp function does not discard whitespace:

>> strcmp(string1, ' a') ans = 0

The strings must be exactly the same in every respect.

If the inputs are numeric arrays then the strcmp function will return 0 even if the values are the same. Thus it's only useful for strings. Use the == operatorfor numeric values.

>> strcmp(1,1) ans = 0.

This section discusses inline functions, anonymous functions, and function handles. Each of these is portable in that rather than having to write an equationmultiple times in a program, you can just define it once and then call it whenever you want to use it. In addition, function handles in particular allow you topass an equation to another function for direct evaluation as needed. Inline and anonymous functions are useful for command-line evaluation or for multipleevaluations in the same m-file.

Inline functions

An inline function is one way that a function can be created at the command or in a script:

>>f = inline('2*x^2-3*x+4','x');

>>f(3)

ans = 13

To create a multi-variable inline function, send more inputs to the 'inline' function:

>> f = inline('2*x*y', 'x', 'y');

>> f(2,2)

ans = 8

You cannot make an array of inline functions, MATLAB will tell you that you have too many inputs or do something weird like that. Even though you can

make an inline function of the type Cm → Cn, or an inline function with a matrix as image:

>> f=inline('[h, g; conj(g), h]', 'h', 'g');

>> f(1,i)

ans =

1.0000 0 + 1.0000i

0 - 1.0000i 1.0000

Page 11: MATLAB Programming - Wikibooks

Which is a C2 → M2 × 2 function.

Anonymous functions

A function can also be created at the command or in a script:

>>f = @(x) 2*x^2-3*x+4;

>>f(3)

ans = 13

To make an anonymous function of multiple variables, use a comma-separated list to declare the variables:

>>f = @(x,y) 2*x*y;

>>f(2,2)

ans = 8

It is possible to make an array of anonymous functions in MATLAB 7.1 but this will become outdated soon so using this construct in a distributedprogram is not recommended.

To pass anonymous functions to other functions, just use the name of the anonymous function in your call:

>> f = @(t,x) x;

>> ode45(f, [0:15],1)

Function Handles

A function handle passes an m-file function into another function. This of course lets you have more control over what's passed there, and makes yourprogram more general as it lets you pass any m-file (as long as it meets other requirements like having the right number of input arguments and so on). Thefunctionality is similar to that of function pointers in C++.

To pass an m-file to a function, you must first write the m-file, say something like this:

function xprime = f(t,x)

xprime = x;

Save it as myfunc.m. To pass this to another function, say an ODE integrator, use the @ symbol as follows:

>> ode45(@myfunc, [0:15], 1)

One advantage of using function handles over anonymous functions is that you can evaluate more than one equation in the m-file, thus allowing you to dothings like solve systems of ODEs rather than only one. Anonymous functions limit you to one equation.

How to write a function that accepts a function handle

You can also write your own functions that accept function handles. Simply define them as variables in your header, and then call them as if they werefunctions:

% myadd adds two variables together

function result = myfunc(func, a, b);

result = func(a, b);

[in a separate m-file]

function sum = myadd(a, b)

sum = a+b;

The command you send to myfunc looks like this:

>> result = myfunc(@myadd, 1, 2);

result = 3

Declaring a complex number in MATLAB

Complex numbers in MATLAB are doubles with a real part and an imaginary part. The imaginary part is declared by using the 'i' or 'j' character. Forexample, to declare a variable as '1 + i' just type:

Page 12: MATLAB Programming - Wikibooks

>> compnum = 1 + i

compnum = 1.000 + 1.000i

>> compnum = 1 + j

compnum = 1.000 + 1.000i

Note that if you use j MATLAB still displays i on the screen.

Since i is used as the complex number indicator it is not recommended to use it as a variable, since it will assume it's a variable if given a choice.

>> i = 3; %bad idea

>> a = 1 + i

a = 4

However, since implicit multiplication is not normally allowed in MATLAB, it is still possible to declare a complex number like this:

>> i = 3;

>> a = 1i + 1

a = 1.000 + 1.000i

It's best still not to declare i as a variable, but if you already have a long program with i as a variable and need to use complex numbers this is probably thebest way to get around it.

If you want to do arithmetic operations with complex numbers make sure you put the whole number in parenthesis, or else it likely will not give theintended results.

Arithmetic operations that create complex numbers

There are several operations that create complex numbers in MATLAB. One of them is taking an even root of a negative number, by definition.

>> (-1)^0.5

ans = 0.000 + 1.000i

>> (-3)^0.25

ans = 0.9306 + 0.9306i

As a consequence of the Euler formula, taking the logarithm of a negative number also results in imaginary answers.

>> log(-1)

ans = 0 + 3.1416i

In addition, the roots of functions found with the 'roots' function (for polynomials) or some other rootfinding function will often return complex answers.

MATLAB functions to manipulate complex values

First of all, it is helpful to tell whether a given matrix is real or complex when programming, since certain operations can only be done on real numbers.Since complex numbers don't have their own class, MATLAB comes with another function called 'isreal' to determine if a given matrix is real or not. Itreturns 0 if any of the inputs are complex.

>> A = [1 + i, 3];

>> isreal(A)

ans = 0

>> isreal(A(2))

ans = 1

Notice that it is possible to have real and complex numbers in the same array, since both are of class double. The function is set up this way so that youcan use this as part of a conditional, so that a block only is executed if all elements of array A are real.

To extract just the real part of a complex variable use the 'real' function. To extract just the complex part use the 'imag' function.

>> real(A)

ans = 1 3

>> imag(A)

ans = 1 0

One thing you may need to do is perform an operation on the real values of an array but not the complex values. MATLAB does not have a function todirectly do this, but the following pair of commands lets you put only the real values into another array:

>> RealIndex = (imag(A) == 0); %if imaginary part is zero then the number is real)

>> RealOnly = A(RealIndex)

RealOnly = 3

Page 13: MATLAB Programming - Wikibooks

Arrays and Matrices

Introduction to Arrays

Arrays are the fundamental data type of MATLAB. Indeed, the former data types presented here, strings and number, are particular cases of arrays. Asin many traditional languages, arrays in MATLAB are a collection of several values of the same type (by default, the type is equivalent to the C typedouble on the same architecture. On x86 and powerpc, it is a floating point value of 64 bits). They are indexed through the use of a single integer or, to getmore than one value, an array of integers..

Declaring Arrays

Row and Column Arrays

A simple way to create a row array is to give a comma separated list of values inside brackets:

>> array = [0, 1, 4, 5]

array =

0 1 4 5

The commas can be omitted for a row array because MATLAB will assume you want a row array if you don't give it any separators. However, thecommas make it easier to read and can help with larger arrays. The commas indicate that the array will be a horizontal array.

To make a column array you can use semicolons to separate the values.

>> column = [1; 2; 3]

column =

1

2

3

All elements of an array must be the same data type, so for example you cannot put a function handle and a double in the same array.

Declaring multi-dimensional arrays

Arrays can be multi-dimensional. To create a 2 dimensional array (a matrix in Linear Algebra terms), we have to give a list of comma separated values,and each row should be separated by a semi colon:

>> matrix = [1, 2, 3; 4, 5, 6]

matrix =

1 2 3

4 5 6

In MATLAB the term array is synonymous with matrix and will more often than not be referred to as a matrix. It should be noted that a matrix, as itsmathematical equivalent, requires all its rows and all its columns to be the same size:

>> matrix = [1, 2, 3; 4, 5]

??? Error using ==> vertcat

All rows in the bracketed expression must have the same

number of columns.

Properties of MATLAB arrays and matrices

Contrary to low level languages such as C, an array in MATLAB is a more high level type of data: it contains various information about its size, its datatype, and so on.

>> array = [0,1,4,5];

>> length(array)

ans = 4

>> class(array)

ans = double

The number of rows and columns of the matrix can be known through the built-in size function. Following the standard mathematical convention, the firstnumber is the number of rows and the second is the number of columns:

>> matrix = [1, 2, 3; 4, 5, 6];

>> size(matrix)

ans =

2 3

The goal of MATLAB arrays is to have a type similar to mathematical vectors and matrices. As such, row and column arrays are not equivalent. Mono-

Page 14: MATLAB Programming - Wikibooks

dimensional arrays are actually a special case of multi-dimensional arrays, and the 'size' function can be used for them as well.

>> size(array)

ans =

1 4

Row and column do not have the same size, so they are not equivalent:

>> size(column)

ans =

3 1

>> size(row)

ans =

1 3

Why Use Arrays?

A major advantage of using arrays and matrices is that it lets you avoid using loops to perform the same operation on multiple elements of the array. Forexample, suppose you wanted to add 3 to each element of the array [1,2,3]. If MATLAB didn't use arrays you would have to do this using a FOR loop:

>> array = [1,2,3];

>> for ii = 1:3

array(ii) = array(ii) + 3;

>> end

>> array

array = [4,5,6]

Doing this is not efficient in MATLAB, and it will make your programs run very slowly. Instead, you can create another array of 3s and add the twoarrays directly. MATLAB automatically separates the elements:

>> array = [1,2,3];

>> arrayofthrees = [3,3,3];

>> array = array + arrayofthrees

array = [4,5,6];

If all you are doing is adding a constant, you can also omit the declaration of 'arrayofthrees', as MATLAB will assume that the constant will be added toall elements of the array. This is very useful, for example if you use an array with variable size:

>> array = [1,2,3];

>> array + 3

ans = [4,5,6]

The same rule applies to scalar multiplication.

See Introduction to array operations for more information on the operations MATLAB can perform on arrays.

Arrays are a fundamental principle of MATLAB, and almost everything in MATLAB is done through a massive use of arrays. To have a deeperexplanation of arrays and their operations, see Arrays and matrices.

Introduction to array operations

As arrays are the basic data structure in MATLAB, it is important to understand how to use them effectively. See the previous section for that.

Arrays in MATLAB obey the same rule as their mathematical counterpart: by default, the matrix definitions of operations are used, unless a specialoperator called the dot operator is applied.

Because arrays operations are so similar to the equivalent mathematical operations, a basic knowledge of linear algebra is mandatory to use matlabeffectively. However, we won't be as precise as in mathematics when using the terms vector and matrix. In MATLAB, both are arrays of doubles (thusbeing a matrix in the real mathematical meaning), and MATLAB considers vectors as a matrices with only one row or only one column. However, thereare special functions just for vectors; see the vector module for an explanation of how to use these.

Basics

How to input an array

The common way to input an array from the matlab command line is to put the input figures into list into square brackets:

Page 15: MATLAB Programming - Wikibooks

>> [1, 2, 3]

ans =

1 2 3

Comma is used to separate columns elements, and semicolon is used to separate rows. So [1, 2, 3] is a row vector, and [1; 2; 3] is a column vector

>> [1; 2; 3]

ans =

1

2

3

If a blankspace is used to separate elements, the default separator is comma, thus making the vector a row vector.

Logically, inputting a matrix is done by using a comma separated list of column vectors, or a semicolon separated list of row vectors:

>> [1, 2, 3; 4, 5, 6]

ans =

1 2 3

4 5 6

Variable assignment

To reuse an array in subsequent operations, one should assign the array to a variable. Variable assignment is done through the equal symbol:

>> a = [1, 2, 3]

a =

1 2 3

Notice that instead of ans =, the name of the variable is displayed by matlab. If you forget to assign the last statement to a variable, the variable ans alwayspoint to the last non assigned:

>> [1, 2, 3]

ans =

1 2 3

>> a = ans

a =

1 2 3

But:

>> [1, 2, 3]

ans =

1 2 3

>> b = [4, 5, 6]

b =

4 5 6

>> a = ans

a =

1 2 3

I.e. ans is really the last non assigned result, and not the result of the last statement.

As it is the case for most interpreted languages, you do not need to declare a variable before using it, and reusing a variable name in an assignment willoverwrite the previous content.

To avoid cluttering the command line of matlab, you can postfix any command with a semicolon:

Page 16: MATLAB Programming - Wikibooks

>> a = [1, 2, 3];

Accessing elements of a matrix

Now that you know how to define a simple array, you should know how to access its elements. Accessing the content of an array is done through theoperator (), with the index inside the parenthesis; the indexing of the first element is 1:

>> a = [1, 2, 3];

>> a(1)

ans =

1

>> a(3)

ans =

3

Accessing an element outside the bounds will result in an error:

>> a(5)

??? Index exceeds matrix dimensions.

To access a single matrix element, you can use the (i,j) subscript, where i is the index in the row, and j in the column:

>> a= [1, 2; 3, 4];

>> a(1, 2)

ans =

2

>> a(2, 1)

ans =

3

You can also access a matrix element through a unique index; in this case, the order is column major, meaning you first go through all elements of the firstcolumn, then the 2d column, etc... The column major mode is the same than in Fortran, and the contrary of the order in the C language.

>> a = [1, 2, 3; 4, 5, 6];

>> a(3)

ans =

2

It is also possible to access blocks of matrices using the colon (:) operator. This operator is like a wildcard; it tells MATLAB that you want all elements ofa given dimension or with indices between two given values. For example, say you want to access the entire first row of matrix a above, but not thesecond row. Then you can write:

>> a = [1, 2, 3; 4, 5, 6];

>> a(1,:) %row 1, every column

ans =

1 2 3

Now say you only want the first two elements in the first row. To do this, use the following syntax:

>> a = [1, 2, 3; 4, 5, 6];

>> a(1, 1:2)

ans =

1 2

The syntax a(:) changes a into a column vector (column major):

Page 17: MATLAB Programming - Wikibooks

>> a = [1, 2, 3; 4, 5, 6]

>> a(:)

ans =

1

4

2

5

3

6

Finally, if you do not know the size of an array but wish to access all elements from a certain index until the end of the array, use the end operator, as in

>> a = [1, 2, 3; 4, 5, 6]

>> a(1, 2:end) %row 1, columns from 2 until end of the array

ans =

2 3

Logical Addressing

In addition to index addressing, you can also access only elements of an array that satisfy some logical criterion. For example, suppose a = [1.1, 2.1, 3.2,4.5] and you only want the values between 2 and 4. Then you can achieve this in two ways. The first is to use the find function to find the indices of allnumbers between 2 and 4 in the array, and then address the array with those indices:

>> a = [1.1, 2.1, 3.2, 4.5];

>> INDICES = find(a >= 2 & a <= 4);

>> a(INDICES)

ans =

2.1 3.2

This does not work in Matlab 2006b

The second method is to use logical addressing, which first changes a into a logical array, with value 1 if the logical expression is true and 0 if it is false. Itthen finds and returns all values in the a which are true. The syntax for this is as follows:

>> a = [1.1, 2.1, 3.2, 4.5];

>> a(a >= 2 & a <= 4)

ans =

2.1 3.2

Basic operations

Rational Operators on Arrays

The interesting part is of course applying some operations on those arrays. You can for example use the classic arithmetic operations + and - on any arrayin matlab: this results in the vector addition and subtraction as defined in classic vector vectors spaces , which is simply the addition and subtraction

elements wise:

>> [1, 2, 3] - [1, 2, 1]

ans =

0 0 2

The multiplication by a scalar also works as expected:

>> 2 * [1, 2, 3]

ans =

[2, 4, 6]

Multiplication and division are more problematic: multiplying two vectors in does not make sense. It makes sense only in the matrix context. Using the

symbol * in matlab computes the matrix product, which is only defined when the number of columns of the left operand matches the number of rows ofthe right operand:

>> a = [1, 2; 3, 4];

>> a * a

ans =

7 10

15 22

Page 18: MATLAB Programming - Wikibooks

>> a = [1, 2, 3]; b = [1; 2; 3];

>> a * a

??? Error using ==> *

Inner matrix dimensions must agree.

>> a * b

ans =

14

Using the division symbol / has even more constraints, as it imposes the right operand to be invertible (see Wikipedia:Invertible matrix). For square

matrices, a / b is equivalent to a * b − 1. For example :

>> a = [1, 2; 3, 4]; b = [1, 2; 1, 2]

>> b / a

ans =

1 0

1 0

>> a / b

Warning: Matrix is singular to working precision.

ans =

Inf Inf

Inf Inf

If you desire to multiply or divide two matrices or vectors componentwise, or to raise all components of one matrix to the same power, rather than usingmatrix definitions of these operators, you can use the dot (.) operator. The two matrices must have the same dimensions. For example, for multiplication,

>> a = [1, 2, 3];

>> b = [0, 1, 2];

>> a .* b

ans =

0 2 6

The other two componentwise operators are ./ and .^.

As matlab is a numerical computing language, you should keep in mind that a matrix which is theoretically invertible may lead to precision problems andthus giving imprecise results or even totally wrong results. The message above "matrix is singular to working precision" should appear in those cases,meaning the results cannot be trusted.

Non-square matrices can also be used as the right operand of /; in this case, it computes the pseudoinverse. This is especially useful in least squareproblems.

Boolean Operators on Arrays

The same boolean operators that can be used for point values can also be used to compare arrays. To do this, MATLAB compares the elementscomponentwise and returns them in a logical array of the same size as the two arrays being compared. The two arrays must have the same size. Forexample,

>> A = [2,4], B = [1,5];

>> A < B

ans =

[0 1]

You must be careful when using comparisons between arrays as loop conditions, since they clearly do not return single values and therefore can causeambiguous results. The loop condition should be reducable to a single boolean value, T or F, not an array. Two common ways of doing this are the "any"and the "all" functions. A function call any(array) will return true if array contains any nonzero values and false if all values are zero. It does thecomparisons in one direction first then the other, so to reduce a matrix you must call the any function twice. The function all, similarly, returns true if andonly if all elements in a given row or column are nonzero.

Solving Linear Systems

To solve a linear system in the form Ax = b use the "\" operator.

Example:

Page 19: MATLAB Programming - Wikibooks

>>A = [4 5 ; 2 8];

b = [23 28]';

x = A\b

x =

2

3

A vector in MATLAB is defined as an array which has only one dimension with a size greater than one. For example, the array [1,2,3] counts as avector. There are several operations you can perform with vectors which don't make a lot of sense with other arrays such as matrices. However, since avector is a special case of a matrix, any matrix functions can also be performed on vectors as well provided that the operation makes sense mathematically(for instance, you can matrix-multiply a vertical and a horizontal vector). This section focuses on the operations that can only be performed with vectors.

Declaring a vector

Declare vectors as if they were normal arrays, except all dimensions except for one must have length 1. It does not matter if the array is vertical orhorizontal. For instance, both of the following are vectors:

>> Horiz = [1,2,3];

>> Vert = [4;5;6];

You can use the isvector function to determine in the midst of a program if a variable is a vector or not before attempting to use it for a vector operation.This is useful for error checking.

>> isvector(Horiz)

ans = 1

>> isvector(Vert)

ans = 1

Another way to create a vector is to assign a single row or column of a matrix to another variable:

>> A = [1,2,3;4,5,6];

>> Vec = A(1,:)

Vec = 1 2 3

This is a useful way to store multiple vectors and then extract them when you need to use them. For example, gradients can be stored in the form of theJacobian (which is how the symbolic math toolbox will return the derivative of a multiple variable function) and extracted as needed to find the magnitudeof the derivative of a specific function in a system.

Declaring a vector with linear or logarithmic spacing

Suppose you wish to declare a vector which varies linearly between two endpoints. For example, the vector [1,2,3] varies linearly between 1 and 3, andthe vector [1,1.1,1.2,1.3,...,2.9,3] also varies linearly between 1 and 3. To avoid having to type out all those terms, MATLAB comes with a convenientfunction called linspace to declare such vectors automatically:

>> LinVector = linspace(1,3,21)

LinVector = Columns 1 through 9

1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000 1.8000

Columns 10 through 18

1.9000 2.0000 2.1000 2.2000 2.3000 2.4000 2.5000 2.6000 2.7000

Columns 19 through 21

2.8000 2.9000 3.0000

Note that linspace produces a row vector, not a column vector. To get a column vector use the transpose operator (') on LinVector.

The third argument to the function is the total size of the vector you want, which will include the first two arguments as endpoints and n - 2 other points inbetween. If you omit the third argument, MATLAB assumes you want the array to have 100 elements.

If, instead, you want the spacing to be logarithmic, use the logspace function. This function, unlike the linspace function, does not find n - 2 pointsbetween the first two arguments a and b. Instead it finds n-2 points between 10^a and 10^b as follows:

>> LogVector = logspace(1,3,21)

LogVector = 1.0e+003 *

Columns 1 through 9

0.0100 0.0126 0.0158 0.0200 0.0251 0.0316 0.0398 0.0501 0.0631

Columns 10 through 18

0.0794 0.1000 0.1259 0.1585 0.1995 0.2512 0.3162 0.3981 0.5012

Columns 19 through 21

0.6310 0.7943 1.0000

Both of these functions are useful for generating points that you wish to evaluate another function at, for plotting purposes on rectangular and logarithmic

Page 20: MATLAB Programming - Wikibooks

axes respectively.

Vector Magnitude

The magnitude of a vector can be found using the norm function:

>> Magnitude = norm(inputvector,2);

For example:

>> magHoriz = norm(Horiz)

magHoriz = 3.7417

>> magVert = norm(Vert)

magVert = 8.7750

The input vector can be either horizontal or vertical.

Dot product

The dot product of two vectors of the same size (vertical or horizontal, it doesn't matter as long as the long axis is the same length) is found using the dotfunction as follows:

>> DP = dot(Horiz, Vert)

DP = 32

The dot product produces a scalar value, which can be used to find the angle if used in combination with the magnitudes of the two vectors as follows:

>> theta = acos(DP/(magHoriz*magVert));

>> theta = 0.2257

Note that this angle is in radians, not degrees.

Cross Product

The cross product of two vectors of size 3 is computed using the 'cross' function:

>> CP = cross(Horiz, Vert)

CP = -3 6 -3

Note that the cross product is a vector. Analogous to the dot product, the angle between two vectors can also be found using the cross product'smagnitude:

>> CPMag = norm(CP);

>> theta = asin(CPMag/(magHoriz*magVert))

theta = 0.2257

The cross product itself is always perpendicular to both of the two initial vectors. If the cross product is zero then the two original vectors were parallel toeach other.

Introduction to Structures

MATLAB provides a means for structure data elements. Structures are created and accessed in a manner familiar for those accustomed to programmingin C.

MATLAB has multiple ways of defining and accessing structure fields. See Declaring Structures for more details.

Note: Structure field names must begin with a letter, and are case-sensitive. The rest of the name may contain letters, numerals, and underscorecharacters. Use the namelengthmax function to determine the maximum length of a field name.

Declaring Structures

Structures can be declared using the struct command.

>> a = struct('b', 0, 'c', 'test')

a =

b: 0

c: 'test'

Page 21: MATLAB Programming - Wikibooks

In MATLAB, variables do not require explicit declaration before their use. As a result structures can be declared with the '.' operator.

>> b.c = 'test'

b =

b: 0

c: 'test'

Structures can be declared as needed and so can the fields.

Arrays of Structures

Structures can also be arrays. Below is an example

>> a = struct('b', 0, 'c', 'test'); % Create structure

>> a(2).b = 1; % Turn it into an array by creating another element

>> a(2).c = 'testing'

a =

1x2 struct array with fields:

b

c

>> a(1) % Initial structure

ans =

b: 0

c: 'test'

>> a(2) % The second element

ans =

b: 1

c: 'testing'

Accessing Fields

When the field name is known the field value can be accessed directly.

>> a.c

ans =

test

ans =

testing

In some cases you may need to access the field dynamically which can be done as follows.

>> str = 'c';

>> a(1).(str)

ans =

test

>> a(1).c

ans =

test

Accessing Array Elements

Any given element in a structure array can be accessed through an array index like this

>> a(1).c

ans =

test

To access all elements in a structure array use the syntax {structure}.{field}. In order to get all values in a vector or array use the brackets ([]) as seenbelow.

>> [a.('c')]

ans =

testtesting

>> [a.('b')]

ans =

0 1

Or you can put them all into a cell array (rather than concatenating them) like this:

>> {a.('c')}

ans = {'test', 'testing'}

External Resources

Page 22: MATLAB Programming - Wikibooks

ControlTheoryPro.com (http://wikis.controltheorypro.com/index.php?title=Structures)

Introduction

Cell arrays are created just like regular arrays except that curly brackets are used instead of square brackets.

array = [1, 2, 3; 4, 5, 6];

cell_array = {1, 2, 3; 4, 5, 6};

The array variable is 1 array with 2 rows and 3 columns. Each element is a scalar. The cell_array variable is essentially an array of arrays. In this case thecell_array variable is made up of 6 arrays with 1 scalar element in each of the 6 arrays.

Cell arrays have fewer limitations than regular arrays. The regular array, defined by the square brackets, can hold numbers or strings but if it holds stringsin each element all the strings must be the same length. Also, if 1 element of an array is a string all elements must be a string. Cell arrays have neither ofthese limitations.

cell_array = {1, 2, 'a', 'abc'; rand(3, 2), magic(3), eye(3), 'junk'}

cell_array =

[ 1] [ 2] 'a' 'abc'

[3x2 double] [3x3 double] [3x3 double] 'junk'

With the lack of limitations/rules for the content of a cell array comes complications. These cell arrays are very powerful tools but take a lot of time to getused to because each element can be almost anything.

Cell arrays can also be dynamically resized--a key feature in more advanced data structures. For example, one can create a queue data structure using thecommands:cell_array{end+1}='a';cell_array{end+1}='b';... etc.

Once can pop an element from the front of the queue using the commands:

cell_array(1)=[]; % remove first element - resizecell_array(1)=[]; % remove first element - resize... etc.

External Links

ControlTheoryPro.com (http://wikis.controltheorypro.com/index.php?title=Cell_Arrays) MATLAB Programming/Sparce Matrices

Chapter 4: Graphics

2D Graphics

Plot

Plots a function in Cartesian Coordinates, x and y.Example:

x=0:0.1:2; % creates a line vector from 0 to 2

fx=(x+2)./x.^2; % creates fx

plot(x,fx,'-ok') % plots 2d graphics of the function fx

To plot 2 or more graphs in one Figure, then simply append the second (x,y) pair to the first:

>>>x1 = [1,2,3,4]

>>>y1 = [1,2,3,4]

>>>y2 = [4,3,2,1]

>>>plot(x1,y1,x1,y2)

This will plot y1 and y2 on the same x-axis in the output.

Polar Plot

Plots a function using θ and r(θ)

t = 0:.01:2*pi;

polar(t,sin(2*t).^2)

Page 23: MATLAB Programming - Wikibooks

3D Graphics

plot3

The "plot3" command is very helpful and easy to see three dimensional images. It follows the same syntax as the "plot" command. If you search theMATlab help (not at the command prompt. Go to the HELP tab at the top of the main bar then type plot3 in the search) you will find all the instructionyou need.

Example:

l=[-98.0556 ; 1187.074];

f=[ -33.5448 ; -240.402];

d=[ 1298 ; 1305.5]

plot3(l,f,d); grid on;

This example plots a line in 3d. I created this code in an M-file. If you do the same you change the values and hit the run button in the menu bar to see theeffect.

Mesh

Creates a 3D plot using vectors x and y, and a matrix z. If x is n elements long, and y is m elements long, z must be an m by n matrix.

Example:

x=[0:pi/90:2*pi]';

y=x';

z=sin(x*y);

mesh(x,y,z);

Contour

Creates a 2D plot of a 3D projection, using vectors x and y, and a matrix z. If x is n elements long, and y is m elements long, z must be an m by n matrix.

Example:

x=[0:pi/90:2*pi]';

y=x';

z=sin(x*y);

contour(x,y,z);

Contourf

Same as contour, but fills color between contour lines

Surface

Basically the same as mesh MATLAB offers incomparable control over the way you can add details to your plot. From inserting text at the right positionsto labelling the axes, MATLAB from the command line offers you an easy way to create publication style graphics. With support for Encapsulatedpostscript and Illustrator output. Complex figures with several axes and conveying large amounts of information can be created.

Concept of a handle

Most operations on figures generate objects with a set of properties. Users familiar with Object oriented programming would realize that the functions andthe data are encapsulated into the object. A typical figure would contain at least half a dozen objects. These objects are called handles. A very tackyanalogy would be like handles to several different refrigerators with several different contents. To provide an intuitive feel. I have listed out the propertiesfrom a text handle.

Finding a handle

Various commands provide required handles, for example:

h = gcf; % Get current figure

h = gca; % Get current axis

Examples

Axis Label

Page 24: MATLAB Programming - Wikibooks

xlabel labels the x-axis of the current plot

>>xlabel('string')

You can display text on two lines or insert the value of variables

>>xlabel({['First Line or line n° ',int2str(a)],['Second Line or line n°',int2str(b)]})

ylabel labels the y-axis of the current plot. It works in same way of xlabel but the output is vertical in 2D plots.

Documenting a Maximum Value

% Previous code set the x value of the peak data point into x_peak

plot(lags(1:1000:end),abs_cs(1:1000:end));

ptitle = 'UUT and Source Correlation Score Magnitude';

xlabel('Lag');

ylabel('Correlation Magnitude');

title(ptitle);

yloc = max(get(gca,'YLim')); % Put at top of plot

text(lags(x_peak),yloc,[' \leftarrow ' num2str(x_peak) 'ns']);

lstr{1} = sprintf(' Test %d', TESTNUM);

lstr{2} = sprintf(' Unit %d%s', UNITNUM, comparestr);

text(lags(1),mean(get(gca,'YLim')),lstr);

Chapter 5: M File Programming

M-files

There are 2 types of m-file

Scripts

Functions

Scripts are a type of m-file that runs in the current workspace. So if you call a script from the command line (base workspace) the script will use andmanipulate the variables of the base workspace. This can get very messy and lead to all sorts of strange errors when loops are involved and the coder islazy about about naming their loop variables (i.e. for i = 1:10, if every loop uses i, j, or k then it's likely that any script called from a loop will alter the loopvariable).

Functions are wholly contained in themselves. They possess their own workspace keeping workspaces separate. This means that all variables necessaryfor a particular function must be passed or defined in some way. This can get tedious for complex algorithms requiring lots of variables. However, anymanipulations of variables are discarded when the function is exited. Only those output arguments provided by the function are available to the callingworkspace. This means that loops can use i, j, or k all they want because the function's workspace and the calling workspace do not mix.

Any command valid at the command line is valid in any m-file so long as the necessary variables are present in the m-files operating workspace.

Using functions properly any change can be affected to any algorithm or plotting tool. This allows for automation of repetitive tasks.

It is optional to end the M-file with 'end'; doing so, however, can lead to complications if you have conditionals or loops in your code, or if you're planningon using multiple functions in the same file (see nested functions for details on this).

Requirements for a function

Custom functions follow this syntax in their most basic form:

function [output1, output2, ...]= function_name(input_arg1,input_arg2)

statements

return;

In current versions of MATLAB the return; line is not required. The function_name can be anything you like but it is best if the m-file name isfunction_name.m. Calling the function from the command line or another m-file is done by invoking the m-file name of the function with the necessaryinput and output arguments.

Within the function itself, there must be a statement that defines each of the output arguments (output1, output2, etc.). Without some declaration thevariable for the output argument doesn't exist in the function's workspace. This will cause an error about "one or more output arguments". It is goodpractice to initialize the output arguments at the beginning of the function.

Typically output arguments are initialized to empty ([]) or 0 or -1 or something equivalent for other data types. The reason is that if the function encountersan error you've anticipated then the function can return (via the return command) with those default values. If the initialization value is an invalid value thenit can easily be checked by the calling function for any errors which may not throw a MATLAB error.

Page 25: MATLAB Programming - Wikibooks

Path

In order to invoke a function that function's m-file must be in the current path. There is a default path that can be setup through the File menu or the

addpath command. The order of the path is important as MATLAB searches the path in order and stops searching after it finds the 1st instance of thatm-file name.

The current path is

the current directory (which can be seen at the top of the MATLAB window or by typing pwd at the command prompt

the default path

Note that MATLAB will always search the current directory before searching any of the rest of the path.

nargin & nargout

The nargin and nargout commands are only valid inside functions since scripts are not passed any arguments. The nargin command returns the numberof passed input arguments. This is useful in conjunction with nargchk

nargchk(min, max, nargin)

where min is the minimum number of arguments necesary for the function to operate and max is the maximum number of valid input arguments.

The nargout command is useful for determining which output arguments to return. Typically, the outputs are the end results of some algorithm and theyare easily calculated. However, in some instances secondary output arguments can be time consuming to calculate or require more input arguments thanthe primary output arguments do. So the function can check the number of output arguments being requested through the nargout command. If the callerisn't saving the secondary output arguments then they do not need to be calculated.

varargin & varargout

When using MATLAB objects and functions they often allow the user to set properties. The functions and objects come with default values for theseproperties but the user is allowed to override these defaults. This is accomplished through the use of varargin. varargin is a cell array that is usuallyparsed where varargin{i} is a property and varargin{i+1} is the value the user wishes for that property. The parsing is done with a for or while loopand a switch statement.

function [out] = myFunc(in, varargin)

The varargout output argument option allows for a variable number of output arguments just as varargin allows for a variable number of inputarguments. From the MATLAB site(http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/ref/varargout.html&http://www.google.com/search?sourceid=navclient&ie=UTF-8&rlz=1T4GFRD_enUS257US258&q=varargout+MATLAB)

function [s,varargout] = mysize(x)

nout = max(nargout,1)-1;

s = size(x);

for k=1:nout, varargout(k) = {s(k)}; end

returns the size vector and, optionally, individual sizes. So

[s,rows,cols] = mysize(rand(4,5));

returns s = [4 5], rows = 4, cols = 5.

Useful syntax guidelines

Placing the semicolon symbol after every line tells the compiler not to place that line of code in the command prompt and then execute. This can makeyour programs run a lot faster. Also, placing a semicolon after every line helps with the debugging process.

syms x y z;

w=[x y z];

e=[1 2 3];

t=jacobian(e,w);

Placing comments in your code can help other people (and yourself) understand your code as it gets more complex.

syms x y z; %syms command makes x y and z symbolic

w=[x y z];

e=[1 2 3];

t=jacobian(e,w);

Page 26: MATLAB Programming - Wikibooks

Comments can also Identify who wrote the code and when they wrote it.

%Some code writer

%mm/dd/yyyy

See the 'comments' section for more details on this.

Nested functions

External Links

Large parts of this page come from the ControlTheoryPro.com page on M-files (http://wikis.controltheorypro.com/index.php?title=M-files) , Scripts(http://wikis.controltheorypro.com/index.php?title=MATLAB_Scripts) , and Functions (http://wikis.controltheorypro.com/index.php?title=MATLAB_Functions) .

Placing comments

Comment lines begin with the character '%', and anything after a '%' character is ignored by the interpreter. The % character itself only tells the interpreterto ignore the remainder of the same line.

In the MATLAB Editor, commented areas are printed in green by default, so they should be easy to identify. There are two useful keyboard shortcuts foradding and removing chunks of comments. Select the code you wish to comment or uncomment, and then press Ctrl-R to (⌘-/ for Mac) place one '%'symbol at the beginning of each line and Ctrl-T (⌘-T for Mac) to do the opposite.

MATLAB also supports multi-line comments, akin to /* ... */ in languages like C or C++, via the %{ and %} delimiters.

Common uses

Comments are useful for explaining what function a certain piece of code performs especially if the code relies on implicit or subtle assumptions orotherwise perform subtle actions. Doing this is a good idea both for yourself and for others who try to read your code. For example,

% Calculate average velocity, assuming acceleration is constant

% and a frictionless environment.

force = mass * acceleration

It is common and highly recommended to include as the first lines of text a block of comments explaining what an M file does and how to use it.MATLAB will output the comments leading up to the function definition or the first block of comments inside a function definition when you type:

>> help functionname

All of MATLAB's own functions written in MATLAB are documented this way as well.

Comments can also be used to identify authors, references, licenses, and so on. Such text is often found at the end of an M file though also can be foundat the beginning. Finally, comments can be used to aid in debugging, as explained in Debugging M Files.

The input() function lets your scripts process data entered at the command line. All input is converted into a numerical value or array. The argument for theinput() function is the message or prompt you want it to display. Inputting strings require an additional 's' argument. Example:

%test.m %let's ask a user for x x = input('Please enter a value for x:')

Then running the script would produce the output:

Please enter a value for x:3

x = 3 >>

Page 27: MATLAB Programming - Wikibooks

Control Flow

IF statement

An IF statement can be used to execute code once when the logical test (expression) returns a true value (anything but 0). An "else" statement followingan if statement is executed if the same expression is false (0).

Syntax:

if expression

statements

elseif expression2

statements

end

SWITCH statement

Switch statements are used to perform one of several possible sets of operations, depending on the value of a single variable. They are intended to replacenested "if" statements depending on the same variable, which can become very cumbersome. The syntax is as follows:

switch variable

case value1

statements(1)

case value2

statements(2)

...

otherwise

statements

end

The end is only necessary after the entire switch block, not after each case. If you terminate the switch statement and follow it with a "case" statement youwill get an error saying the use of the "case" keyword is invalid. If this happens it is probably because you deleted a loop or an "if" statement but forgot todelete the "end" that went with it, thus leaving you with surplus "end"s. Thus MATLAB thinks you ended the switch statement before you intended to.

The otherwise keyword executes a certain block of code (often an error message) for any value of variable other than those specified by the "case"statements.

Programmers who are used to C style languages, often put break statements after each case. In C, C++, and Java, not putting a break statement allowsthe code to fall through in the code above, if value1 is true, then statements(1), statements(2), etc., will execute in C-style languages. However, inMATLAB only statements(1) will execute.

TRY/CATCH statement

The TRY/CATCH statement executes a certain block of code in the "try" block. If it fails with an error or a warning, the execution of this code isterminated and the code in the "catch" block is executed rather than simply reporting an error to the screen and terminating the entire program. This isuseful for debugging and also for filtering out erroneous calculations, like if you accidentally try to find the inverse of a singular matrix, when you don't wishto end the program entirely.

Syntax:

try

statements

catch

statements

end

Note that unlike the other control flow statements, the TRY/CATCH block does not rely on any conditions. Therefore the code in the TRY block willalways be at least partially executed. Not all of the TRY block code will always be executed, since execution of the TRY ends when an error occurs. Inaddition, the statements in the CATCH block will never be executed if the TRY block does not fail.

FOR statement

The FOR statement executes code a specified number of times using an iterator. Syntax:

for iterator = startvalue:increment:endvalue

statements

end

The iterator variable is initialized to startvalue and is increased by the amount in increment every time it goes through the loop, until it reaches the valueendvalue. If increment is omitted, it is assumed to be 1, as in the following code:

Page 28: MATLAB Programming - Wikibooks

for ii = 1:3

statements

end

This would execute statements three times.

WHILE statement

The while statement executes code until a certain condition evaluates to false or zero. Example:

while condition

statements

end

Forgetting to change the condition within a while loop is a common cause of infinite loops.

BREAK, CONTINUE, and RETURN

MATLAB includes the "break" and "continue" keywords to allow tighter loop control. The "break" keyword will cause the program to leave the loop it iscurrently in and continue from the next line after the loop ends, regardless of the loop's controlling conditions. If the code is in a nested loop it only breaksfrom the loop it's in, not all of them. The syntax is simply to write the word "break" within the loop where you desire it to break.

In contrast to "break", "continue" causes the program to return back to the beginning of the loop it is presently in, and to recheck the condition to see if itshould continue executing loop code or not. The code in the loop after the "continue" statement is not executed in the same pass.

If you want to exit a function entirely (as opposed to just a loop) before the last line of code, it is possible to do so using the "return" keyword. The valueof any output variables is immediately returned to the calling function. As an example of how this works, consider the following function:

function output = controlTest(doWhat);

switch doWhat

case 1

output = -1;

return;

case 2

output = 3;

end

output = output + 4;

Calling

>> output = controlTest(1)

would return output = -1, because output is defined to -1 and the return statement tells MATLAB to immediately take the current value of output andpass it back to the calling function. However, calling

>> output = controlTest(2)

would return output = 7, because output is initially defined as 3 and then 4 is added to it. Since the return statement is only executed in the case thatdoWhat=1, it is not called and the rest of the function executes.

Beware that if the output variables are not defined before calling the return statement, you will get an error, so use this with some degree of caution.

Program Flow

The idea of program flow is simple. However, implementing and using flow techniques effectivly takes practice. MATLAB flow control is almost identicalto flow control in C. There is a tremendous amount of text on the subject of flow in C. If you do a little homework in about an hour you can know all youneed to from one of numerous C tutorials. To be good at flow control all you have to do is practice.

Here are a few concepts that you can practice using flow control to implement:

Calculate compounding interest using a while loop (don't cheat by using the algebraic form).

Create a moving average filter using a for loop

Make a counter that keeps track of keystrokes:How many times a typist hits a certain letter.

As far as I've seen there is little help out there to help people decipher MATLAB's error messages. Most of the syntax errors are not difficult to fix onceyou know what is causing them so this is intended to be a guide to identifying and fixing errors in MATLAB code.

Warnings are also shown here as these often lead to errors later.

Page 29: MATLAB Programming - Wikibooks

Arithmetic errors

Usually these are self-explanatory. As a reminder, here are some common functions that cannot be performed and what MATLAB returns (along with awarning for each one):

a/0 = Inf if a > 0, -Inf if a < 0, and NaN if a = 0.

log(0) = -Inf

MATLAB defines 0^0 to be 1.

NaN will very often result in errors or useless results unless measures are taken to avoid propogating them.

???Error using ==> minus

Matrix dimensions must agree.

So check the dimensions of all the terms in your expression. Often it is an indexing mistake that causes the terms to be of different size. If you are usingpower function you might add a single dot after the parameter. i.e. y=x.^2 instead of y=x^2

Matrix multiplication requires the number of columns in the first matrix to equal the number of rows in the second. Otherwise, you get the message:

??? Error using ==> mtimes

Inner matrix dimensions must agree.

Note the difference between this error and the previous one. This error often occurs because of indexing issues OR because you meant to usecomponentwise multiplication but forgot the dot.

Attempting to take the inverse of a singular matrix will result in a warning and a matrix of Infs. It is wise to calculate the determinant before attempting totake the inverse or, better, to use a method that does not require you to take the inverse since its not numerically stable.

Attempting to take a power of a nonsquare matrix results in the error

??? Error using ==> mpower

Matrix must be square.

This is usually because you meant to use componentwise exponentiation and forgot the dot.

Indexing errors

Indexing is a pain in MATLAB, it is probably one of the hardest things to get down, especially since the syntax for an index is the same as the syntax for afunction. One annoying fact is that the names of variables are case sensitive, but the names of functions are NOT. So if you make an array called Abs andyou try to index abs(1), it will return 1 no matter what the first value in the array Abs is. Unfortunately, MATLAB will not return an error for this (althoughMATLAB v2008+ or so will return a warning saying that this will be changed in a later version), so a good rule of thumb is never ever name yourvariables the same as a function. This clears up some indexing problems.

Some things are rather obvious but take some practice in avoiding:

You cannot try to access part of an array that does not exist yet.

>> A = [1,3];

>> A(3)

??? Index exceeds matrix dimensions.

Unfortunately, MATLAB doesnt tell you which variable you exceeded the dimensions on if there's more than one so you'll have to check that. This oftenoccurs if, for example, you are using a loop to change which part of an array is accessed, but the loop doesn't stop before you reach the end of the array.This also happens if you end up with an empty matrix as a result of some operation and then try to access an element inside it.

You cannot try to access a negative, complex, noninteger, or zero part of an array; if you do you get this message:

>> A(-1)

>> A(i)

>> A(1.5)

>> A(0)

??? Subscript indices must either be real positive integers or logicals.

Note that MATLAB starts counting at 1, not 0 like C++. And again, it doesn't tell you which index is not real or logical. Also note that if 0 was a logical0 (false) then the statement A(0) would be valid and would return all 0 values in the array.

Attempting to use non-standard MATLAB syntax in your indexing will often result in the error:

Page 30: MATLAB Programming - Wikibooks

>> A(1::, 2)

??? A(1::, 2)

|

Error: Unexpected MATLAB operator.

The "operator" :: is one of several possible operators that MATLAB does not accept. This could be an example of someone trying to access all rows of Aafter the first one and the second column, in which case you should use the "end" syntax, as in:

>> A(1:end, 2)

ans = 3

Make sure you are careful when using the colon operator, because it does many different things depending on where you put it and misuse often results inthese errors. Try putting in one piece of your code at a time and see what it is doing, it may surpise you.

Assignment errors

Ah, assignment, that is using the = sign to give a variable, or certain elements of an array, a particular value.

Let's start with a classic mistake:

>> a = 2;

>> if a = 3

??? if a = 3

|

Error: The expression to the left of the equals sign is not a valid target for an assignment.

This error occurs because you meant to see if "a" equaled 3, but instead you told MATLAB to assign "a" a value of 3. You cannot do that on the sameline that the if/while statement is on. The correct syntax is

>> if a == 3

>> end

This creates no errors (and you can put anything inside the conditional you want).

You cannot have a normal array with two different classes of data inside it. For example,

>> A = @(T) (1+T)

A =

@(T) (1+T)

>> A(2) = 3

??? Conversion to function_handle from double is not possible.

For such a purpose you should use cell arrays or struct arrays.

Here's the tricky one. Take a look at the following code:

>> A = [1,2,3;4,5,6;7,8,9];

>> A(2,:) = [3,5];

??? Subscripted assignment dimension mismatch.

>> A(2,:) = [1,4,5,6];

??? Subscripted assignment dimension mismatch.

>> A(1:2, 1:2) = [1,2,3,4];

??? Subscripted assignment dimension mismatch.

What is happening here? In all three cases, take a look at the dimensions of the left and the right hand sides. In the first example, the left hand side is a 1x3array but the right side is a 1x2 array. In the second, the left hand side is 1x3 while the right is 1x4. Finally, in the third, the left hand side is 2x2 while theright is 1x4. In all three cases, the dimensions do not match. They must match if you want to replace a specific portion of an existing variable. It doesn'tmatter if they have the same number of data points or not (as the third example shows); the dimensions must also be the same, with the exception that ifyou have a 1xn array on one side and an nx1 on the other MATLAB will automatically transpose and replace for you:

>> A(2,:) = [1;2;3]

A = 1 2 3

1 2 3

7 8 9

If you do not want this be aware of it!

Struct array errors

Struct arrays are rather complex, and they have a rigid set of rules of what you can and can not do with them. Let us first deal with indexing within structarrays. Suppose you define the variable "cube" and want to store the volume and the length of one side of two different cubes in a struct array. This can bedone as follows:

Page 31: MATLAB Programming - Wikibooks

>> cube(1).side = 1;

>> cube(1).volume = 1;

>> cube(2).side = 2;

>> cube(2).volume = 8;

This seems like a good way of storing data and it is for some purposes. However, suppose you wanted to abstract the volumes from the struct and storethem in one array. You cannot do it this way:

>> volumes = cube.volume

??? Illegal right hand side in assignment. Too many elements.

You'll notice that if you tell MATLAB to display cube.volume, it will display both values, but reassign the variable ans each time, because it is treated astwo separate variables. In order to avoid the error, you must format 'cube.volume' as an array upon assignment.

>> volumes = {cube.volume}

You can also write in a separate assignment for each cube but this is more adaptable to larger numbers of cubes.

Just like extracting data, you must input the data one at a time, even if it is the same for all instances of the root (cube).

>> cube.volForm = @(S) (S^3)

??? Incorrect number of right hand side elements in dot name assignment. Missing [] around left hand side is a likely cause.

>> cube(:).volForm = @(S) (S^3)

??? Insufficient outputs from right hand side to satisfy comma separated

list expansion on left hand side. Missing [] are the most likely cause.

Unfortunately missing [] is not the cause, since adding them causes more errors. The cause is that you cannot assign the same value to all fields of the samename at once, you must do it one at a time, as in the following code:

>> for ii = 1:2

>> cube(ii).volForm = @(S) (S^3);

>> end

>> cube

ans = 1x2 struct array with fields:

volume

side

volForm

The same volume formula is then found in both cubes. This problem can be alleviated if you do not split the root, which is highly recommended. Forexample, you can use a struct like this:

>> shapes.cubeVol = @(S) (S^3);

>> shapes.cube(1).vol = 1;

>> shapes.cube(2).vol = 8;

This avoids having to use a loop to put in the formula common to all cubes.

Syntax errors

Parenthesis errors

Unlike in C++, you are not required to terminate every line with anything but a line break of some sort. However, there are still syntax rules you have tofollow. In MATLAB you have to be especially careful with where you put your parenthesis so that MATLAB will do what you want it to.

A very common error is illustrated in the following:

>> A(1

??? A(1

|

Error: Expression or statement is incorrect--possibly unbalanced (, {, or [.

This error is simple enough, it means you're missing a parenthesis, or you have too many. Another closely related error is the following:

>> A(1))

??? A(1))

|

Error: Unbalanced or misused parentheses or brackets.

MATLAB tries to tell you where the missing parenthesis should go but it isn't always right. Thus for a complex expression you have to go through it verycarefully to find your typo. A useful trick is to try to set a breakpoint a line after the offending line. It won't turn red until the error is corrected, so keep

Page 32: MATLAB Programming - Wikibooks

trying to correct it and saving the file until that breakpoint turns red. Of course, after this you have to make sure the parenthesis placement makes sense,otherwise you'll probably get another error related to invalid indecies or invalid function calls.

String errors

There are two ways that you can create a string; use the ' string ' syntax, or type two words separated by only whitespace (not including line breaks), asin

>> save file.txt variable

In this line, file.txt and variable are passed to the save function as strings. It is an occasional mistake to forget a parenthesis and accidentally try and passa string to a function that does not accept strings as input:

>> eye 5

??? Error using ==> eye

Only input must be numeric or a valid numeric class name.

These should not be hard to spot because the string is color-coded purple. Things like this occur if you uncomment a line of text and forget to change it.

Forgetting the closing ' in the other syntax for a string results in an obvious error:

>> A = 'hi

??? A = 'hi

|

Error: A MATLAB string constant is not terminated properly.

The unterminated string is color-coded red to let you know that it is not terminated, since it's otherwise easy to forget.

A common mistake with strings is to try to compare them using the '==' operator. This does not work if the strings are not the same length, becuase stringsare arrays of characters, and to compare arrays with '==' they must be the same size. To compare two strings you must use the strcmp function:

>> 'AA' == 'AaA'

??? Error using ==> eq

Matrix dimensions must agree.

>> strcmp('AA', 'AaA')

ans = 0

>> strcmp('A', 'a')

ans = 0

>> strcmp('AA', 'AA')

ans = 1

Note that MATLAB strings are case sensitive, 'A' and 'a' are not the same string.

Also beware that the ' character for beginning and ending strings is the same character indicating transposition. So if you close a string and don't begin it,you will most likely end up with an error about an undefined variable (if you're trying to transpose an undefined variable) or just get really weird resultsbecause you transposed something you didn't intend to.

Other miscellaneous errors

You cannot leave trailing functions, and if you do MATLAB gives you an error that is similar but not exactly the same as that for a missing parenthesis,since it doesn't want to venture a guess:

>> A = 1+3+

??? A = 1+3+

|

Error: Expression or statement is incomplete or incorrect.

These usually are not hard to spot, and often result from forgetting the "..." necessary to split a line.

The double colon is not the only "unexpected MATLAB operator", there is also "..", "....", and several other typos that generate this error.

If you accidentally type the ` character you get the error:

>> ??? `

|

Error: The input character is not valid in MATLAB statements or expressions.

This usually occurs because you intended to put a "1" in the equation but missed the key. Another possibility is that you named your m-file with unusualletters for computers. Like in Germany "ä, ü or ö". Be sure to name your m-files only with usual letters and no capital letters.

Function Calling errors

Page 33: MATLAB Programming - Wikibooks

It is quite possible to try to call a function that doesn't exist, such as:

>> samplemat = [1 2; 1 4]

>> A = eigen(samplemat);

??? Undefined command/function 'eigen'.

This can happen because you do not know the name of the function that performs the operation intended (for example, if you wanted to compute theeigenvalues of matrix "samplemat", you would want to call eig, not eigen). It is often useful to pull up MATLAB's help (go to help -> product help ortype doc into the command prompt) and do a search for the operation you want.

If you're trying to call a function you created and you get this error, there are several possible reasons:

1. The m-file must be in one of the paths listed under file -> set path, or must be in your current directory

2. The m-file must have the same name as the name in the function declaration. You must be aware of this especially if you change the name of your

functions, you must also change the name of the file or MATLAB will not find the right function!

If MATLAB finds the function, it will attempt to run it. However, there are several potential pitfalls to avoid in calling functions. It is necessary to know thenature of the input and output arguments of a given function in order to call it. For MATLAB's built-in functions, this information is found in thedocumentation, or by typing

>> help functionname

It is a good idea to set up some comments so that the help function can read them in your own code as well, so you can keep track of how all yourfunctions work and what they do at a quick reference. To do this, note that the help function reads only the block of comments directly under the functiondeclaration, so for example, if you write a function like this:

function outvars = myfunc(invars)

% function outvars = myfunc(invars)

% Outputs outvars

% All of this is outputted when you type >> help myfunc

% But this wouldn't be

save the function as "myfunc.m", and type

>> help myfunc

it will output:

>> function outvars = myfunc(invars)

Outputs outvars

All of this is outputted when you type >> help myfunc

Most functions (not all however) require at least one input argument, and calling it with too few will result in an error:

>> A = ode45()

??? Error using ==> ode45

Not enough input arguments. See ODE45.

You cannot call a function with too many input arguments either:

>> A = plus(1,2,3)

??? Error using ==> plus

Too many input arguments.

Input arguments must be in a format expected by the function. This will be very function-specific, so see the documentation or help for details on what theyexpect. For example, the first argument to ODE45 and other ODE solvers has to be the function handle; if you pass arguments in the wrong order you willbe given an error to that effect.

You can choose how many of the output arguments you want out of those available by using the bracket notation. You can choose to save fewer outputsthan the function offers, but you cannot assign more variables than the function can output:

>> A = [1,2;3,4]

D = eig(A); %one output argument

[V,D] = eig(A); %two output arguments

[V,D,Mistake] = eig(A);

??? Error using ==> eig

Too many output arguments.

All assigned output arguments must also be of the correct class if you are replacing parts of an array that already exists (see the section on assignment formore on this). If you're creating a new variable with the output, this is not an issue.

Page 34: MATLAB Programming - Wikibooks

Control Flow errors

The most common one by far is if you forget the 'END', which is an issue in M-file functions. It will tell you that 'at least one END is missing' and try to tellyou where the loop or conditional statement starts.

If you have too many END statements and more than one function in an M-file, MATLAB may give you a cryptic message about not formatting thefunctions correctly. This is because all functions in the same M-file must either end with an END statement or not. It doesn't matter which, but if youhave too many END statements in one of the functions, MATLAB will think your function is ending early and will get confused when the next function inline does not have an END statement at the end of it. So if you get this confusing message, look for extra END statements and it should fix your problem.If the message is displayed when publishing, say to an html file, the problem may be an erratic hierarchical indentation. Try selecting all and then hittingcntrl-i for automatic indentation to fix the problem.

Having an extra END in a 'switch' statement gives a message that you used the 'case' keyword illegaly, because MATLAB thinks you ended the switchstatement early, and 'case' has no meaning outside a 'switch' statement.

Other errors

There are numerous types of errors that do not generate errors from the MATLAB compiler, which have to do with calling the wrong function, using thewrong operation, using the wrong variable, introducing an infinite loop, and so on. These will be the hardest to fix, but with the help of the MATLABdebugger, they will be easier to find. See Debugging M Files for details on how to use the debugger.

1. In MATlab 6.x (not sure exactly which builds this problem occurs in) the random number generator will generate the same sequence the first time

you execute the command.

This section explains things you can do if you fix all the syntax errors (the ones that give you actual error messages), the program runs... but it gives yousome result you don't want. Maybe it goes into an infinite loop, maybe it goes through the loop one too few or one too many times, maybe one of your "if"statements doesn't work, maybe the program is giving you "infinity" or "NaN" as an answer (which usually isn't very useful!)... there's as many things thatcan go wrong as there are lines in the code. Thankfully there are techniques for both fixing and improving on working MATLAB code.

Using MATLAB's Debugging tool

Using the Debugging Tool will let you stop your program in mid-execution to examine the contents of variables and other things which can help you findmistakes in your program.

M-file programs are stopped at "breakpoints". To create a breakpoint, simply press F12 and a red dot will appear next to the line where your cursor is.You can also click on the dash next to the line number on the left side of the M-file window to achieve the same result.

Then press F5 or Debug->Run from the menu to run the program. It will stop at the breakpoint with a green arrow next to it. You can then examine thecontents of variables in the workspace, step, continue or stop your program using the Debug menu. To examine contents of a variable, simply type itsname into the workspace, but be warned: you can only look at the values of variables in the file you stop in, so this means that you'll probably needmultiple breakpoints to find the source of your problem.

There are several different ways you can move through the program from a breakpoint. One way is to go through the whole program, line by line, enteringevery function that is called. This is effective if you don't know where the problem is, but since it enters every function (including MATLAB functions likeode45), you may not desire to use it all the time. Thankfully, there's also a way to simply step through the function you're currently stopped in, one line at atime, and instead of going through the child functions line by line MATLAB will simply give you the results of those functions.

Finally, note that you cannot set a breakpoint until you save the M-file. If you change something, you must save before the breakpoint "notices" yourchanges. This situation is depicted in MATLAB by changing the dots from red to gray. Sometimes, you'll save but the dots will still be gray; this occurswhen you have more than one breakpoint in multiple files. To get around this (which is really annoying), you have to keep going to "exit debug mode" untilit turns gray. Once you're completely out of debug mode, your file will save and you'll be ready to start another round of debugging.

Using comments to help you debug code

If you want to test the effects of leaving out certain lines of code (to see, for example, if the program still returns Inf if you take them out), you cancomment out the code. To do this, highlight it and then go to:

Text -> Comment

Or press CTRL+R. This will simply put a '%' in front of every line; if the line is already commented out it will put another '%' there so when youuncomment them the pattern of comment lines will not change. Commented lines will be ignored by the compiler, so the effect will be that the program isrun without them.

To uncomment a line go to

Page 35: MATLAB Programming - Wikibooks

Text -> Uncomment

Or press CTRL+T.

Another use of commenting is to test the difference between two different possible sets of code to do something (for example, you may want to test theeffect of using ODE113 as opposed to ODE45 to solve a differential equation, so you'd have one line calling each). You can test the difference bycommenting one out and running the program, then uncommenting that one and commenting the other one out, and calling the program again.

How to escape infinite loops

If your program is doing nothing for a long time, it may just be slow (MATLAB creates a lot of overhead and if you don't use arrays wisely it will go very,very slow) but if you are testing a small module, it is more likely that you have an infinite loop. Though MATLAB can't directly tell you you have an infiniteloop, it does attempt to give you some hints. The first comes when you terminate the program. Terminate it by pressing CTRL+C and MATLAB will giveyou a message telling you exactly what line you stopped on. If your program is running a long time, it is likely the line you stopped in is in the middle of aninfinite loop (though be warned, if the loop calls a sub-function, it is likely that you will stop in the sub-function and not the parent. Nevertheless,MATLAB also will tell you the lines of the parents too so you can track down the loop easily enough).

However, sometimes MATLAB won't even let you return to the main window to press CTRL-C. In this case you probably have to kill the wholeMATLAB process. After this, add a "pause (0.001)" or a similarly small value in the loop you suspect to be the infinite one. Whenever MATLAB passesthis instruction you will be able to interact with MATLAB for a (very) short time, e.g. go to the main window and press STRG-C with MATLAB beingable to respond to your command.

Chapter 6: Mathematical Manipulations

Linear Algebra

Operations

Squaring a matrix

a=[1 2;3 4]; a^2;

a^2 is the equivalent of a*a. To square each element:

a.^2

The period before the operator tells MATLAB to perform the operation element by element.

Determinant

Getting the determinant of a matrix, requires that you first define your matrix, then run the function "det()" on that matrix, as follows:

a = [1 2; 3 4]; det(a) ans = -2

Symbolic Determinant

You can get the symbolic version of the determinant matrix by declaring the values within the matrix as symbolic as follows:

m00 = sym('m00'); m01 = sym('m01'); m10 = sym('m10'); m11 = sym('m11');

or

syms m00 m01 m10 m11;

Then construct your matrix out of the symbolic values:

Page 36: MATLAB Programming - Wikibooks

m = [m00 m01; m10 m11];

Now ask for the determinant:

det(m) ans = m00*m11-m01*m10

Transpose

To find the transpose of a matrix all you do is place an apostrophe after the bracket. Transpose- switch the rows and columns of a matrix.

Example:

a=[1 2 3] aTranspose=[1 2 3]'

or

b=a' %this will make b the transpose of a

when a is complex, the apostrophe means transpose and conjugate.

Example

a=[1 2i;3i 4];a'=[1 -3i;-2i 4];

For a pure transpose, use .' instead of apostrophe.

Systems of linear equations

There are lots of ways to solve these equations.

Homogeneous Solutions

Particular Solutions

State Space Equations

Special Matrices

Often in MATLAB it is necessary to use different types of unique matrices to solve problems.

Identity matrix

To create an identity matrix (ones along the diagonal and zeroes elsewhere) use the MATLAB command "eye":

>>a = eye(4,3)

a =

1 0 0

0 1 0

0 0 1

0 0 0

Ones Matrix

To create a matrix of all ones use the MATLAB command "ones"

a=ones(4,3)

Page 37: MATLAB Programming - Wikibooks

Produces:

a =

1 1 1

1 1 1

1 1 1

1 1 1

Zero matrix

The "zeros" function produces an array of zeros of a given size. For example,

a=zeros(4,3)

Produces:

a =

0 0 0

0 0 0

0 0 0

0 0 0

This type of matrix, like the ones matrix, is often useful as a "background", on which to place other values, so that all values in the matrix except for thoseat certain indices are zero.

Row reduced echelon form

To find the Row reduced echelon form of a matrix just use the MATLAB command rref

Example:

a=[1 2 3; 4 5 6];

b=rref(a);

It's that simple. (I believe that MATLAB uses the Gauss-Jordan elimination method to make this computation; don't quote me on that (I'm not even sure ifthere are other methods)).

Inverse

To find the inverse of a matrix use the MATLAB command inv. (note that the matrix must be square)

Example:

a=[1 2 3;4 5 6;7 8 9];

b=inv(a);

Cofactor, minor

The Jacobian

t=jacobian(e,w);

e is a scalar vector, w is a vector of functions. Also, this does not solve equations symbolically unless you define the w vector functions as symbolics priorto executing this statement.

Example:

syms x y z;

w=[x y z];

e=[1 2 3];

t=jacobian(e,w);

Differential Equations

Differential equation solver syntax

Page 38: MATLAB Programming - Wikibooks

All of the differential equations have the same syntax that you must use, and the same input and output arguments. All of the solvers require three inputarguments: a function handle to the differential equation you want to solve, a time interval over which to integrate, and a set of initial conditions. Let ussuppose we want to solve the simple differential equation y' = y, y(0) = 1, which has the true solution y(t) = e^t. Suppose we want the solution between t= 0 and t = 1.

To use function handles, you must first create an M-file with the function in it like so:

function Yprime = func(t, y)

Yprime = 0;

Yprime = y;

Note that you must include the time argument even if it is not used in the differential equation. The initialization of Yprime to an array of zeros will save yougrief if you try to solve more than one function; Yprime must be returned as a VERTICAL array but, if you don't initialize it as a verical array (or transposeat the end), it will return a HORIZONTAL array by default.

Also note that, with the exception of ode15i, the function must be solved explicitly for y'.

Once this file is created, call the ODE function with the arguments in the order (function, timeinterval, initialcond):

>> ode45(@func, [0,1], 1)

The other method is to use anonymous functions, which is only useful if you have one function (otherwise you must use function handles). You again mustdeclare the anonymous function in terms of both the dependent variable(s) and time:

>> func = @(t,y) y;

>> ode45(func, [0,1], 1)

Calling the ODE function without input arguments gives a graph of the solution. Calling it with one output argument returns a struct array:

>> Struct = ode45(func, [0,1], 1)

Struct = solver: 'ode45'

extdata: [1x1 struct]

x: [1x11 double]

y: [1x11 double]

stats: [1x1 struct]

idata: [1x1 struct]

This data is mostly used to, in the future, call the 'deval' function to get the answer at any time you want:

>> Solution = deval(Struct, 0.5)

Solution = 1.6487

Deval can also return the derivative at the point of interest by including a second output argument.

>> [Solution, Derivative] = deval(Struct, 0.5)

Solution = 1.6487

Derivative = 1.6487

Since the derivative of e^x is itself it makes sense that the derivative and solution are the same here.

Calling ode45 with two output arguments returns two lists of data; t first, then the independent variables in an appropriately-sized matrix.

ODE Options

The are a rather large number of options that MATLAB gives you to modify how it solves the differential equations. The help file does a pretty good jobdescribing all of them so they won't be described in detail here. To get a list use the help function:

>>help odeset

To get a list of the different options' names and what you have to pass to it, just type 'odeset' into the command prompt. It returns either a data type or afinite list of options. It also lists, in parenthesis, the default values of all the options.

To set a specific option or list of options, type the name of the option first and then the value of the option you want. For example, suppose you want totighten the default relative tolerance from 10^-3 to 10^-4. You would call 'odeset' as follows:

>> option = odeset('RelTol', 10^-4);

Note that the option name must be passed as a string, or else you'll get an 'undefined variable' error most likely. More than one option can be passed at atime by just putting them all in a list:

Page 39: MATLAB Programming - Wikibooks

>> option = odeset('RelTol', 10^-4, 'AbsTol', 10^-7, 'MassSingular', 'no');

The options structure can then be passed to the ode function as a forth (optional) input argument:

>> [T,X] = ode45(@func, [0,1], 1, option);

This will return more accurate values than default because the error tolerances are tighter. It should also compute faster because MATLAB is notchecking to see if this is a differential-algebraic equation (this is what the MassSinglular option does; it is usually set to 'maybe' so MATLAB checks byitself).

The ODE solvers

MATLAB doesn't just have one ODE solver, it has eight as of the MATLAB 7.1 release. Some are more suited for certain problems than others, whichis why all of them are included. The MATLAB help has a list of what functions each one can do, but here is a quick summary, in roughly the order youshould try them unless you already know the classification of the problem:

Most problems can be solved using ode45, and since this is the best tradeoff of speed and accuracy it should be the first one you use.

If you need a really tight error tolerance or a lot of data points, use ode113.

If you have a relatively loose error tolerance or the problem is slow with ode45, try ode23.

If the problem is truly stiff and ode45 fails, use ode23tb for loose tolerances, ode23s for slightly tighter tolerances with a constant mass matrix, or

ode15s for tighter tolerances or nonconstant mass matrices.

If you need a solution without numerical damping on a stiff problem, use ode23t.

The s indicates that the algorithm is intended for stiff problems.

There is one other ODE solver, which is special:

Implicit problems can only be solved using ode15i.

Since ode15i has some differences in its syntax, it is discussed next.

Implicit ODEs: ODE15i

Since ode15i is the only ODE solver that solves implicit equations, it must have some special syntactical rules on how to input the function.

If you are using ode15i declare the function as follows:

function Z = func(t,y,Yprime)

Z = 0;

Z = y - Yprime;

Note that with ode15i, you must put the function into normal form (solve it for 0), whereas for all other ODE functions you must solve explicitly for y'.Also notice that you must declare three input arguments instead of the usual two.

When you call ode15i, you must not only include initial conditions for y but also for Yprime. The initial conditions for Yprime go into the fourth argument:

>> [t,x] = ode15i(@func, [0,1], 1, 1);

This will return similar results to ode45 when used for the explicit equation, but has fewer data points.

The options structure is passed to ode15i as the optional fifth argument. All output options from ode15i are the same as for the other ODE solvers. c=3

d=0.002

m=(1/d*log(2))^(1/c)

Chapter 7: More advanced I/O

Now that we've covered basic file input output (I'll get into more detailed file manipulation later) we can move on to the next step.

In the section Basic Reading and Writing data we already had the data in the form of a spreadsheet. How did it get to that spreadsheet and how do wesend it some where else? This question will attempt to be answered in the following section. There are many ways to transmit and recieve data. I've evenheard of this newfangled thing called the easternet or internet or whatever, but for now we will assume we are in a University lab with no internetconnection (don't laugh I've been in this situation more times than I like to remember). In this case, we will use the computer's serial port, whichimplements the RS-232 physical layer protocol. Although this protocol is very slow (usually no more than 9600 bits/s), it's very simple to implement andthus it's used widely on embedded devices.

Page 40: MATLAB Programming - Wikibooks

MATLAB provides us with there style of reading and writing to the serial port.

1. You must create a serial port object.

object=serial(port,'Property name',propertyValue);

Example: I will now create a serial object called serialOne

serialOne=serial('COM1', 'BaudRate', 9600);

(for those of you more familiar with C this should look very similar to creating a handle: In fact it is the MATLAB way of making handles)

Most computers call the serial ports COM and then some number usually 1-4 (depending on how many there are). This also includes DB-9, DB-25 andother various DB type connectors.

2. Now that the computer knows there is a serial port object you have to tell it to open

the object. Use the fopen command

3. Write to the port4. Close object.

Example:

serialOne=serial('COM1', 'BaudRate', 9600);

fopen(serialOne);

fprintf(serialOne,'textFile.txt');

fclose(serialOne);

further reading

Serial Programming

The USB port is a type of serial port. It is, after all, the Universal SERIAL Bus. I wrote that twice because all of the books I have read on USB seem tomuddle that quite a bit. There are some minor and major differences to how you use the USB ports but the idea is very much the same. I did this a whileback and have to reread some stuff. (I also plan to either start a wiki book about USB or join one that is already started- I have to look into this more).

further reading

Serial Programming:USB Technical Manual+

Chapter 8: Examples

Filtering is a broad subject. For the MATlab wiki I will focus on how to implement filters. For more on the theory of filtering the reader should referencethe Digital Signal Processing wiki book.

The Moving Average Filter

Formula:

MATLAB implementation(All the code here was intended to be put in an M-file):

Page 41: MATLAB Programming - Wikibooks

clc; clear; % clear all v=.01 f=100; fs=5000; t=0:1/fs:.03 x=sin(2*pi*f*t); %original signal r=sqrt(v)*randn(1,length(t)); %noise Xw=x+r; %signal plus noise (filter input) % I have chosen h=3 for n= 3:length(Xw), y(n)=sum(Xw(n-2:n))/3; %y[n] is the filtered signal end plot(y); hold; plot(x,'r'); %plot the original signal over top the %filtered signal to see the difference

The moving average filter is simple and effective. One of the things that is a problem is the lag associated with the moving average filter. The more samplesused the longer the lag experienced(All filters have lag). How much lag can be tolerated is up to the individual.

The Alpha Beta filter

The Kalman Filter

The Kalman filter is a recursive method of combining two estimates to determine the truth. A few parameters that are widely used are the initial conditionsor current value and measured data.

Equation:

Example:

n=100; sigma=(20/6076); R=100; Rm=R+sigma*randn; Rs(1)=Rm(1); Cs=sigma^2 for i=2:n Rm(i)=R+sigma*randn; alpha=Cs/(Cs+sigma^2); Rs(i)=Rs(i-1)+alpha*(Rm(i)-Rs(i-1)); Cs=(1-alpha)*Cs; end

All this code does is take a constant value R and adds noise to it. Then it filters the new signal in an effort to separate the noise from the original signal.

The discrete Fourier transform

DFT quick reference

What is it? DFT element matlab example and comments

How often do you want to

sample?sampling frequency fs

fsample=100;

sample at 100Hz

psample=1/fsample;

sample period

For how long do you want tmax=10;

Page 42: MATLAB Programming - Wikibooks

to sample? time range run from 0 to 10 sec. inclusive

How many samples does

that give you?N

nsamples=tmax/psample+1;

+1 because we include t=0 and t=tmax.

nsamples=2^ceil(log2(nsamples));

round up to a power of 2 in length so FFT will work.

times=(0:psample:(nsamples-1)*psample)';

Create a column vector of sample times.

How far apart are each of

the frequency-domain

result points?

delf=fsample/nsamples;

frequencies=(0:delf:(nsamples-1)*delf)';

Column vector of result frequencies

What signal do you want

to sample?input x(t)

x=sin(2*pi*10*times)+sin(2*pi*3*times);

Make a 10Hz sine wave plus a 3Hz sine wave

What are the results?

Fourier transform

fft_x=fft(x, length(x));

What frequencies does

the signal have?Xm(f) = | X(f) | fft_x_mag=abs(fft_x);

What phase

relationships?fft_x_phase=unwrap(angle(fft_x));

How do you view the

results?

plot(frequencies, fft_x_mag);

Or, to match the amplitude of the magnitude peak to the amplitude of the

sine wave,

plot(frequencies, (2/nsamples)*fft_x_mag);

What about the power

spectrum?Xp(f) = | X(f) | 2

fft_x_power=fft_x_mag.^2;

plot(frequencies, fft_x_power);

References

Lyons, Richard G. Understanding digital signal processing. Upper Saddle River: Prentice Hall PTR, 2001. ISBN 0-201-63467-8. Chapter 3discusses the DFT.

Introduction

I think that is is important to note here how concepts are implemented. Control systems in MATlab will use both the numeric methods and programmingmethods to achieve the design criteria. This article is not meant to teach the theory of controls.

See also: Control Systems

Chapter 9: Object-Oriented Programming

A struct as defined and used in Octave

A structure in Octave groups different data types called fields in a single object. Fields are accessed by their names.

Declaring a structure

A structure is declared by assigning values to its fields. A period (.) separates the name of the field and the name of the structure:

Page 43: MATLAB Programming - Wikibooks

>> city.name = 'Liege'; >> city.country = 'Belgium'; >> city.longitude = 50.6333; >> city.latitude = 5.5666;

The fields of a structure and their values can be displayed by simply entering the name of the struct:

>> city

city =

{

name = Liege

country = Belgium

longitude = 50.633

latitude = 5.5666

}

Manipulating structures

A structure can be copied as any objects:

>> city_copy = city;

In most circumstance, the fields of a structure can be manipulated with the period operator. The value of a field can be overwritten by:

>> city.name = 'Outremeuse';

In the same way, the value of a field can be retrieved by:

>> city.name ans = Outremeuse

The function isstruct can be used to test if object is a structure or not. With the function fieldnames all field names are returned as a cell array:

>> fieldnames(city)

ans =

{

[1,1] = name

[2,1] = country

[3,1] = longitude

[4,1] = latitude

}

To test if a structure contains the a given field named, the function isfield can be used:

>> isfield(city,'name')

ans = 1

The value of a field can be extract with getfield:

>> getfield(city,'name') ans = Liege

or using

>> city.('name')

ans = Liege

In a similar way, the value of a field can be set with setfield:

>> setfield(city,'name','Outremeuse')

The functions isfield, getfield and setfield are useful when the names of a structure are determined during execution of the program.

Page 44: MATLAB Programming - Wikibooks

You can remove a field of a struct array with the rmfield function.

>> city = rmfield(city, 'name');

would remove the 'name' field from the city struct and copy the result back onto the original structure. MATlab stores methods (separate M-file) in classdirectories not on the standard search path. The two minimum things needed in order to create a class are the constructor and display M-files.

Chapter 10: Comparing Octave and MATLAB

Octave is a free computer program for performing numerical computations (created as part of the GNU project) which is mostly compatible withMATLAB.

History

The project was conceived around 1988. At first it was intended to be a companion to a chemical reactor design course. Real development was startedby John W. Eaton in 1992. The first alpha release dates back to January 4, 1993 and on February 17, 1994 version 1.0 was released.

The name has nothing to do with music. It was the name of a former professor of one of the authors of Octave who was known for his ability to quicklycome up with good approximations to numerical problems.

Technical details

Octave is written in C++ using STL libraries.Octave has an interpreter that interprets the Octave language.

Octave itself is extensible using dynamically loadable modules.Octave interpreter works in tandem with gnuplot and Grace software to create plots, graphs, and charts, and to save or print them.

Octave, the language

The Octave language is an interpreted programming language. It is a structured programming language (an example of which is the C language) andsupports many common C standard library constructs, and can be extended to support UNIX system calls and functions. However, it does not supportpassing argument by reference.

Octave programs consist of a list of function calls or script. The language is matrix-based and provides various functions for matrix operation. It is notobject-oriented, but supports data structures.

Its syntax is very similar to MATLAB, and carefully programming a script will allow it to run on both Octave and MATLAB.

Because Octave is made available under the GNU General Public License, it may be freely copied and used. The program runs under most Unix andUnix-like operating systems, as well as Microsoft Windows.

Notable features

Command and variable name completion

Typing a TAB character on the command line causes Octave to attempt to complete variable, function, and file names. Octave uses the text before thecursor as the initial portion of the name to complete.

Command history

When running interactively, Octave saves the commands typed in an internal buffer so that they can be recalled and edited.

Data structures

Octave includes a limited amount of support for organizing data in structures. For instance:

octave:1> x.a = 1; x.b = [1, 2; 3, 4]; x.c = "string";

octave:2> x.a

x.a = 1

octave:3> x.b

x.b =

1 2

3 4

octave:4> x.c

x.c = string

Page 45: MATLAB Programming - Wikibooks

Short-circuit boolean operators

Octave's `&&' and `||' logical operators are evaluated in a short-circuit fashion (like the corresponding operators in the C language) and work differentlythan the element by element operators `&' and `|'.

Increment and decrement operators

Octave includes the C-like increment and decrement operators `++' and `--' in both their prefix and postfix forms.

Unwind-protect

Octave supports a limited form of exception handling modelled after the unwind-protect form of Lisp. The general form of an unwind_protect block lookslike this:

unwind_protect

body

unwind_protect_cleanup

cleanup

end_unwind_protect

Variable-length argument lists

Octave has a real mechanism for handling functions that take an unspecified number of arguments without explicit upper limit.

Here is an example of a function that uses the new syntax to print a header followed by an unspecified number of values:

function foo (heading, ...)

disp (heading);

va_start ();

while (--nargin)

disp (va_arg ());

endwhile

endfunction

Variable-length return lists

Octave also has a real mechanism for handling functions that return an unspecified number of values. For example:

function [...] = foo (n)

for i = 1:n

vr_val (i);

endfor

endfunction

See also

Octave Programming Tutorial

References

http://en.wikipedia.org/wiki/GNU_Octave

Octave has been mainly built with MATLAB compatibility in mind. It essentially shares a lot of features in common with MATLAB:

1. Matrices as fundamental data type.2. Built-in support for complex numbers.

3. Powerful built-in math functions and extensive function libraries.4. Extensibility in the form of user-defined functions.

Some of the differences that do exist between Octave and MATLAB can be worked around using "user preference variables."[1]

GNU Octave is mostly compatible with Matlab. However, Octave's parser allows some (often very useful) syntax that Matlab's does not, so programswritten for Octave might not run in Matlab. For example, Octave supports the use of both single and double quotes. Matlab only supports single quotes,which means parsing errors will occur if you try to use double quotes (e.g. in an Octave script when run on Matlab). Octave and Matlab users who mustcollaborate with each other need to take note of these issues and program accordingly.

Note: Octave can be run in "traditional mode" (by including the --traditional flag when starting Octave) which makes it behave in a slightlymore Matlab-compatible way.

This chapter documents instances where Matlab's parser will fail to run code that will run in Octave, and instances where Octave's parser will fail to runcode that will run in Matlab. This page also contains notes on differences between things that are different between Octave (in traditional mode) andMatlab.

Page 46: MATLAB Programming - Wikibooks

Tip for sharing .mat files between Octave and Matlab: always use save -V6 if you are using Matlab 7.X. Octave version 2.1.x cannot read Matlab 7.X

.mat files. Octave 2.9.x can read Matlab 7.X .mat files.

load

For compatiblility, it is best to specify absolute paths of files for LOAD. Matlab (7.0) vs Octave (2.1.71): paths are not searched for .mat files in the sameway as .m files:

Matlab

a = 1; save /tmp/a.mat a ; addpath('/tmp'); load a.mat

% OK

Octave

a = 1; save /tmp/a.mat a ;

LOADPATH=['/tmp:',LOADPATH];

load a.mat

% error: load: nonexistent file: `a.mat'

For any other purpose, don't use absolute paths. It is bad programming style. Don't do it. It causes many problems.

C-Style Autoincrement and Assignment operators

Octave (3.0.1) supports C-style autoincrement and assignment operators:

i++; ++i; i+=1; etc.

MatLab (7.0) does not.

Temporaries

Octave supports temporary expressions.

columns = size(mtx)(2); % works in Octave, fails in Matlab

tmp = size(mtx);

columns = tmp(2); % works in both

product of booleans

Matlab (7.0) and Octave (3.0.2) responds differently when computing the product of boolean values:

X = ones(2,2) ; prod(size(X)==1)

Matlab: ??? Function 'prod' is not defined for values of class 'logical'.

Octave: ans = 0

nargin

Matlab (7.0) will not allow the following; Octave (2.1.71) will.

function a = testfun(c)

if (nargin == 1)

nargin = 2;

end

startup.m

Matlab will execute a file named startup.m in the directory it was called from on the command line. Octave does not. It will, however, execute a file named.octaverc.

['abc ';'abc']

['abc ';'abc'] is allowed in Octave; Matlab returns: ?? Error using ==> vertcat

Page 47: MATLAB Programming - Wikibooks

In Octave the result will be a 2 by 4 matrix where the last element of the last row is a space.

Calling Shells

the "! STRING" syntax calls a shell with command STRING in Matlab. Octave does not recognize !. Always use system(STRING) for compatibility.

If you really miss the one-character shortcut, for convenience on the command line you can create a similar shortcut by defining the following in your 2.9.xoctave startup file:

function S(a), system(a); end

mark_as_rawcommand('S')

Now "S STRING" will evaluate the string in the shell.

hist

hist.m in Octave has a normalization input, Matlab does not.

Getting Version Information

Octave (2.1.7X) uses "OCTAVE_VERSION", Matlab uses "ver" for version informaton. (Octave 2.9.5 and later has "ver", so is compatible in thissense.)

Format of printing to screen

Cell arrays and structures print to screen in different format. There may be switches to make them the same, for example, struct_levels_to_print. None areset in --traditional mode, however.

Attempting to load empty files

MATLAB lets you load empty files, OCTAVE does not.

system('touch emptyfile') ; A = load('emptyfile')

Matlab 6.5 : A=[]

Octave 2.1.71 : error: load: file `emptyfile' seems to be empty!

error: load: unable to extract matrix size from file `emptyfile'

fprintf and printf

Matlab doesn't support `printf' as a command for printing to the screen.

foo = 5;

printf('My result is: %d\n', foo)

works in Octave, but not Matlab. If using Matlab, `fprintf' covers writing both to the screen and to a file:

foo = 5;

fprintf('My result is: %d\n', foo)

In Matlab, the omission of the optional file-handle argument to fprintf (or using the special value 1 for standard output or 2 for standard error) causes thetext to be printed to the screen rather than to a file.

Whitespace

Matlab doesn't allow whitespace before the transpose operator.

[0 1]'

works in Matlab, but

[0 1] '

doesn't. Octave allows both cases.

Page 48: MATLAB Programming - Wikibooks

Line continuation

Matlab always requires `...' for line continuation.

rand (1, ...

2)

while both

rand (1,

2)

and

rand (1, \

2)

work in Octave, in addition to `...'.

Logical operators (And, Or, Not)

Octave allows users to use two different group of logical operators: the ones used in Matlab, or the ones familiar to C/Java/etc programmers. If you usethe latter, however, you'll be writing code that Matlab will not accept, so try to use the Matlab-compatible ones:

For not-equal comparison, Octave can use '~=' or '!='. Matlab requires '~=' .

For a logical-and, Octave can use `&' or `&&'; Matlab requires `&' . (note: Matlab supports `&&' and `||' as short-circuit logical operators sinceversion 6.5.)

For a logical-or, Octave can use `|' or `||'; Matlab requires `|' . (note: Octave's '||' and '&&' return a scalar, '|' and '&' return matrices)

Octave Controls System Toolbox

Both MATLAB and Octave have toolboxes intended to control system design. In Octave, the toolbox is called the Octave Controls System Toolbox.Users of Debian and its derivatives can install it by installing the package "octave-control", if it is not installed by default.

In Octave, initialization of a system data structure (simply, a system model) works very much as in MATLAB: one can use tf, ss or zp commands in

order to initialize a system data structure in form of a transfer function, state space model or zero-pole representation. However, while in MATLAB onemay write simply F = G + H to sum up two systems or F = G*H to connect two systems in series, in Octave for that purpose one have to use

sysadd/syssub and sysmult, respectively.

For more information about functions' syntax, type help <name of function>. For more information about the Controls System Toolbox, start the

Octave Controls System Toolbox Demo demo/tutorial program by typing DEMOcontrol in Octave command prompt.

Example code in MATLAB:

F = G + H

Code in Octave doing the same:

F = sysadd(G, H)

Both approaches seems to work analogous, though MATLAB's looks a bit more clear. Hopefully, that would be fixed in future versions of Octave, sinceone of its primary goals is to wholly support the syntax of MATLAB. But there is no guarantee, and even no note about any attempt has yet beenpublished.

Some other differences

MATLAB uses the percent sign '%' to begin a comment. Octave uses both the pound sign '#' and the percent sign '%' interchangeably.

For exponentiation, Octave can use `^' or `**'; Matlab requires `^'.

Page 49: MATLAB Programming - Wikibooks

For string delimiters, Octave can use ' or "; Matlab requires '.

For ends, Octave can use `end{if,for, ...}'; Matlab requires `end'.

Octave supports C-style hexadecimal notation (e.g. "0xF0"); Matlab requires the hex2dec function (e.g. "hex2dec('F0')").

If something (like Netlab) need a function called fcnchk, you can just put the following into a file called fcnchk.m and put it somewhere Octave canfind it:

function f=fcnchk(x, n)

f = x;

end

Notes about specific functions

For datetick, use gnuplot commands:

__gnuplot_set xdata time

__gnuplot_set timefmt "%d/%m"

__gnuplot_set format x "%b %d"

datestr function: There used to be a difference in datestr between Octave-forge and Matlab. Has this been changed?

For "dbstep, in" use "dbstep"; for "dbstep", use "dbnext"

For "eig(A,B)" use "qz(A,B)"

fputs function is not available in MATLAB. Use fprintf instead.

For gallery, compan, and hadamard install http://www.ma.man.ac.uk/~higham/testmat.html

load in Matlab = load --force in Octave (should --force be default in --traditional?)

page_output_immediately = 1 should this be default in --traditional?

strread and textscan in Octave 3.4.0 are not fully compatible with their implementations in Matlab 2009b (and probably later versions as well). Forinstance, the N=-1 option (repeat reading format until end of string) is not implemented in Octave 3.4.0 . Using a value of N=a positive integer

(read format N times) does work the same as in Matlab.

textscan function is not included in Octave versions prior to 3.4.0 . Use fscanf instead.

References

1. ↑ http://www.gnu.org/software/octave/FAQ.html#IDX53

http://wiki.octave.org/wiki.pl?MatlabOctaveCompatibility

See also

Octave Programming Tutorial

Chapter 11: Toolboxes

Introduction to the Symbolic Math Toolbox

The symbolic toolbox is a bit difficult to use but it is of great utility in applications in which symbolic expressions are necessary for reasons of accuracy incalculations. The toolbox simply calls the MAPLE kernel with whatever symbolic expressions you have declared, and then returns a (usually symbolic)expression back to MATLAB. It is important to remember that MAPLE is not a numeric engine, which means that there are certain things it doesn't letyou do that MATLAB can do. Rather, it is useful as a supplement to provide functions which MATLAB, as a numerical engine, has difficulty with.

The symbolic math toolbox takes some time to initialize, so if nothing happens for a few seconds after you declare your first symbolic variable of thesession, it doesn't mean you did anything wrong.

The MATLAB student version comes with a copy of the symbolic math toolbox.

Symbolic Variables

You can declare a single symbolic variable using the 'sym' function as follows.

Page 50: MATLAB Programming - Wikibooks

>> a = sym('a1')

a = a1

You can create arrays of symbolic expressions like everything else:

>> a1 = sym('a1');

>> a2 = sym('a2');

>> a = [a1, a2]

a = [ a1, a2]

Symbolic variables can also be declared many at a time using the 'syms' function. By default, the symbolic variables created have the same names as thearguments of the 'syms' function. The following creates three symbolic variables, a b and c.

>> syms a b c

>> a

a = a

Symbolic Numbers

Symbolic numbers allow exact representations of fractions, intended to help avoid rounding errors and representation errors. This section helps explainhow to declare them.

If you try to add a number into a symbolic array it will automatically turn it into a symbolic number.

>> syms a1, a2;

>> a = [a1, a2];

>> a(3) = 1; %would normally be class 'double'

>> class(a(3))

ans = sym

Symbolic numbers can also be declared using the syntax a(3) = sym('number'). The difference between symbolic numbers and normal MATLAB numbersis that, if possible, MAPLE will keep the symbolic number as a fraction, which is an exact representation of the answer. For example, to represent thenumber 0.5 as a fraction, you can use:

>> sym(0.5)

ans = 1/2

Here, of course, MATLAB would normally return 0.5. To make MATLAB change this back into a 'double', type:

>> double(ans)

ans = 0.5000

Other class conversions are possible as well; for instance, to change it into a string use the 'char' function. There is no function to directly change asymbolic variable into a function handle, unfortunately.

A caveat: Making a symbolic variable of negative exponentials can create problems if you don't use the correct syntax. You cannot do this:

>> sym('2^-5')

??? Error using ==> sym.sym>char2sym

Not a valid symbolic expression.

Instead, you must do this:

>> sym('2^(-5)')

ans = 2^(-5)

MAPLE is thus more picky about what operators you can use than MATLAB.

Symbolic Functions

You can create functions of symbolic variables, not just the variables themselves. This is probably the most intuitive way to do it:

>> syms a b c %declare variables

>> f = a + b + c

ans = a + b + c

Page 51: MATLAB Programming - Wikibooks

If you do it this way, you can then subsequently perform substitutions, differentiations, and so on with respect to any one of these variables.

Substituting Values into Symbolic Variables

Substitutions can be made into functions of symbolic variables. Suppose you defined the function f = a + b + c and wish to substitute a = 3 into f. You cando this with the following syntax:

>> syms a b c %declare variables

>> f = a + b + c;

>> subs(f, a, 3)

ans = 3+b+c

Notice the form of this function call. The first argument is the name of the function you wish to substitute into. The second can be either the name of thesymbolic variable you want to plug in for or its present value, but if you want to avoid confusion they should be the same anyway. The third argument isthe value you want to plug in for that variable.

The value you're plugging in need not be a number. You can also plug in other variables (including those already present in the function) by using strings.Using the same f:

>> subs(f, a, 'x')

ans = x+b+c

>> subs(f, a, 'b')

ans = 2*b + c

If x is already a symbolic variable you can omit the quotes (but if it's not you'll get an undefined variable error):

>> syms x

>> subs(f,a,x)

ans = x+b+c

Multiple substitutions are allowed; to do it, just declare each of them as an array. For example, to plug in 1 for a and 2 for b use:

>> subs(f, [a,b], [1,2])

ans = 3+c

Finally, if you substitute for all of the symbolic values in a function MATLAB automatically changes the value back into a double so that you canmanipulate it in the MATLAB workspace.

>> subs(f, [a,b,c], [1,2,3])

ans = 6

>> class(ans)

ans = double

Algebraic Function Manipulations

The symbolic math toolbox allows you several different ways to manipulate functions. First off you can factor a function using 'factor' and multiply it outusing 'expand':

>> syms a b

>> f = a^2 - 2*a*b + b^2;

>> factor(f);

ans = (a - b)^2

>> expand(ans)

ans = a^2 - 2*a*b + b^2

The 'collect' function does the same thing as the 'expand' function but only effects polynomial terms. 'Expand' can also be used to expand trigonometricand logarithmic/exponential functions with the appropriate identities.

The Horner (nested) representation for a function is given by 'horner':

>> horner(f)

ans = b^2+(-2*b+a)*a

This representation has a relatively low number of operations required for its evaluation compared to the expanded version and is therefore helpful inmaking calculations more efficient.

A common problem with symbolic calculations is that the answer returned is often not in its simplest form. MATLAB's function 'simple' will perform all ofthe possible function manipulations and then return the one that is the shortest. To do this do something like:

>> Y = simple(f)

Y = (a - b)^2

Page 52: MATLAB Programming - Wikibooks

Algebraic Equations

The symbolic math toolbox is able to solve an algebraic expression for any variable, provided that it is mathematically possible to do so. It can also solveboth single equations and algebraic systems.

Solving Algebraic Equations With a Single Variable

MATLAB uses the 'solve' function to solve an algebraic equation. The syntax is solve(f, var) where f is the function you wish to solve and var is thevariable to solve for. If f is a function of a single variable you will get a number, while if it is multiple variables you will get a symbolic expression.

First, let us say we want to solve the quadratic equation x^2 = 16 for x. The solutions are x = -4 and x = 4. To do this, you can put the function into'solve' directly, or you can define a function in terms of x to solve and pass that into the 'solve' function. The first method is rather intuitive:

>> solve('x^2 = 16', x)

ans = -4

4

>> solve(x^2 - 16, x)

ans = -4

4

Either of these two syntax works. The first must be in quotes or you get an 'invalid assignment' error. In the second, x must be defined as a symbolicvariable beforehand or you get an 'undefined variable' error.

For the second method you assign a dummy variable to the equation you want to solve like this:

>> syms x

>> y = x^2 - 16;

>> solve(y, x);

Note that since MATLAB assumes that y = 0 when you're solving the equation, you must subtract 16 from both sides to put the equation into normalform.

Solving Symbolic Functions for Particular Variables

The format for doing this is similar to that for solving for a single variable, but you will get a symbolic function rather than a number as output. There are acouple of things to look out for though.

As an example, suppose that you want to solve the equation y = 2x + 4 for x. The expected solution is x = (y-4)/2. Lets see how we can get MATLABto do this. First let's look at how NOT to do it:

>> syms x

>> y = 2*x + 4;

>> solve(y, x)

ans = -2

What has happened here? The MATLAB toolbox assumes that the 'y' you declared is 0 for the purposes of solving the equation! So it solved theequation 2x + 4 = 0 for x. In order to do what you intended to do you have to put your original equation, y = 2x + 4, into normal form, which is 2x + 4 -y = 0. Once this is done, you need to assign a 'dummy' variable like this:

>> syms x y

>> S = 2*x + 4 - y; %S is the 'dummy'

>> solve(S, x)

ans = -2 + 1/2*y

This is, of course, the same thing as what we expected. You could also just pass the function into the 'solve' function like this, as done with functions of asingle variable:

>> solve('y = 2*x + 4', x);

The first method is preferable, because once it is set up it is much more flexible to changes in the function. In the second method you would have tochange every call to 'solve' if you changed the function at all, whereas in the first you only need to change the original definition of S.

Solving Algebraic Systems

The 'solve' command also allows you to solve systems of algebraic equations, and will attempt to return all solutions to these systems. As a first example,let us consider the linear system

a + b = 3

a + 2*b = 6,

Page 53: MATLAB Programming - Wikibooks

which has the solution (a,b) = (0,3). You can tell MATLAB to solve it as follows:

>> syms a b

>> f(1) = a + b - 3;

>> f(2) = a + 2*b - 6;

>> [A,B] = solve(f(1), f(2))

A = 0

B = 3

If only one output variable is specified but there are multiple equations, MATLAB will return the solutions in a struct array:

>> SOLUTION = solve(f(1), f(2))

SOLUTION =

a: [1x1 sym]

b: [1x1 sym]

>> SOLUTION.a

a = 0

>> SOLUTION.b

b = 3

The good thing about this is that the fields have the same names as the original variables, whereas in the other form it is easy to get confused which variableis going into which spot in the array. In addition, the struct array is more convenient for large systems.

Now let us look at a slightly more complex example:

a^2 + b^2 = 1

a + b = 1

This has solutions (a,b) = (0,1) and (a,b) = (1,0). Now putting this into MATLAB gives:

>> f = [a^2 + b^2 - 1, a + b - 1]; SOLUTION = solve(f(1), f(2));

>> SOLUTION.a

ans = 1

0

>> SOLUTION.b

ans = 0

1

Here both solutions are given, a(1) corresponds to b(1) and a(2) corresponds to b(2). To get one of the solutions into a single array together you can usenormal array indexing, as in:

>> Solution1 = [SOLUTION.a(1), SOLUTION.b(1)]

Solution1 = [1, 0]

Analytic Calculus

MATLAB's symbolic toolbox, in addition to its algebraic capabilities, can also perform many common calculus tasks, including analytical integration,differentiation, partial differentiation, integral transforms, and solving ordinary differential equations, provided the given tasks are mathematically possible.

Differentiation and Integration with One Variable

Differentiation of functions with one or more variables is achieved using the 'diff' function. As usual, you can either define the function before thedifferentiation (recommended for M files) or you can manually write it in as an argument (recommended for command-line work). If there is only onesymbolic variable in the expression, MATLAB assumes that is the variable you are differentiating with respect to. The syntax is simply:

>> syms x

>> f = x^2 - 3*x + 4;

>> diff(f) % or diff('x^2 - 3*x + 4')

ans = 2*x - 3

Integration, similarly, is achieved using the 'int' function. Only specifying the function results in an indefinite integral, or the antiderivative of the function.

>> int(f)

ans = x^3/3 - (3*x^2)/2 + 4*x

Note that if you only specify one output argument (or none at all), the 'int' function omits the integration constant. You just have to know it's there.

To do a definite integral on a one-variable function, simply specify the beginning and end points.

>> int(f, 0,1)

ans = 17/6

Page 54: MATLAB Programming - Wikibooks

Differentiation and Integration of Multivariable Functions

A convenient way of representing the derivatives of multivariate functions (partial derivatives) is with the Jacobian, which is performed by the 'jacobian'function. To use it, you should define an array of symbolic functions and then just pass it to the function (note the difference between the use of thisfunction, which requires all equations to be in the same array, and the use of 'solve', which requires you to separately pass each equation):

>> syms a b

>> f = [a^2 + b^2 - 1, a + b - 1];

>> Jac = jacobian(f)

Jac = [ 2*a, 2*b]

[ 1, 1]

Note that the first row is the gradient of f(1) and the second the gradient of f(2).

If you only want a specific partial derivative, not the entire Jacobian, you can call the 'diff' function with the function you want to differentiate and thevariable you wish to differentiate with respect to. If none is specified, differentiation occurs with respect to the variable closest to 'x' in the alphabet.

>> diff(f(1), a)

ans = 2*a

It is worth noting that to complete an implicit differentiation, one can explicitly state the implicit assumption by multiplying the differentiated function by

, where xi is the ith variable in a multivariable equation.

Indefinite integration of multivariate functions works the same as for single functions; pass the function and MATLAB will return the indefinite integral withrespect to the variable closest to x:

>> int(f(1))

ans = a^2*b+1/3*b^3-b

This is the integral with respect to b. To avoid confusion, you can specify the variable of integration with a second argument, as with differentiation.

>> int(f(1), a)

ans = 1/3*a^3+b^2*a-a

Definite integration (as far as I can tell) can only be done with respect to one variable at a time, and this is done by specifying the variable, then thebounds:

>> int(f(1), a, 1, 2) %integrate a from 1 to 2, holding b constant

ans = 4/3 + b^2

Analytic Solutions to ODEs

MATLAB can solve some simple forms of ODEs. Unlike with the integration and algebraic solving techniques, the syntax for the differential equationsolver requires that you put the function in manually in a specific manner. The derivatives must be specified using the symbol 'DNV', where N is the order

of the derivative and V is the variable that is changing. For example, suppose you seek the solution to the equation , the solutions to which

are of the form x(t) = A*cos(t) + B*sin(t). You would put this equation into the 'dsolve' function as follows:

>> syms x

>> dsolve('D2x = -x')

ans = C1*sin(t)+C2*cos(t)

Unlike the 'int' function, dsolve includes the integration constants. To specify initial conditions, just pass extra arguments to the 'dsolve' function as strings.If x'(0) = 2 and x(0) = 4 these are inserted as follows:

>> dsolve('D2x = -x', 'Dx(0) = 2', 'x(0) = 4')

ans = 2*sin(t)+4*cos(t)

Note that the initial conditions must also be passed as strings.

MATLAB can also solve systems of differential equations. An acceptable syntax is to pass each equation as a separate string, and then pass each initialcondition as a separate string:

Page 55: MATLAB Programming - Wikibooks

>> SOLUTION = dsolve('Df=3*f+4*g', 'Dg =-4*f+3*g', 'f(0) = 0', 'g(0) = 1')

SOLUTION = f: [1x1 sym]

g: [1x1 sym]

>> SOLUTION.f

SOLUTION.f = exp(3*t)*sin(4*t)

>> SOLUTION.g

SOLUTION.g = exp(3*t)*cos(4*t)

The 'dsolve' function, like 'solve', thus returns the solution as a structure array, with field names the same as the variables you used. Also like 'solve', youcan place the variables in separate arrays by specifying more than one output variable.

Integral Transforms

MATLAB's symbolic math toolbox lets you find integral transforms (in particular, the Laplace, Fourier, and Z-transform) and their inverses when theyexist. The syntax is similar to the other symbolic math functions: declare a function and pass it to the appropriate functions to obtain the transform (orinverse). The GUIDE Toolbox provided by MATLAB allows advanced MATLAB programmers to provide Graphical User Interfaces to their programs.GUIs are useful because they remove end users from the command line interface of MATLAB and provide an easy way to share code acrossnonprogrammers. In addition by using special compilers the mathematical ability of MATLAB seamlessly blends in with the GUI functionality provided.Just to provide an example, assume you are writing a nonlinear fitting system based on the levenburg marquardt algorithm. Implementing a same GUI inVC++ would take at least a month of effort. But in MATLAB with the existing nlinfit function the time for such an endeavor would be hours instead ofdays.

The figure shows an example of a simple GUI created with the GUIDE toolbox, it takes as input two numbers adds them and displays them in the thirdtextbox, very simple but it helps illustrate the fact that such a GUI was created in minutes. The first section we need to understand is the concept of acallback

CallBack

A callback is a functions executed whenever the user initiates an action by clicking for example on a button or pressing a key on the keyboard.Programming a callback is therefore the most important part of writing a GUI. For example in the GUI illustrated above, we would need to program acallback for the the button Add. This is provided as a callback in the code. The code is provided below and illustrates how to write a simple callback.

% --- Executes on button press in pushbutton1.function pushbutton1_Callback(hObject, eventdata, handles)% hObject handle to pushbutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)n1 = get(handles.edit2,'string');n2 = get(handles.edit1,'string');S = str2double(n1) + str2double(n2);set(handles.edit3,'String',num2str(S))

In this piece of code I get the numbers as a strings from the edit boxes and then convert them into numbers using the str2double function provided inMATLAB. I then set the string for the other edit box as the sum of these two numbers. This completes the simple example of a GUI needed to add twonumbers. To illustrate a more complex example I show how a simple exponential function can be plotted and you change the function's parameters, with alittle bit of imagination you could make it plot any arbitrary function you enter. To make the example even more complex I have two GUIS, one is thecontrol gui and the other is the plotting GUI, this allows the user to program some of the more complicated functionality expected out of the modern GUIsystems.

Sample Time Colors

By selecting Format->Sample Time Colors, you can get Simulink to color code signal lines according to their sample times. Colors are only updatedwhen the model is updated or simulated.

The most common colors are:

summary="This table gives the color, sample time pairings for Simulink's sample time colors. I couldn't get the MediaWiki markup to work"

Magenta Constant

Black Continuous

Red Fastest Discrete Sample Time

Yellow Hybrid/Mixed Sample Time

For the rest of the colors and other information, see Enabling Sample Time Colors (the Mathworks website)(http://www.mathworks.com/access/helpdesk/help/toolbox/simulink/ug/creating_model8.shtml)

Note: Constant sample time will only be displayed if Inline Parameters is checked in the Advanced Tab of Simulation->SimulationParameters. This is because constant blocks can have variables as their arguments.

Page 56: MATLAB Programming - Wikibooks

Wiki Is Moving

We are in the process of moving the Psychtoolbox Wiki to a new location (http://www.psychtoolbox.org) . Please help out by moving parts there anddeleting from here. Items that used to be here and are no longer so have already been moved to the new wiki.

Programming

Differences Between Psychtoolbox Versions -Specifies the difference between versions for OS 9, OS X, and Windows

Version independent scripts - Scripts to allow you to write programs that run on all versions of psychtoolbox.Windows only scripts - Scripts only useful when using the Windows port.

Screen - One of the most used functions in the Psychtoolbox. This function takes different commands and parameters depending upon what youwant to do (such as drawing a rectangle, text, etc.).

Example Code - Examples and useful code snippets.

Version 1.3, 3 November 2008 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. <http://fsf.org/>

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

0. PREAMBLE

The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone theeffective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves forthe author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.

This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements theGNU General Public License, which is a copyleft license designed for free software.

We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program shouldcome with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textualwork, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose isinstruction or reference.

1. APPLICABILITY AND DEFINITIONS

This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed underthe terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein.The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license ifyou copy, modify or distribute the work in a way requiring permission under copyright law.

A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/ortranslated into another language.

A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers orauthors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject.(Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter ofhistorical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that theDocument is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant.The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.

The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Documentis released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public,that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (fordrawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitablefor input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart ordiscourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copythat is not "Transparent" is called "Opaque".

Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XMLusing a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparentimage formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary wordprocessors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript orPDF produced by some word processors for output purposes only.

Page 57: MATLAB Programming - Wikibooks

The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requiresto appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearanceof the work's title, preceding the beginning of the body of the text.

The "publisher" means any person or entity that distributes copies of the Document to the public.

A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text thattranslates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications","Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ"according to this definition.

The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimersare considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these WarrantyDisclaimers may have is void and has no effect on the meaning of this License.

2. VERBATIM COPYING

You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, andthe license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those ofthis License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, youmay accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.

You may also lend copies, under the same conditions stated above, and you may publicly display copies.

3. COPYING IN QUANTITY

If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document'slicense notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on thefront cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The frontcover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copyingwith changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying inother respects.

If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover,and continue the rest onto adjacent pages.

If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copyalong with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public hasaccess to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latteroption, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remainthus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) ofthat edition to the public.

It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chanceto provide you with an updated version of the Document.

4. MODIFICATIONS

You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the ModifiedVersion under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the ModifiedVersion to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:

A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, ifthere were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that

version gives permission.B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together

with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from thisrequirement.

C. State on the Title page the name of the publisher of the Modified Version, as the publisher.D. Preserve all the copyright notices of the Document.

E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this

License, in the form shown in the Addendum below.G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice.

H. Include an unaltered copy of this License.I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the

Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, andpublisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.

J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network

Page 58: MATLAB Programming - Wikibooks

locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a networklocation for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives

permission.K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and

tone of each of the contributor acknowledgements and/or dedications given therein.L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered

part of the section titles.M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified version.

N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section.O. Preserve any Warranty Disclaimers.

If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from theDocument, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in theModified Version's license notice. These titles must be distinct from any other section titles.

You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties—forexample, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.

You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list ofCover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangementsmade by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the sameentity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher thatadded the old one.

The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or implyendorsement of any Modified Version.

5. COMBINING DOCUMENTS

You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions,provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sectionsof your combined work in its license notice, and that you preserve all their Warranty Disclaimers.

The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there aremultiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses,the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list ofInvariant Sections in the license notice of the combined work.

In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewisecombine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements".

6. COLLECTIONS OF DOCUMENTS

You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this Licensein the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of eachof the documents in all other respects.

You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License intothe extracted document, and follow this License in all other respects regarding verbatim copying of that document.

7. AGGREGATION WITH INDEPENDENT WORKS

A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distributionmedium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond whatthe individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are notthemselves derivative works of the Document.

If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate,the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if theDocument is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.

8. TRANSLATION

Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing InvariantSections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections inaddition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, andany Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices anddisclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version willprevail.

Page 59: MATLAB Programming - Wikibooks

If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) willtypically require changing the actual title.

9. TERMINATION

You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy,modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License.

However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until thecopyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by somereasonable means prior to 60 days after the cessation.

Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonablemeans, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation priorto 30 days after your receipt of the notice.

Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. Ifyour rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to useit.

10. FUTURE REVISIONS OF THIS LICENSE

The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will besimilar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.

Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or anylater version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has beenpublished (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose anyversion ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of thisLicense can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document.

11. RELICENSING

"Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also providesprominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive MultiauthorCollaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site.

"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profitcorporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that sameorganization.

"Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document.

An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other thanthis MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporatedprior to November 1, 2008.

The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009,provided the MMC is eligible for relicensing.

How to use this License for your documents

To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices justafter the title page:

Copyright (c) YEAR YOUR NAME.Permission is granted to copy, distribute and/or modify this document

under the terms of the GNU Free Documentation License, Version 1.3or any later version published by the Free Software Foundation;

with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.A copy of the license is included in the section entitled "GNU

Free Documentation License".

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this:

with the Invariant Sections being LIST THEIR TITLES, with the

Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.

If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.

Page 60: MATLAB Programming - Wikibooks

If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free softwarelicense, such as the GNU General Public License, to permit their use in free software.

Retrieved from "http://en.wikibooks.org/wiki/MATLAB_Programming/Print_Version"

This page was last modified on 23 June 2008, at 22:12.

Text is available under the Creative Commons Attribution-ShareAlike License; additional terms may apply. See Terms of Use for details.