====== Matlab - introduction ======
Given that NeuroElf is a Matlab toolbox with several features only available via the command line (at present at least), I want to give a short overview of Matlab, its features and how the user may be able to make better use of the available functionality.
First of all, Matlab can be regarded as a development environment with features such as a built-in GUI to inspect the current state (variables in the present workspace and their contents), editor with syntax highlighting, a debugging mechanism to run code step-by-step, and a powerful command line prompt.
But Matlab also comes with its own language (which shares many concepts, syntax elements, and features with other languages), and I want to highlight some of the most important features:
===== Language features =====
* the language is easy to use for prototyping, given its forgiving and user-friendly nature
* variables don't require a declaration but can be defined and have their datatype and dimension changed at any point within a program
* numeric variables are, by default, all created with a standard datatype of **''double''**, requiring little (if any) knowledge of numeric datatypes
* storage of and access to variable values is organized in workspaces
* identifiers can be overloaded (e.g. built-in functions can be replaced by user defined ones), globally or separately in each workspace
* array indexing is available in multiple ways to simplify element selection (see [[Matlab - datatypes|datatypes and indexing page]])
* array-based operations are highly optimized for speed and mostly support multiple CPU cores
* memory management is built-in (workspace-related garbage collection on variables no longer in use)
* Matlab comes with a vast repository of built-in and built-upon functions for mathematical computations, data in- and output, as well as visualization
* functions can return more than one output value/variable (without having to resort to compound/struct variables)
* the number of keywords of the basic language is extremely small (20 english words, besides operator symbols), as compared to about 60 for C++ or more than 100 for Visual Basic
* user-defined datatypes are (usually) based on a built-in datatype (struct) and allow object-oriented development
* with a built-in interface to compiled code (MEX), Matlab allows to translate computationally intensive operations (recursion, etc.) into compiled code for speedup
* built-in file format to store the content of variables in a binary format (incl. compression and platform independence)
==== Built-in functionality ====
On top of these features, Matlab comes with many, many built-in functions from a variety of fields, among them are
* mathematical functions (sum, mean, median, mode, standard deviation/variance, discrete derivatives, convolution, minimum, maximum, etc.)
* list and set related functions (sort, unique, intersect, setdiff, union, etc.)
* rudimentary statistical functions (histogram, correlation coefficient, detrending, etc.)
* matrix operations (inverse, pseudo-inverse, SVD, decomposition, etc.)
* graphical output functions (line, polygon, shape, surface, and scatter plot, annotations, etc.)
* GUI functions (figures, controls, callback handling, etc.)
These features make it usually relatively efficient to create code with complex functionality with just a few lines of code.
==== User-provided toolboxes ====
Mathworks additionally provides a user-defined toolbox area on their webserver, [[http://www.mathworks.com/matlabcentral/fileexchange/|File Exchange]], where users can upload their functions (or sets of functions, called toolboxes) which often allows users to solve even complex problems with a minimal effort, given that someone has already solved it before.
===== GUI elements =====
When Matlab is started (in its default configuration), the following "windows" (components) are available:
* command line (prompt): this allows to enter commands (expressions, assignments, function calls, etc.), call a system process, and control the debugging mechanism (workspace control, etc.)
* command history: a list of the previously executed commands (incl. those of previous Matlab sessions)
* workspace inspector: this window shows a list of variables in the current workspace (name, datatype, size, min/max value)
* if a variable name is double-clicked, a variable-editor window is added (or selected if already visible), allowing to inspect and alter variable content graphically
* current folder widget: file/folder browser showing the content of the "present working directory" (pwd), allowing to navigate the folder structure and select files
* a "file detail" view, showing the content of known file types (MAT files)
Additionally, Matlab comes with a built-in Editor, supporting syntax highlighting and augmenting several of the core features of Matlab, as well as a Profiler, a tool to identify bottlenecks in code, i.e. a help to improve the run-time properties (time and memory consumption) of user-written code.
==== Command line ====
The command line allows the user to enter commands and inspect returned values (text output intermixed with input). Matlab shows a prompt (**''>>''**) during normal operation and an extended prompt for debugging (**''K>>''**). The command line offers a few additional functions which are extremely helpful:
* pressing the **''cursor-up''** key allows to cycle through previous commands, and if some text is entered before, only entries matching this text are presented
* the **''tab''**-key does not produce a tab-character (indentation) but instead Matlab attempts to auto-complete a series of letters to a "known expression" (variable, field, function, or file name, depending on context)
* when entering expressions with parenthesis (precedence of operations, function arguments, etc.) or brackets/curly braces, Matlab highlights matching pairs to confirm the completeness of the expression
* if an expression is incomplete (e.g. a **''for''** loop is constructed, but the final **''end''** keyword is missing), Matlab expects additional input on the next line (after pressing return)
* whenever an error is encountered while processing a line of input, Matlab indicates the exact position of the problem with a vertical line below the input (pipe character)
* output in the command window supports hyperlinks (in help texts for instance), which gives the user to immediately select a topic of reference for additional information
* the **''display''** function (which is automatically called when an expression is not terminated with a semicolon) provides auto-formatting for all built-in datatypes (incl. arrays)
* to change the current folder or load a MAT-file, drag-and-drop operations can be performed with either Finder (Mac) or Explorer (Windows), by dragging a folder or MAT-file name into the command prompt window
==== Command history ====
The history window is particularly useful when a series of commands is to be converted into an M-file (batch of function file grouping a set of commands/function calls into a new functionality). This can be achieved by selecting several entries (line by line selection) and then using the context menu (right-click or **''CTRL''**-click). To quickly repeat one specific instruction, an entry can also be double-clicked.
==== Workspace ====
Equally, the workspace window offers a context menu, which allows to rename variables, delete them from the workspace (same as **''clear VARIABLE''**), save the content of selected variables to disk, or alter their content.
==== Current folder ====
The current folder window is a feature-rich file browser, also with additional functionality in the context menu.