# SPM/Octave
## GNU Octave

GNU Octave is a high-level language that is mostly compatible with MATLAB. It is free open source software under the terms of the GNU General Public License.

### Octave

* Octave website: https://octave.org/
* Octave project: http://hg.savannah.gnu.org/hgweb/octave/
* Octave Help mailing list: https://lists.gnu.org/mailman/listinfo/help-octave
* Octave Maintainers mailing list: https://lists.gnu.org/mailman/listinfo/octave-maintainers
* Octave bug tracker: http://savannah.gnu.org/bugs/?group=octave
* Octave GitHub: https://github.com/gnu-octave
* Octave-Forge: http://octave.sourceforge.net/
* GNU Octave and reproducible research by John W. Eaton

### MATLAB/Octave compatibility

GNU Octave is mostly compatible with MATLAB:
* http://wiki.octave.org/FAQ#Differences_between_Octave_and_Matlab
* https://en.wikibooks.org/wiki/MATLAB_Programming/Differences_between_Octave_and_MATLAB
* http://wiki.octave.org/Compatibility
Compatibility status from other neuroimaging MATLAB packages:
* EEGLAB: https://sccn.ucsd.edu/wiki/Running_EEGLAB_on_Octave
* FieldTrip: http://www.fieldtriptoolbox.org/faq/can_i_use_octave_instead_of_matlab/
* Psychtoolbox: http://psychtoolbox.org/

## Current status for SPM/Octave compatibility

SPM is currently not officially supported under Octave but many modules are effectively compatible. Feedbacks about further evaluation and validation are very welcome. In most situations, the standalone version of SPM might be a sufficient alternative.
Feel free to contact fil.spm@ucl.ac.uk if this is something you are interested in. You need to use the latest versions of SPM12 and GNU Octave (7.3).

### Compilation

For compilation of the MEX files for Octave, run the following:
An all-in-one Octave script to download, configure and install SPM in the current directory is as follow (to be typed at the Octave prompt):

### How to contribute

You can contribute to improve the support of SPM on GNU Octave in several ways:
* Report bugs: using the development version of Octave, report problems you encounter when using SPM to SPM or Octave developers. Make sure to only report a bug in Octave when it's something that should not be fixed in SPM instead. Try to isolate the problem as much as possible.
* Propose patches in Octave for bugs from the list below that have not been fixed yet.
* Contribute financially to the Octave community.

## Compatibility issues between SPM and Octave
### Requires changes in SPM

* Compilation of MEX files: use "mkoctfile --mex" and the MEX-file extension is ".mex" on all platforms.
* do is a reserved keyword in Octave (for a do-until loop) so cannot be used as variable name.
* disp should be called instead of display for standard variables (in OO programming).
* builtin('display',obj) does not work on user-defined objects (MATLAB returns 'classname object: x-by-y', i.e. it calls disp.m).
* class can only be called from the class constructor (and not in any other method function) (class(obj,'myclass') => myclass(obj)).
* The short-circuit && and || operators should be used in if statements, instead of binary operators & and |. This is reported by MLINT.
* MEX files should include "mex.h" but not "matrix.h", see this
* cd does not return current directory in Octave (unlikely to change, see this thread). Call pwd beforehand instead.

### Requires changes in Octave

