# SPM/Octave

## GNU Octave[edit]

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[edit]

- Octave website: http://www.gnu.org/software/octave/
- 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-Forge: http://octave.sourceforge.net/
- GNU Octave and reproducible research by John W. Eaton

### MATLAB/Octave compatibility[edit]

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[edit]

SPM is currently **not** supported under Octave but further evaluation and validation are 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 (5.1).

For compilation of the MEX files for Octave, run the following:

cd /home/login/spm12/src make PLATFORM=octave make PLATFORM=octave install

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):

## Download SPM12 r4787 unzip('https://github.com/spm/spm12/archive/r7487.zip',pwd); ## Patch SPM12 urlwrite('https://raw.githubusercontent.com/spm/spm-docker/master/octave/spm12_r7487.patch','spm12_r7487.patch'); system('patch -p3 -d spm12-r7487 < spm12_r7487.patch'); ## Compile MEX files cd spm12-r7487/src system('make PLATFORM=octave'); system('make PLATFORM=octave install'); ## Add SPM12 to the function search path cd .. addpath(pwd); ## Start SPM12 spm

### How to contribute[edit]

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 observed so far in SPM with Octave[edit]

### Requires changes in SPM[edit]

- 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[edit]

returns**[[];{'a'}]***{[];'a'}*instead of*{'a'}*, won't fix**fcnchk.m**does not exist in Octave (can usually be replaced by**str2func.m**)**mkoctfile**does not recognize argument**-outdir**.**io64.h**is not defined, in progress.- save
**function handle**variables in MATLAB's binary data format, in progress - 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 - Mouse interaction with image objects don't work in fltk toolkit, in progress
- 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 - Reset submenus of a
**uicontextmenu**, in progress **Legend**object printed below lines in plot, in progress- Image display in a 3D view, in progress
**which.m**does not support the -ALL option (see this). in progress- Several problems with hierarchical
**classes**. fixed, fixed, fixed, fixed, fixed, fixed, in progress - Print does not preserve
**multiline**text and TeX markup, in progress - Error
**base_graphics_object::get_properties: invalid graphics object**, in progress - function
**import**not implemented, in progress - Access to
**object arrays**, in progress - Loading a
**function handle**from a MAT-file, in progress - Error in concatenation of
**classdef**objects, in progress - GUI Command Window could support
**syntax highlight**, in progress - Root graphics property "
**MonitorPositions**" not fully implemented, in progress - 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**strmatch**, incompatible result on 'empty' input, in progress**Patch**with zero area not displayed with OpenGL, in progress- Matlab
**eval**function accepts a column vector string input, in progress **uimenu**'s position is sometimes 0, in progress**rotate3d**compatibility with Matlab, in progress**sum, cumsum**, etc. mishandle integer inputs, in progress- ${cmd} replacement operator in
**regexprep**, in progress - zeros:
**like**keyword, in progress - textscan option
**MultipleDelimsAsOne**does not apply to space or tab characters, in progress **max_recursion_depth**error in classdef constructor, in progress- 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 - Implementation of
**histcounts**, in progress - Implement
**jsondecode**,**jsonencode**functions, in progress - Figure property
**IntegerHandle**does not work fully with Qt toolkit, in progress - Octave 4.3.0+ can't
**load**figures saved with previous versions, in progress - octave deadlocks with
**deletefcn**callback that calls graphical function, in progress - Behavior of
**open**with unknown or non-existing files, in progress **Private**directory in**+package**, in progress**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- Interpreter cannot find
**methods**in files of classdefs in**packages**, in progress - Binary input image for
**edge**, in progress - colorbar properties need
**listeners**to invoke actions, in progress - Removal of
**called_from_builtin**, in progress **Global**variable in a**MEX**file, in progress- Speed issue with
**uicontrols**, in progress **Path**management in the GUI, in progress- 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**uicontrols extent**is incorrect, in progress

