SPM/Octave

From Wikibooks, open books for an open world
< SPM
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.

Octave[edit]

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

  • [[];{'a'}] returns {[];'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 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
  • 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.
  • 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
  • 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
  • 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
  • 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
  • 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
  • Behaviour of figure property ToolBar when set to auto. fixed
  • Properties of a popupmenu uicontrol. fixed
  • Callback execution of an edit uicontrol. fixed
  • Property value of checkbox uicontrol. fixed
  • 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
  • Order of uimenus. fixed
  • CreateMode argument for msgbox/errordlg/warndlg. fixed
  • Error no method for 'scalar struct = scalar'. fixed
  • Removing a context menu. fixed
  • Case-sensitive listdlg's SelectionMode values. fixed
  • Issues with copy to clipboard. fixed
  • Visible property of a uicontextmenu. fixed
  • make attempts to build libgui even with --disable-gui. fixed
  • function localfunctions not implemented. fixed
  • 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
  • Restore window button does not trigger a 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. 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
  • Default settings with uicontrols. fixed
  • Segmentation fault with Qt figures. fixed
  • mexCallMATLABWithTrap not implemented. fixed
  • mxSetDimensions for cell arrays. fixed
  • realpow: produced complex result. fixed
  • 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
  • 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
  • __have_gnuplot__ does not return anything. fixed
  • Output of uicontrol. fixed
  • isequalwithequalnans is missing. fixed
  • fwrite input argument type. fixed
  • set() is case-sensitive. fixed
  • Update list of missing functions. fixed
  • Error using print and the append flag. fixed
  • 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
  • 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
  • isequal is slow. fixed
  • 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
  • "Number" property for figure. fixed
  • Implementation of movegui. fixed
  • Implementation of savefig. fixed
  • 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
  • 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
  • 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
  • Figure's Position when MenuBar is none. fixed
  • 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
  • Implement uicontrol focusing behavior. fixed
  • Use of camlight when a patch is not visible. fixed
  • 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
  • warning: popupmenu value not within valid display range. fixed
  • gcbf and HandleVisibility property. fixed
  • Add support for more types for image's cdata. fixed
  • Implementation of lightangle. fixed
  • [MXE Octave] lib vs lib64. fixed
  • isosurface is slow. fixed
  • Image not displayed with YDir set to normal. fixed

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.