SPM/Octave
外觀
< SPM
SPM 華夏公益教科書已移至 https://www.fil.ion.ucl.ac.uk/spm/docs/ |
GNU Octave 是一種高階語言,它與 MATLAB 大部分相容。它是根據 GNU 通用公共許可證條款釋出的免費開源軟體。
- Octave 網站:https://octave.org/
- Octave 專案:http://hg.savannah.gnu.org/hgweb/octave/
- Octave 幫助郵件列表:https://lists.gnu.org/mailman/listinfo/help-octave
- Octave 維護者郵件列表:https://lists.gnu.org/mailman/listinfo/octave-maintainers
- Octave 錯誤追蹤器:http://savannah.gnu.org/bugs/?group=octave
- Octave GitHub:https://github.com/gnu-octave
- Octave-Forge:http://octave.sourceforge.net/
- GNU Octave 和可重複研究 由 John W. Eaton 撰寫
GNU Octave 與 MATLAB 大部分相容
- http://wiki.octave.org/FAQ#Differences_between_Octave_and_Matlab
- https://wikibook.tw/wiki/MATLAB_Programming/Differences_between_Octave_and_MATLAB
- http://wiki.octave.org/Compatibility
其他神經影像 MATLAB 軟體包的相容性狀態
- 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/
SPM 目前不支援在 Octave 下執行,但許多模組實際上是相容的。歡迎提供有關進一步評估和驗證的反饋。在大多數情況下,SPM 的獨立版本 可能是足夠可行的替代方案。
如果您對此感興趣,請隨時聯絡 fil.spm@ucl.ac.uk。您需要使用最新版本的 SPM12 和 GNU Octave (7.3)。
要編譯 Octave 的 MEX 檔案,請執行以下命令
cd /home/login/spm12/src make PLATFORM=octave make PLATFORM=octave install
一個在當前目錄下載、配置和安裝 SPM 的一體化 Octave 指令碼如下(在 Octave 提示符處輸入):
%% Store current working directory
cwd = pwd;
%% Download SPM12 r7771
unzip ("https://github.com/spm/spm12/archive/r7771.zip", cwd);
%% Patch SPM12
urlwrite ("https://raw.githubusercontent.com/spm/spm-octave/main/spm12_r7771.patch", "spm12_r7771.patch");
system ("patch -p3 -d spm12-r7771 < spm12_r7771.patch");
%% Compile MEX files
cd (fullfile (cwd, "spm12-r7771", "src"));
system ("make PLATFORM=octave");
system ("make PLATFORM=octave install");
%% Add SPM12 to the function search path
addpath (fullfile (cwd, "spm12-r7771"));
cd (cwd);
%% Start SPM12
spm
您可以透過多種方式幫助改進 GNU Octave 對 SPM 的支援
- 報告錯誤: 使用 Octave 的開發版本,將您在使用 SPM 時遇到的問題報告給 SPM 或 Octave 開發人員。請確保僅當遇到 SPM 中不應該修復的問題時才報告 Octave 的錯誤。儘可能隔離問題。
- 提出補丁 用於修復以下列表中尚未修復的錯誤。
- 經濟上支援 Octave 社群。
- MEX 檔案的編譯:使用"mkoctfile --mex",並且 MEX 副檔名為 ".mex",適用於所有平臺。
- do 是 Octave 中的保留關鍵字(用於 do-until 迴圈),因此不能用作變數名。
- 對於標準變數(在 OO 程式設計中)應該呼叫disp 而不是display。
- builtin('display',obj) 不適用於使用者定義的物件(MATLAB 返回 'classname object: x-by-y',即它呼叫 disp.m)。
- class 只能從類建構函式中呼叫(而不是在任何其他方法函式中呼叫)(class(obj,'myclass') => myclass(obj))。
- 在 if 語句中應該使用短路&& 和|| 運算子,而不是二進位制運算子 & 和 |。MLINT 會報告此問題。
- MEX 檔案應該包含 "mex.h" 但不應包含"matrix.h",請參閱 此處
- cd 不會在 Octave 中返回當前目錄(不太可能更改,請參閱 此執行緒)。改用事先呼叫pwd。
無法使用不存在的函式名稱建立函式控制代碼(例如,x = @crash 會失敗)。已修復行繼續符 "..." 不會忽略它之後出現的任何內容,除非有註釋符號%(MATLAB 會)。已修復strrep.m 可以作用於字串,但不能作用於元胞陣列。已修復isdeployed.m 不存在(函式 X=isdeployed,X=false;)。已修復textscan.m、strread.m 和textread.m 不存在(在 3.2.4 中;在 devel 中可用,請參閱 此處 和 此處)。請注意,在 MATLAB 中,應優先使用 textscan 並替換 strread 和 textread。devel 函式在textscan('aaa.bbb','%s','delimiter','.') 上崩潰已修復私有類方法的子函式不會直接訪問欄位(即它比 此處 更進一步)並且會呼叫 subsref/subsasgn。已修復- which.m 不支援 -ALL 選項(請參閱 此處)。正在進行
addpath/rmpath 中的尾隨filesep已修復a='a';b={};c=cellfun(@(x)strcmp(a,x),b); 在 Octave (開發版,非 3.2.4) 中會崩潰,而 MATLAB 返回 c=[].已修復同樣的錯誤出現在 b=get(findobj(0,'Tag','xxx'),'a') 中,它應該返回 [],即函式返回空輸出的問題。已修復save.m(可能還有 load.m)在處理 MATLAB 二進位制 MAT 格式時遇到問題。(當一些變數不是雙精度時(例如 clear a;a.field1=single(1);save a.mat a -v6;load a.mat 在 Octave 開發版中會崩潰 ("error: load: invalid element type = 0")已修復)。 已修復dialog, errordlg, helpdlg, inputdlg, listdlg, msgbox, warndlg 在 Octave 中不存在。gco.m 現在在 Octave 中存在,但在不存在圖形的情況下會建立一個圖形。已修復.- fcnchk.m 在 Octave 中不存在(通常可以用 str2func.m 代替)。
isequal.m 不適用於物件(error: find: wrong type argument `class', __isequal__.m at line 147)。已修復logm(eye(3)) 會崩潰,MATLAB 返回 zeros(3)。已修復logm 有時會返回複數。已修復mat2str 在邏輯輸入上會失敗。已修復- 層次化 類 中存在一些問題。 已修復, 已修復, 已修復, 已修復, 已修復, 已修復, 正在進行中
未預分配的 sparse 矩陣的賦值錯誤(clear a; a(1,:)=sparse(1,3,1,1,3); 返回 A(I,J,...) = X: dimensions mismatch)。已修復tic/toc 不像 MATLAB 一樣處理輸入/輸出引數(tStart=tic; any_statements; tElapsed=toc(tStart);)。已修復str2num(',1,1') 在 MATLAB 中返回 [1 1],在 Octave 中返回 []。已修復如果類定義不在路徑中,從 MAT 檔案 載入時,物件不會被轉換為結構體。已修復從空控制代碼訪問圖形 物件屬性 會顯示模糊的警告(get([],'x'))。已修復相容性:使用空變數名的 save。已修復測試 fileparts 的輸入引數。已修復nargchk(1,1,1,'struct') 在 Octave 中返回一個 1x1 結構體,沒有欄位,在 MATLAB 中返回一個 0x1 結構體,欄位為 message 和 identifier。已修復- [[];{'a'}] 返回 {[];'a'} 而不是 {'a'}, 不會修復
空結構體 struct([]) 在儲存到 MAT 檔案時不會被保留。已修復regexprep 中使用 反斜槓 跳脫字元的問題。已修復[B,C]=chol(-speye(3)) 會導致段錯誤。已修復mwSignedIndex 未定義 => typedef int mwSignedIndex;已修復單元格陣列的單元格陣列 由 matlabbatch 儲存,Octave 無法正確解析。已修復- mkoctfile 不識別引數 -outdir。 正在進行中
desktop 函式不存在,在呼叫 desktop('-inuse') 時特別有用。已修復使用 SuiteSparse 3.2 編譯失敗。已修復未定義的符號:mexCallMATLAB。已修復使用 clf.m 測試會導致段錯誤。已修復W 指定符在 fopen 中不起作用。已修復if 語句的解析器奇異性。已修復mxArray 在 MEX 檔案中的問題。已修復區域性函式 在 classdef 檔案中的解析錯誤。已修復ind2rgb 對浮點輸入的處理方式與 MATLAB 不同。已修復使用 %c 將字串轉換為實數標量時,轉換無效。, 已修復編譯錯誤 yylex 在此範圍內未宣告。, 已修復由於 openGL 導致編譯失敗。已修復findobj 中的 -depth 引數。, 已修復evalc 未定義。已修復- io64.h 未定義, 正在進行中.
- 在 MATLAB 的二進位制資料格式中儲存 函式控制代碼 變數, 正在進行中
支援 close all force。, 已修復使用正則表示式時,findobj 中的警告。, 已修復列印不包含軸的圖形。已修復在 uimenu 的回撥中出現錯誤後出現錯誤。已修復雙擊時,open 的 SelectionType 不可用(僅限 Qt)。已修復- hgload 無法開啟 MATLAB 圖形, 正在進行中
- Octave 和 MATLAB 之間圖形/uicontrol 的差異, 正在進行中
- 載入包含指向子函式的 function_handle 的 MAT 檔案 時,會發生段錯誤, 正在進行中
圖形屬性 ToolBar 設定為 auto 時的行為。已修復popupmenu uicontrol 的屬性。已修復edit uicontrol 的回撥執行。已修復- 在 fltk 工具包中,與影像物件的滑鼠互動不起作用, 正在進行中
checkbox uicontrol 的 value 屬性。已修復- 建立後更改 uicontrol 的 style, 正在進行中
- popupmenu uicontrol 的顯示(Qt) 正在進行中
- listbox uicontrol 的滑鼠單擊回撥, 正在進行中
text uicontrol 的 String 屬性中單元格陣列的解釋。已修復textscan/strread 在末尾有分隔符時,輸出不正確。已修復在 --no-gui 模式下執行 Octave 時,無法退出。已修復使用 drawnow 時凍結。已修復列印選項:-noui, -painters, -opengl。已修復- 重置 uicontextmenu 的子選單, 正在進行中
- Legend 物件在繪圖中列印線上條下方, 正在進行中
uimenu 的順序。已修復CreateMode 引數用於 msgbox/errordlg/warndlg。已修復錯誤 no method for 'scalar struct = scalar'。已修復- 列印時無法保留 多行 文字和 TeX 標記, 正在進行中
刪除上下文選單。已修復listdlg 的 SelectionMode 值區分大小寫。已修復- 在 3D 檢視中顯示影像, 正在進行中
剪貼簿 複製問題。已修復- 錯誤 base_graphics_object::get_properties: invalid graphics object, 正在進行中
uicontextmenu 的 Visible 屬性。已修復即使使用 --disable-gui,也嘗試構建 libgui。已修復未實現 localfunctions 函式。已修復- 未實現 import 函式, 正在進行中
- 訪問 物件陣列, 正在進行中
- 從 MAT 檔案載入 函式控制代碼, 正在進行中
缺少 警告狀態“all” 時出現段錯誤。已修復缺少 corrcoef 函式。已修復使用者按下取消時,uiputfile 的第三個輸出未定義。已修復編譯後不會自動刪除 MEX 物件檔案“*.o”(MATLAB 的 mex 會刪除)。已修復Octave 緩衝輸出,這可能會阻塞。必須使用 fflush(stdout) 或 page_screen_output。4.4 版本中預設停用分頁器在 Suse 64 位系統上,/usr/X11R6/lib/libGL.so: 無法讀取符號。已修復在此範圍內未宣告 CHOLMOD_NOT_POSDEF。已修復sortrows/sort: 只能對字元型字串的單元陣列進行排序錯誤。已修復- 連線 classdef 物件時出錯, 正在進行中
恢復視窗按鈕不會為其內容觸發 重繪事件。已修復ginput 無法正確處理 shift/ctlr/alt 組合鍵。已修復- GUI 命令視窗可以支援 語法高亮顯示, 正在進行中
Ctrl+C 無法中斷,並在退出時導致 SIGABRT。已修復mxCreateNumericArray 大小為零。已修復使用 mx-cdm-dm.cc 構建時出錯。已修復當 N < 2 時,linspace() 與 Matlab 不相容。已修復使圖表的 狀態列 中顯示座標成為可選操作。已修復當 uicontrol 的回撥 返回錯誤時崩潰。已修復使用 waitfor 時重新整理。已修復影像的 ButtonDownFcn 回撥。已修復在函式 m 檔案上,run 的行為與 Matlab 不同。已修復在 Ubuntu 14.04 上,doc 構建失敗,出現 texi2dvi/texi2pdf 錯誤。已修復close(...,'force') 的圖形控制代碼輸入引數。已修復GUI 回撥中的“解析錯誤”錯誤訊息。已修復在“deletefcn”回撥中,delete(allchild(fig)) 會引發錯誤。已修復缺少 getframe 函式。已修復uicontrol 的字串中的 特殊字元。已修復prefdir 不應是私有函式。已修復Qt 圖表的 幫助選單。已修復檢測 Qscintilla 庫。已修復- 根圖形屬性“MonitorPositions”未完全實現, 正在進行中
使用 uicontrols 時預設設定。已修復使用 Qt 圖表 時出現段錯誤。已修復- uicontrols 範圍 不正確, 正在進行中
未實現 mexCallMATLABWithTrap。已修復單元陣列的 mxSetDimensions。已修復realpow: 生成了複數結果。已修復- 無法從 GUI 編輯器中設定 子函式中的斷點(除非使用“endfunction”關鍵字), 正在進行中
- 缺少 MEX 函式 mxArrayToUTF8String, 正在進行中
- 背景顏色 對按鈕和單選按鈕不起作用, 正在進行中
在批處理模式下使用 exit() 會丟擲 octave::exit_exception。已修復axes 部分超出圖形時影像的顯示。已修復uicontrol 下拉選單 大小。已修復containers.Map 的實現。已修復print.m 的 unwind_protect_cleanup 部分出現錯誤。已修復- strmatch,對“空”輸入的不相容結果, 正在進行中
- 補丁 面積為零,使用 OpenGL 無法顯示, 正在進行中
questdlg 按相反的順序顯示按鈕。已修復waitfor 應該靜默接受空圖形控制代碼。已修復在 Octave 指令碼中捕獲錯誤後出現段錯誤。已修復對於不匹配的 regexp,使用“names”選項時非空輸出。已修復無效的 FID 和 fopen(FID)。已修復- Matlab eval 函式接受列向量字串輸入, 正在進行中
__have_gnuplot__ 未返回任何內容。已修復- uimenu 的位置有時為 0, 正在進行中
- rotate3d 與 Matlab 的相容性, 正在進行中
uicontrol 的輸出。已修復缺少 isequalwithequalnans 函式。已修復fwrite 輸入引數型別。已修復set() 區分大小寫。已修復更新 缺少的函式 列表。已修復- sum, cumsum 等函式錯誤地處理了整數輸入, 正在進行中
使用 print 和 append 標記時出錯。已修復- regexprep 中的 ${cmd} 替換運算子, 正在進行中
uimenu 的位置。已修復從 Octave IDE 載入圖形(和其他物件)。已修復orderfields 速度很慢。已修復classdef 方法的未定義輸入。已修復- zeros: like 關鍵字, 正在進行中
- textscan 選項 MultipleDelimsAsOne 不適用於空格或製表符, 正在進行中
如果字串以空格結尾,ismember 會失敗。已修復normest1 中的無限迴圈。已修復pinv(0) 與 Matlab 不同。已修復center() 依賴於廣播。已修復classdef 檔案中的 private 函式。已修復- max_recursion_depth 錯誤出現在 classdef 建構函式中, 正在進行中
isequal 速度很慢。已修復- 多維陣列的顯示使用“ans”, 正在進行中
- strcmp 與多維字元陣列, 正在進行中
- categorical 類別的實現, 正在進行中
- 支援“import”關鍵字, 正在進行中
模態視窗樣式 屬性不起作用。已修復缺少 classdef 關鍵字的 help 關鍵字。已修復makeValidName 和 makeUniqueStrings。已修復PDF 使用者手冊在程式碼示例中使用 反單引號 `。已修復- histcounts 的實現, 正在進行中
- 實現 jsondecode、jsonencode 函式, 正在進行中
- 圖形屬性 IntegerHandle 在 Qt 工具包中無法完全使用, 正在進行中
圖形的“Number”屬性。已修復movegui 的實現。已修復savefig 的實現。已修復- Octave 4.3.0+ 無法載入之前版本儲存的圖形,正在處理中
幫助文字中未知命令`codequoteundirected'。已修復當qcollectiongenerator 和qhelpgenerator 未找到時,會顯示警告訊息。已修復使用texinfo 4.13 的文件語法。已修復執行包含圖形的指令碼時出現段錯誤。已修復opengl_renderer 關於光物件的警告訊息。已修復uicontrol/uibuttongroup: 聚焦功能尚未實現。已修復- octave 使用呼叫圖形函式的deletefcn 回撥函式時發生死鎖,正在處理中
文件:一些預設 Qt 屬性在不同系統上的值不同。已修復類私有目錄中的MEX 檔案。已修復使用混合數字和字元陣列輸入時,ismember 出現錯誤。已修復使用whos -file 時的錯誤:未找到“load”。已修復- 使用未知或不存在的檔案時,open 函式的行為,正在處理中
uicontrol 按鈕的顏色。已修復uipanel 在 Linux 上不顯示邊框。已修復為了與 Matlab 相容,camlight (axis_handle, ...) 應該可以工作。已修復isfolder 的實現。已修復- +package 中的私有目錄,正在處理中
當選單欄為空時,圖形的位置。已修復- 如果指定變數不存在於檔案中,load() 應該發出錯誤,正在處理中
- 當帶下標的表示式包含 end 關鍵字時,subsasgn 的呼叫,正在處理中
- memmapfile 的實現,正在處理中
- 檔案瀏覽器無響應,正在處理中
uicontrol: cdata 屬性的驗證。已修復為了與 Matlab 相容,savefig 應該可以接受圖形控制代碼的向量。已修復圖形的colormap 屬性不能為空。已修復- 直譯器在包中找不到類定義檔案的方法,正在處理中
實現 uicontrol 的聚焦行為。已修復當補丁不可見時,camlight 的使用。已修復- 移除called_from_builtin,正在處理中
VertexNormals 屬性未更新。已修復使用字串陣列輸入時,gunzip/bunzip2 出現錯誤。已修復DOCSTRING 宏無法識別matlab.lang.makeValidName。已修復切換按鈕 uicontrol 的值更改未在圖形上反映出來。已修復- MEX 檔案中的全域性變數,正在處理中
警告:彈出選單的值不在有效的顯示範圍內。已修復- uicontrol 的速度問題,正在處理中
gcbf 和HandleVisibility 屬性。已修復為影像的cdata 新增對更多型別的支援。已修復- edge 的二進位制輸入影像,正在處理中
- 顏色條的屬性需要監聽器來呼叫操作,正在處理中
lightangle 的實現。已修復[MXE Octave] lib vs lib64。已修復- GUI 中的路徑管理,正在處理中
isosurface 速度很慢。已修復將YDir 設定為 normal 後,影像未顯示。已修復- 包名稱空間和函式名稱之間的衝突,正在處理中
- 在帶下標的賦值操作中呼叫subsref,正在處理中
- 統計 CDF 函式缺少upper 引數支援,正在處理中
- 在 Octave 5.1.0 中關閉繪圖的速度更慢,正在處理中
- dbup 和dbdown 未按預期工作,正在處理中
尚未決定
[edit | edit source]- mkoctfile 定義輸出檔名的選項為“-o”或“--output”,而 mex 的選項為“-output”。如果使用這些選項,則不會附加副檔名('.mex')。
- computer.m 返回的字串與 MATLAB 中的不同(PCWIN、GLNX86、PCWIN64、GLNXA64、MACI64),例如 x86_64-unknown-linux-gnu。
- load.m 和save.m 在 MATLAB 中會自動新增 .mat 副檔名(Octave 不會)。
其他
[edit | edit source]- exist('OCTAVE_VERSION','builtin') 可以用來檢測是否在 Octave 或 MATLAB 中執行。