* It is not possible to create a function handle with a function name that does not exist (eg, x = @crash fails). fixed
* Line continuation "..." does not ignore anything that appears after it, unless there is a comment sign % (MATLAB does). fixed
* strrep.m works on strings but not cell arrays. fixed
* isdeployed.m does not exist (function X=isdeployed, X=false;). fixed
* textscan.m, strread.m and textread.m do not exist (in 3.2.4; available in devel, see this and this). Note that in MATLAB, textscan should be preferred and replace strread and textread. The devel function crashes on textscan('aaa.bbb','%s','delimiter','.') fixed
* A subfunction of a private class method does not access fields directly (i.e. it's a step further from this) and calls subsref/subsasgn instead. fixed
* which.m does not support the -ALL option (see this). in progress
* trailing filesep in addpath/rmpath fixed
* a='a';b=;c=cellfun(@(x)strcmp(a,x),b); crashes with Octave (devel, not 3.2.4) while MATLAB returns c=. fixed
* Same error with b=get(findobj(0,'Tag','xxx'),'a') which should return, i.e. problem with functions that return empty output. fixed
* save.m (and perhaps load.m) have trouble with MATLAB binary MAT-format. (when some variables are not double precision (e.g. clear a;a.field1=single(1);save a.mat a -v6;load a.mat crashes on Octave dev ("error: load: invalid element type = 0") fixed). fixed
* dialog, errordlg, helpdlg, inputdlg, listdlg, msgbox, warndlg do not exist in Octave.
* gco.m now exists in Octave but creates a figure if none exists. fixed.
* fcnchk.m does not exist in Octave (can usually be replaced by str2func.m)
* isequal.m does not work with objects (error: find: wrong type argument `class', __isequal__.m at line 147). fixed
* logm(eye(3)) crashes, MATLAB returns zeros(3). fixed
* logm sometimes returns complex numbers. fixed
* mat2str fails on logical inputs. fixed
* Several problems with hierarchical classes. fixed, fixed, fixed, fixed, fixed, fixed, in progress
* Assignment error with non-preallocated sparse matrices (clear a; a(1,:)=sparse(1,3,1,1,3); returns A(I,J,...) = X: dimensions mismatch. fixed
* tic/toc do not handle input/output arguments as in MATLAB (tStart=tic; any_statements; tElapsed=toc(tStart);). fixed
* str2num(',1,1') returns [1 1] in MATLAB and in Octave. fixed
* Objects not converted as structure when loaded from a MAT-file if class definition is not in path. fixed
* Accessing graphics object properties from an empty handle displays obscure warning (get(,'x')). fixed
* Compatibility: save with empty variable names. fixed
* Test on fileparts input argument. fixed
* nargchk(1,1,1,'struct') returns a 1x1 struct with no fields in Octave and a 0x1 struct with fields message and identifier in MATLAB. fixed
* [;{'a'}] returns {;'a'} instead of {'a'}, won't fix
* Empty struct struct() not preserved when saved in a MAT-file. fixed
* Problem in regexprep with backslash escape character. fixed
* Segmentation fault with [B,C]=chol(-speye(3)). fixed
* mwSignedIndex is not defined => typedef int mwSignedIndex; fixed
* cell arrays of cell arrays as saved by matlabbatch are not parsed properly with Octave. fixed
* mkoctfile does not recognize argument -outdir. in progress
* desktop function does not exist, particularly useful for calls desktop('-inuse'). fixed
* Compilation with SuiteSparse 3.2 fails. fixed
* undefined symbol: mexCallMATLAB. fixed
* Segmentation fault with clf.m test. fixed
* W specifier in fopen does not work. fixed
* Parser oddity with if statements. fixed
* Problem with mxArray in MEX files. fixed
* Parse error with local functions in classdef files. fixed
* ind2rgb does not handle float inputs in the same way than MATLAB. fixed
* Invalid conversion from string to real scalar with %c., fixed
* Compilation error yylex was not declared in this scope., fixed
* Compilation failure due to openGL. fixed
* -depth argument in findobj., fixed
* evalc is not defined. fixed
* io64.h is not defined, in progress.
* save function handle variables in MATLAB's binary data format, in progress
* Support of close all force., fixed
* warning in findobj when using regexp., fixed
* Printing a figure not containing axes. fixed
* Error following an error in a callback of a uimenu. fixed
* SelectionType open for double-click non available (Qt-only). fixed
* hgload can't open MATLAB figures, in progress
* Difference with figure/uicontrol between Octave and MATLAB, in progress
* Segmentation fault when loading a MAT-file containing a function_handle to a subfunction, in progress
* Behaviour of figure property ToolBar when set to auto. fixed
* Properties of a popupmenu uicontrol. fixed
* Callback execution of an edit uicontrol. fixed
* Mouse interaction with image objects don't work in fltk toolkit, in progress
* Property value of checkbox uicontrol. fixed
* Changing the style of a uicontrol after creation, in progress
* Display of popupmenu uicontrol (Qt) in progress
* Mouse click callbacks of a listbox uicontrol, in progress
* Interpretation of cell array in String property of a text uicontrol. fixed
* Incorrect output in textscan/strread with trailing delimiter. fixed
* Failure to exit when running Octave in --no-gui mode. fixed
* Freeze with drawnow. fixed
* Print options: -noui, -painters, -opengl. fixed
* Reset submenus of a uicontextmenu, in progress
* Legend object printed below lines in plot, in progress
* Order of uimenus. fixed
* CreateMode argument for msgbox/errordlg/warndlg. fixed
* Error no method for 'scalar struct = scalar'. fixed
* Print does not preserve multiline text and TeX markup, in progress
* Removing a context menu. fixed
* Case-sensitive listdlg's SelectionMode values. fixed
* Image display in a 3D view, in progress
* Issues with copy to clipboard. fixed
* Error base_graphics_object::get_properties: invalid graphics object, in progress
* Visible property of a uicontextmenu. fixed
* make attempts to build libgui even with --disable-gui. fixed
* function localfunctions not implemented. fixed
* function import not implemented, in progress
* Access to object arrays, in progress
* Loading a function handle from a MAT-file, in progress
* Segmentation fault with missing warning state "all". fixed
* corrcoef is missing. fixed
* Third output of uiputfile undefined when user presses Cancel. fixed
* MEX object files "*.o" are not automatically deleted after compilation (they are with MATLAB's mex). fixed
* Octave buffers output, which can be blocking. fflush(stdout) or page_screen_output has to be used. pager disabled by default in 4.4
* /usr/X11R6/lib/libGL.so: could not read symbols on Suse 64 bits. fixed
* CHOLMOD_NOT_POSDEF was not declared in this scope. fixed
* sortrows/sort: only cell arrays of character strings may be sorted error. fixed
* Error in concatenation of classdef objects, in progress
* Restore window button does not trigger a repaint event for its content. fixed
* ginput doesn't correctly process shift/ctlr/alt key combinations.fixed
* GUI Command Window could support syntax highlight, in progress
* Ctrl+C doesn't interrupt and causes SIGABRT at exit. fixed
* mxCreateNumericArray with zero size. fixed
* Build error with mx-cdm-dm.cc. fixed
* linspace incompatibility with Matlab when N < 2. fixed
* Make display of coordinates in figure's status bar optional. fixed
* Crash when uicontrol's callback returns an error. fixed
* Refresh when using waitfor. fixed
* ButtonDownFcn callback of an image. fixed
* run behaves differently from Matlab on function m-files. fixed
* doc build fails with texi2dvi/texi2pdf errors on Ubuntu 14.04. fixed
* Figure handle input argument for close(...,'force'). fixed
* "parse error" error message in GUI callbacks. fixed
* delete(allchild(fig)) in a "deletefcn" callback raises error. fixed
* missing getframe function. fixed
* Special characters in uicontrol's string. fixed
* prefdir should not be a private function. fixed
* Help menu of Qt figures. fixed
* Detection of Qscintilla libraries. fixed
* Root graphics property "MonitorPositions" not fully implemented, in progress
* Default settings with uicontrols. fixed
* Segmentation fault with Qt figures. fixed
* uicontrols extent is incorrect, in progress
* mexCallMATLABWithTrap not implemented. fixed
* mxSetDimensions for cell arrays. fixed
* realpow: produced complex result. fixed
* Cannot set breakpoints in subfunctions from GUI editor when not using "endfunction" keyword, in progress
* Missing MEX function mxArrayToUTF8String, in progress
* Backgroundcolor ignored for pushbutton and radiobutton, in progress
* Using exit in batch mode throws octave::exit_exception. fixed
* Display of images for axes partially outside a figure. fixed
* uicontrol popupmenu sizing. fixed
* Implementation of containers.Map. fixed
* Error in the unwind_protect_cleanup section of print.m.fixed
* strmatch, incompatible result on 'empty' input, in progress
* Patch with zero area not displayed with OpenGL, in progress
* questdlg displays buttons in reverse order. fixed
* waitfor should silently accept an empty graphics handle. fixed
* Segmentation fault after a caught error in an Octave script. fixed
* Non-empty ouput for non-matching regexp with 'names' option. fixed
* Invalid FID and fopen(FID). fixed
* Matlab eval function accepts a column vector string input, in progress
* __have_gnuplot__ does not return anything. fixed
* uimenu 's position is sometimes 0, in progress
* rotate3d compatibility with Matlab, in progress
* Output of uicontrol. fixed
* isequalwithequalnans is missing. fixed
* fwrite input argument type. fixed
* set is case-sensitive. fixed
* Update list of missing functions. fixed
* sum, cumsum, etc. mishandle integer inputs, in progress
* Error using print and the append flag. fixed
* ${cmd} replacement operator in regexprep, in progress
* Position of uimenu. fixed
* Loading of figures (and other objects) from Octave IDE. fixed
* orderfields is slow. fixed
* Undefined input to a classdef method. fixed
* zeros: like keyword, in progress
* textscan option MultipleDelimsAsOne does not apply to space or tab characters, in progress
* ismember fails if the string ends in a space. fixed
* Infinite loop in normest1. fixed
* pinv(0) different from Matlab. fixed
* center relies on broadcasting. fixed
* private function in classdef file. fixed
* max_recursion_depth error in classdef constructor, in progress
* isequal is slow. fixed
* display of multidimensional arrays uses 'ans', in progress
* strcmp with multidimensional char arrays, in progress
* Implementation of class categorical, in progress
* Support for "import" keyword, in progress
* modal windowstyle property not working. fixed
* Missing keyword help for classdef keywords. fixed
* makeValidName and makeUniqueStrings. fixed
* PDF user manual uses a backward apostrophe ` in code examples. fixed
* Implementation of histcounts, in progress
* Implement jsondecode, jsonencode functions, in progress
* Figure property IntegerHandle does not work fully with Qt toolkit, in progress
* "Number" property for figure. fixed
* Implementation of movegui. fixed
* Implementation of savefig. fixed
* Octave 4.3.0+ can't load figures saved with previous versions, in progress
* Unknown command `codequoteundirected' in help text. fixed
* warning message when qcollectiongenerator and qhelpgenerator are not found. fixed
* Syntax of documentation with texinfo 4.13. fixed
* Segmentation fault when executing a script containing a figure. fixed
* warning from opengl_renderer about light object. fixed
* uicontrol/uibuttongroup: focusing not implemented yet. fixed
* octave deadlocks with deletefcn callback that calls graphical function, in progress
* doc: some default Qt properties are different between systems. fixed
* MEX file in a private directory of a class. fixed
* ismember error with mixed numeric and char arrays inputs. fixed
* Error with whos -file: 'load' not found. fixed
* Behavior of open with unknown or non-existing files, in progress
* Colors of a uicontrol pushbutton. fixed
* uipanel doesnt show border in linux. fixed
* camlight (axis_handle, ...) should work for Matlab Compatibility. fixed
* Implementation of isfolder. fixed
* Private directory in +package, in progress
* Figure's Position when MenuBar is none. fixed
* load should issue an error if specified variable does not exist in file, in progress
* subsasgn call when the subscripted expression contains the end keyword, in progress
* Implementation of memmapfile, in progress
* File browser unresponsive, in progress
* uicontrol: validation of cdata property. fixed
* savefig should accept a vector of figure handles for Matlab compatibility. fixed
* colormap property of a figure cannot be empty. fixed
* Interpreter cannot find methods in files of classdefs in packages, in progress
* Implement uicontrol focusing behavior. fixed
* Use of camlight when a patch is not visible. fixed
* Removal of called_from_builtin, in progress
* Property VertexNormals not updated. fixed
* gunzip/bunzip2 error with cell array of strings input. fixed
* DOCSTRING macro does not recognize matlab.lang.makeValidName. fixed
* Change of a togglebutton uicontrol's value not reflected graphically. fixed
* Global variable in a MEX file, in progress
* warning: popupmenu value not within valid display range. fixed
* Speed issue with uicontrols, in progress
* gcbf and HandleVisibility property. fixed
* Add support for more types for image's cdata. fixed
* Binary input image for edge, in progress
* colorbar properties need listeners to invoke actions, in progress
* Implementation of lightangle. fixed
* [MXE Octave] lib vs lib64. fixed
* Path management in the GUI, in progress
* isosurface is slow. fixed
* Image not displayed with YDir set to normal. fixed
* Conflict between package namespace and function name, in progress
* subsref called in a subscripted assignment operation, in progress
* statistical CDF functions lack upper argument support, in progress
* Closing plots much slower in Octave 5.1.0, in progress
* dbup and dbdown not working as expected, in progress

### Undecided yet

* mkoctfile's option to define output file name is "-o" or "--output" while mex's option is "-output". If used, no file extension ('.mex') is appended.
* computer.m returns different strings than on MATLAB (PCWIN, GLNX86, PCWIN64, GLNXA64, MACI64), e.g. x86_64-unknown-linux-gnu.
* load.m and save.m automatically add a .mat file extension if not provided with MATLAB (Octave doesn't).

### Miscellaneous

* exist('OCTAVE_VERSION','builtin') can be used to detect if running in Octave or MATLAB.