跳至內容

SPM/Octave

來自華夏公益教科書
< SPM

GNU Octave

[編輯 | 編輯原始碼]

GNU Octave 是一種高階語言,它與 MATLAB 大部分相容。它是根據 GNU 通用公共許可證條款釋出的免費開源軟體。

MATLAB/Octave 相容性

[編輯 | 編輯原始碼]

GNU Octave 與 MATLAB 大部分相容

其他神經影像 MATLAB 軟體包的相容性狀態

SPM/Octave 相容性的當前狀態

[編輯 | 編輯原始碼]

SPM 目前不支援在 Octave 下執行,但許多模組實際上是相容的。歡迎提供有關進一步評估和驗證的反饋。在大多數情況下,SPM 的獨立版本 可能是足夠可行的替代方案。

如果您對此感興趣,請隨時聯絡 fil.spm@ucl.ac.uk。您需要使用最新版本的 SPM12GNU 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 時遇到的問題報告給 SPMOctave 開發人員。請確保僅當遇到 SPM 中不應該修復的問題時才報告 Octave 的錯誤。儘可能隔離問題。
  • 提出補丁 用於修復以下列表中尚未修復的錯誤。
  • 經濟上支援 Octave 社群。

SPM 和 Octave 之間的相容性問題

[編輯 | 編輯原始碼]

需要更改 SPM

[編輯 | 編輯原始碼]
  • 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

需要更改 Octave

[編輯 | 編輯原始碼]
  • 無法使用不存在的函式名稱建立函式控制代碼(例如,x = @crash 會失敗)。 已修復
  • 行繼續符 "..." 不會忽略它之後出現的任何內容,除非有註釋符號%(MATLAB )。 已修復
  • strrep.m 可以作用於字串,但不能作用於元胞陣列。 已修復
  • isdeployed.m 不存在(函式 X=isdeployed,X=false;)。 已修復
  • textscan.mstrread.mtextread.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 結構體,欄位為 messageidentifier 已修復
  • [[];{'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_handleMAT 檔案 時,會發生段錯誤, 正在進行中
  • 圖形屬性 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 關鍵字。 已修復
  • makeValidNamemakeUniqueStrings 已修復
  • PDF 使用者手冊在程式碼示例中使用 反單引號 `。 已修復
  • histcounts 的實現, 正在進行中
  • 實現 jsondecodejsonencode 函式, 正在進行中
  • 圖形屬性 IntegerHandle 在 Qt 工具包中無法完全使用, 正在進行中
  • 圖形的“Number”屬性。 已修復
  • movegui 的實現。 已修復
  • savefig 的實現。 已修復
  • Octave 4.3.0+ 無法載入之前版本儲存的圖形,正在處理中
  • 幫助文字中未知命令`codequoteundirected' 已修復
  • qcollectiongeneratorqhelpgenerator 未找到時,會顯示警告訊息。 已修復
  • 使用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 中關閉繪圖的速度更慢正在處理中
  • dbupdbdown 未按預期工作,正在處理中

尚未決定

[edit | edit source]
  • mkoctfile 定義輸出檔名的選項為“-o”或“--output”,而 mex 的選項為“-output”。如果使用這些選項,則不會附加副檔名('.mex')。
  • computer.m 返回的字串與 MATLAB 中的不同(PCWIN、GLNX86、PCWIN64、GLNXA64、MACI64),例如 x86_64-unknown-linux-gnu。
  • load.msave.m 在 MATLAB 中會自動新增 .mat 副檔名(Octave 不會)。

其他

[edit | edit source]
  • exist('OCTAVE_VERSION','builtin') 可以用來檢測是否在 Octave 或 MATLAB 中執行。
華夏公益教科書