它可以單例
概述:
MATLAB 中數值陣列的預設資料型別是 double
。double
是數字的浮點表示 ,這種格式每個值需要 8 個位元組(或 64 位)。在某些情況下,例如僅處理整數或當數值不穩定性不是迫在眉睫的問題時,可能不需要如此高的位元深度。因此,建議考慮 single
精度(或其他適當型別 ) 的好處 :
- 更快的執行時間(尤其在 GPU 上可見)。
- 記憶體消耗的一半:由於記憶體不足錯誤導致
double
失敗; 儲存為檔案時更緊湊。
將變數從任何支援的資料型別轉換為 single
是使用以下方法完成的:
sing_var = single(var);
一些常用的功能(如: zeros
, eye
, ones
,等等 )預設的是輸出 double
值,允許指定的型別/類的輸出。
將指令碼中的變數轉換為非預設的精度/型別/類:
截至 2016 年 7 月,沒有記錄的方法來更改 double
的預設 MATLAB 資料型別。
在 MATLAB 中,新變數通常模仿建立變數時使用的變數的資料型別。為了說明這一點,請考慮以下示例:
A = magic(3);
B = diag(A);
C = 20*B;
>> whos C
Name Size Bytes Class Attributes
C 3x1 24 double
A = single(magic(3)); % A is converted to "single"
B = diag(A);
C = B*double(20); % The stricter type, which in this case is "single", prevails
D = single(size(C)); % It is generally advised to cast to the desired type explicitly.
>> whos C
Name Size Bytes Class Attributes
C 3x1 12 single
因此,在整個程式碼中轉換/轉換幾個初始變數似乎已經足夠了 - 但是不鼓勵這樣做 (參見下面的警告和陷阱 )。
警告和陷阱:
-
由於引入數字噪聲(從
single
轉換為double
時)或資訊丟失(從double
轉換為single
,或在某些整數型別之間 ),不鼓勵重複轉換,例如:double(single(1.2)) == double(1.2) ans = 0
-
僅僅依賴於隱式資料型別(即 MATLAB 猜測計算輸出的型別應該是什麼)是**不鼓勵的,**因為可能會產生一些不希望的影響:
-
資訊丟失 :當預期得到
double
時,但是single
和double
運算元的粗心組合產生了精度。 -
意外的高記憶體消耗 :當預期
single
結果但是粗心計算導致double
輸出。 -
使用 GPU 時不必要的開銷 :當將
gpuArray
型別(即儲存在 VRAM 中的變數)與非gpuArray
變數(即通常儲存在 RAM 中的變數)混合時,必須在執行計算之前以一種方式或另一種方式傳輸資料。此操作需要時間,並且在重複計算中可能非常明顯。 -
將浮點型別與整數型別混合時的錯誤 :
mtimes
(*
)等函式沒有為整數和浮點型別的混合輸入定義 - 並且會出錯。像times
(.*
) 這樣的函式根本沒有為整數型別的輸入定義 - 並且會再次出錯。>> ones(3,3,'int32')*ones(3,3,'int32') Error using * MTIMES is not fully supported for integer classes. At least one input must be scalar. >> ones(3,3,'int32').*ones(3,3,'double') Error using .* Integers can only be combined with integers of the same class, or scalar doubles.
為了獲得更好的程式碼可讀性並降低不需要的型別的風險,建議採用防禦方法,其中變數明確地轉換為所需型別。
-
也可以看看:
- MATLAB 文件: 浮點數 。
- Mathworks 的技術文章: 將 MATLAB 程式碼轉換為固定點的最佳實踐 。