matlab_-_datatypes
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revision | Last revisionBoth sides next revision | ||
matlab_-_datatypes [2012/10/06 02:43] – jochen | matlab_-_datatypes [2012/10/06 04:08] – re-written jochen | ||
---|---|---|---|
Line 5: | Line 5: | ||
A variable can be thought of as a storage container that has the following properties: | A variable can be thought of as a storage container that has the following properties: | ||
* links a name (identifier) to a value (or list of values) | * links a name (identifier) to a value (or list of values) | ||
- | * is available in a workspace, i.e. when a function is called, variables available in the calling workspace are hidden, unless they are **'' | + | * is available in a workspace, i.e. when a function is called, variables available in the calling workspace are hidden (different function code files can use the same variable names without conflict), unless they are **'' |
* can be assigned a (new) value (or list of values) using the **'' | * can be assigned a (new) value (or list of values) using the **'' | ||
* has a specific datatype, which can change during the course of a program (or command line session) | * has a specific datatype, which can change during the course of a program (or command line session) | ||
Line 82: | Line 82: | ||
A special case is the **'' | A special case is the **'' | ||
- | ===== Character datatype | + | Please note that instead of being keywords (such as in C/C++), datatypes are not " |
+ | |||
+ | ==== Character datatype ==== | ||
Given that Matlab variables can be arrays of arbitrary size, single characters, as well as " | Given that Matlab variables can be arrays of arbitrary size, single characters, as well as " | ||
Line 98: | Line 100: | ||
% is their distance in the alphabet, in this case 3!</ | % is their distance in the alphabet, in this case 3!</ | ||
- | ===== Cell compound data ===== | + | And that also means that a variable |
- | In many situations it is necessary to store data of different types (e.g. a name/string together with a number, such as age) in a " | + | |
- | To define a cell array as well as to address the **content** of a cell, Matlab uses the "curly braces" | + | ==== Compound datatypes ==== |
+ | In many situations it is necessary to store data of different types (e.g. a name/string together with a number, such as age) in a " | ||
+ | |||
+ | These compound datatypes are further sub-divided into two types: one where elements are (mainly) addressed by a numeric (or equivalent) indices, and one where elements are accessed by a field name in a tree-like structure (same rules as identifiers, | ||
+ | |||
+ | === Cell datatype === | ||
+ | The **'' | ||
+ | |||
+ | To define a cell array as well as to address the **content** of a cell, Matlab uses the "curly braces" | ||
name_and_age = {'John Doe', 41}; | name_and_age = {'John Doe', 41}; | ||
Line 113: | Line 122: | ||
Put differently, | Put differently, | ||
+ | |||
+ | Also, please note that if you use a variable (numeric, char, or compound!) when creating a new compound variable or setting one or several elements of a compound variable, the values in the compound variable will be **copies** of the content of the original variable (or rather, if the variable is altered, a copy is created). For instance:< | ||
+ | n = [12, 14, 10]; | ||
+ | s = ' | ||
+ | |||
+ | % store variables in compound variable | ||
+ | c = {s, n}; | ||
+ | |||
+ | % re-assign index 2 of n variable | ||
+ | n(2) = 18; | ||
+ | |||
+ | % and then c still contains [12, 14, 10] in its second cell element!</ | ||
+ | |||
+ | === Struct datatype === | ||
+ | The other compound datatype in Matlab is the **'' | ||
+ | |||
+ | Syntax-wise, | ||
+ | |||
+ | The obvious advantage is that code usually becomes less cryptic, given that instead of using syntax such as **'' | ||
+ | |||
+ | Please note that variables of type struct still can be of arbitrary size! This means that a list of structures (e.g. 5 people' | ||
+ | this_name = people(3).name; | ||
+ | this_age = people(3).age;</ | ||
+ | |||
+ | In turn this means that if the index expression is omitted, the **'' | ||
+ | all_names = {people.name};</ | ||
+ | |||
+ | === Multi-layered compounding === | ||
+ | Each cell and struct field can contain any of Matlab' | ||
+ | main_tree.leaf(3).subfield{4}(11: | ||
+ | |||
+ | If you see such a piece of code this can be translated into | ||
+ | * main_tree is of datatype struct (and must be of size 1x1, i.e. a scalar struct, to be valid) | ||
+ | * one of the field names of main_tree is called leaf, is also of datatype struct with at least field name subfield, and it presumably has at least 3 elements (see comment below) | ||
+ | * the subfield (of the third leaf!) is of type cell with at least 4 elements | ||
+ | * the 4th element of the subfield is a numeric array | ||
+ | * numeric indices 11 through 20 (of this numeric array) are set to 1 | ||
+ | |||
+ | Please be aware that this line of code is also valid if main_tree is not yet defined! In that case, the **'' | ||
+ | |||
+ | As you can see, while Matlab' | ||
+ | |||
+ | ==== Function handles ==== | ||
+ | The **'' | ||
+ | * the type of operation that is to be applied to a variable (or expression) is not fully determinable before code is run, in which case a function handle can be used to call a variable function (instead of using a syntax construction that selects from all possible options, which still could be insufficient if a function can be user defined) | ||
+ | * an argument in a function call itself is "an operation" | ||
+ | * a function is only available in a certain context (private function or sub-function in an M-file), in which case a function handle can be created and returned, allowing functions outside the original scope to use this function after all | ||
+ | |||
+ | Given the fact that this feature is fairly advanced, I won't be giving any in-depth examples at this point. Just be aware that variables can also be of type **'' | ||
+ | |||
+ | ==== User-defined datatypes ==== | ||
+ | Matlab allows users to add functionality by creating text files with the **'' | ||
+ | |||
+ | For this purpose, Matlab allows to define new datatypes (classes) by adding folders with a leading **'' | ||
+ | |||
+ | Again, this is fairly advanced coding and will not be discussed in-depth at this point. There are, however, a few important aspects I want to mention: | ||
+ | * the internal representation of objects is supposed to be of type struct | ||
+ | * indexing operations (incl. the struct syntax of **'' | ||
+ | * NeuroElf makes use of this feature by allowing a more C++/Visual Basic style syntax:< | ||
+ | % load a VMR into an xff object | ||
+ | vmr = xff(' | ||
+ | |||
+ | % call the function in @xff/ | ||
+ | vmr.Browse; | ||
+ | |||
+ | % get xfigure object of the main UI figure | ||
+ | neuroelf_gui; | ||
+ | global ne_gcfg; | ||
+ | mainfig = ne_gcfg.h.MainFig; | ||
+ | |||
+ | % switch to " | ||
+ | mainfig.ShowPage(2);</ | ||
+ |
matlab_-_datatypes.txt · Last modified: 2012/10/06 15:58 by jochen