~~It is not possible to create a~~fixed**function handle**with a function name that does not exist (eg, x = @crash fails).~~Line continuation "~~fixed**...**" 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','.')*~~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~~trailing~~fixed**filesep**in**addpath**/**rmpath**fixed*a='a';b={};c=*crashes with Octave (devel, not 3.2.4) while MATLAB returns c=[].**cellfun**(@(x)strcmp(a,x),b);~~Same error with~~fixed*b=*which should return [], i.e. problem with functions that return empty output.**get**(findobj(0,'Tag','xxx'),'a')(**save.m**(and perhaps**load.m**) have trouble with MATLAB binary MAT-format.~~when some variables are not double precision (e.g.~~fixed). fixed*clear a;a.field1=single(1);save a.mat a -v6;load a.mat*crashes on Octave dev ("error: load: invalid element type = 0")**dialog, errordlg, helpdlg, inputdlg, listdlg, msgbox, warndlg**do not exist in Octave.fixed.**gco.m**now exists in Octave but creates a figure if none exists.fixed**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.~~Assignment error with non-preallocated~~fixed**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.~~Objects not converted as structure when loaded from a~~fixed**MAT-file**if class definition is not in path.~~Accessing graphics~~fixed**object properties**from an empty handle displays obscure warning (*get([],'x')*).~~Compatibility:~~fixed**save**with empty variable names.~~Test on~~fixed**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.~~Empty struct~~fixed**struct([])**not preserved when saved in a MAT-file.~~Problem in~~fixed**regexprep**with**backslash**escape character.~~Segmentation fault with [B,C]=~~fixed**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**desktop**function does not exist, particularly useful for calls**desktop('-inuse')**.~~Compilation with~~fixed**SuiteSparse 3.2**fails.~~undefined symbol:~~fixed**mexCallMATLAB**.~~Segmentation fault with~~fixed**clf.m**test.fixed**W**specifier in fopen does not work.~~Parser oddity with~~fixed**if**statements.~~Problem with~~fixed**mxArray**in MEX files.~~Parse error with~~fixed**local functions**in classdef files.fixed**ind2rgb**does not handle float inputs in the same way than MATLAB.~~Invalid conversion from string to real scalar with~~, fixed**%c**.~~Compilation error~~, fixed**yylex**was not declared in this scope.~~Compilation failure due to~~fixed**openGL**., fixed**-depth**argument in**findobj**.fixed**evalc**is not defined.~~Support of~~, fixed**close all force**.~~warning in~~, fixed**findobj**when using regexp.~~Printing a figure not containing axes.~~fixed~~Error following an error in a~~fixed**callback**of a uimenu.~~SelectionType~~fixed**open**for double-click non available (Qt-only).~~Behaviour of figure property~~fixed**ToolBar**when set to**auto**.~~Properties of a~~fixed**popupmenu**uicontrol.~~Callback execution of an~~fixed**edit**uicontrol.~~Property~~fixed**value**of**checkbox**uicontrol.~~Interpretation of cell array in~~fixed**String**property of a**text**uicontrol.~~Incorrect output in~~fixed**textscan/strread**with trailing delimiter.~~Failure to exit when running Octave in~~fixed**--no-gui**mode.~~Freeze with~~fixed**drawnow**.~~Print options:~~fixed**-noui, -painters, -opengl**.~~Order of~~fixed**uimenu**s.fixed**CreateMode**argument for msgbox/errordlg/warndlg.~~Error~~fixed**no method for 'scalar struct = scalar'**.~~Removing a context menu.~~fixed~~Case-sensitive listdlg's~~fixed**SelectionMode**values.~~Issues with copy to~~fixed**clipboard**.fixed**Visible**property of a uicontextmenu.~~make attempts to build libgui even with~~fixed**--disable-gui**.~~function~~fixed**localfunctions**not implemented.~~Segmentation fault with missing~~fixed**warning state "all"**.fixed**corrcoef**is missing.~~Third output of~~fixed**uiputfile**undefined when user presses Cancel.~~MEX object files "*.o" are not automatically deleted after compilation (they are with MATLAB's mex).~~fixed~~Octave buffers output, which can be blocking.~~pager disabled by default in 4.4**fflush(stdout)**or page_screen_output has to be used.~~/usr/X11R6/lib/~~fixed**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.~~Restore window button does not trigger a~~fixed**repaint event**for its content.fixed**ginput**doesn't correctly process shift/ctlr/alt key combinations.fixed**Ctrl+C**doesn't interrupt and causes SIGABRT at exit.fixed**mxCreateNumericArray**with zero size.~~Build error with~~fixed**mx-cdm-dm.cc**.fixed**linspace()**incompatibility with Matlab when N < 2.~~Make display of coordinates in figure's~~fixed**status bar**optional.~~Crash when~~fixed**uicontrol's callback**returns an error.~~Refresh when using~~fixed**waitfor**.fixed**ButtonDownFcn**callback of an image.fixed**run**behaves differently from Matlab on function m-files.~~doc build fails with~~fixed**texi2dvi/texi2pdf**errors on Ubuntu 14.04.~~Figure handle input argument for~~fixed**close(...,'force')**.~~"~~fixed**parse error**" error message in GUI callbacks.fixed**delete(allchild(fig))**in a "deletefcn" callback raises error.~~missing~~fixed**getframe**function.fixed**Special characters**in uicontrol's string.fixed**prefdir**should not be a private function.fixed**Help menu**of Qt figures.~~Detection of~~fixed**Qscintilla**libraries.~~Default settings with~~fixed**uicontrols**.~~Segmentation fault with~~fixed**Qt figures**.fixed**mexCallMATLABWithTrap**not implemented.fixed**mxSetDimensions**for cell arrays.fixed**realpow**: produced complex result.~~Using exit() in batch mode throws~~fixed**octave::exit_exception**.~~Display of images for~~fixed**axes**partially outside a figure.~~uicontrol~~fixed**popupmenu**sizing.~~Implementation of~~fixed**containers.Map**.~~Error in the~~fixed**unwind_protect_cleanup**section of print.m.fixed**questdlg**displays buttons in reverse order.fixed**waitfor**should silently accept an empty graphics handle.~~Segmentation fault after a~~fixed**caught error**in an Octave script.~~Non-empty ouput for non-matching~~fixed**regexp**with 'names' option.~~Invalid FID and~~fixed**fopen(FID)**.fixed**__have_gnuplot__**does not return anything.~~Output of~~fixed**uicontrol**.fixed**isequalwithequalnans**is missing.fixed**fwrite**input argument type.fixed**set()**is case-sensitive.~~Update list of~~fixed**missing functions**.~~Error using print and the~~fixed**append**flag.~~Position of~~fixed**uimenu**.fixed**Loading of figures**(and other objects) from Octave IDE.fixed**orderfields**is slow.~~Undefined input to a~~fixed**classdef**method.fixed**ismember**fails if the string ends in a space.~~Infinite loop in~~fixed**normest1**.fixed**pinv(0)**different from Matlab.fixed**center()**relies on broadcasting.fixed**private**function in**classdef**file.fixed**isequal**is slow.fixed**modal windowstyle**property not working.~~Missing keyword~~fixed**help**for classdef keywords.fixed**makeValidName**and**makeUniqueStrings**.~~PDF user manual uses a~~fixed**backward apostrophe**` in code examples.~~"~~fixed**Number**" property for figure.~~Implementation of~~fixed**movegui**.~~Implementation of~~fixed**savefig**.~~Unknown command `~~fixed**codequoteundirected'**in help text.~~warning message when~~fixed**qcollectiongenerator**and**qhelpgenerator**are not found.~~Syntax of documentation with~~fixed**texinfo**4.13.~~Segmentation fault when executing a~~fixed**script**containing a figure.~~warning from~~fixed**opengl_renderer**about light object.~~uicontrol/uibuttongroup:~~fixed**focusing**not implemented yet.~~doc: some~~fixed**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.~~Error with~~fixed**whos -file**: 'load' not found.~~Colors of a~~fixed**uicontrol pushbutton**.fixed**uipanel**doesnt show border in linux.fixed**camlight**(axis_handle, ...) should work for Matlab Compatibility.~~Implementation of~~fixed**isfolder**.~~Figure's Position when~~fixed**MenuBar**is none.~~uicontrol: validation of~~fixed**cdata**property.fixed**savefig**should accept a vector of figure handles for Matlab compatibility.fixed**colormap**property of a figure cannot be empty.~~Implement uicontrol~~fixed**focusing**behavior.~~Use of~~fixed**camlight**when a patch is not visible.~~Property~~fixed**VertexNormals**not updated.fixed**gunzip/bunzip2**error with cell array of strings input.~~DOCSTRING macro does not recognize~~fixed**matlab.lang.makeValidName**.~~Change of a~~fixed**togglebutton**uicontrol's value not reflected graphically.~~warning:~~fixed**popupmenu**value not within valid display range.~~gcbf and~~fixed**HandleVisibility**property.~~Add support for more types for image's~~fixed**cdata**.~~Implementation of~~fixed**lightangle**.~~[MXE Octave] lib vs~~fixed**lib64**.fixed**isosurface**is slow.~~Image not displayed with~~fixed**YDir**set to normal.

### Undecided yet[edit]

- 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[edit]

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