From Wikibooks, open books for an open world
Jump to navigation Jump to search

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.


MATLAB/Octave compatibility[edit]

GNU Octave is mostly compatible with MATLAB:

Compatibility status from other neuroimaging MATLAB packages:

Current status for SPM/Octave compatibility[edit]

SPM is not supported under Octave and there is a number of known issues (especially regarding the graphical user interface) but feel free to contact fil.spm@ucl.ac.uk if you are interested. In most situations, the standalone version of SPM might be a sufficient alternative.

You need to use latest version of SPM12 and GNU Octave (4.4.1).

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

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

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.
  • It is not possible to create a function handle with a function name that does not exist (eg, x = @sdlkjfhg fails, see this).
  • 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]

  • 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.
  • 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

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


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