它可以單例

概述:

MATLAB 中數值陣列的預設資料型別是 doubledouble數字浮點表示 ,這種格式每個值需要 8 個位元組(或 64 位)。在某些情況下,例如僅處理整數或當數值不穩定性不是迫在眉睫的問題時,可能不需要如此高的位元深度。因此,建議考慮 single 精度(或其他適當型別 ) 的好處 :

  • 更快的執行時間(尤其在 GPU 上可見)。
  • 記憶體消耗的一半:由於記憶體不足錯誤導致 double 失敗; 儲存為檔案時更緊湊。

將變數從任何支援的資料型別轉換為 single 是使用以下方法完成的:

sing_var = single(var);

一些常用的功能(如: zeroseyeones等等 )預設的是輸出 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  

因此,在整個程式碼中轉換/轉換幾個初始變數似乎已經足夠了 - 但是不鼓勵這樣做 (參見下面的警告和陷阱 )。

警告和陷阱:

  1. 由於引入數字噪聲(從 single 轉換為 double 時)或資訊丟失(從 double 轉換為 single,或在某些整數型別之間 ),不鼓勵重複轉換,例如:

    double(single(1.2)) == double(1.2)   
    ans =
         0
    

    使用 typecast 可以稍微減輕這種情況 。另請參閱請注意浮點不準確

  2. 僅僅依賴於隱式資料型別(即 MATLAB 猜測計算輸出的型別應該是什麼)是**不鼓勵的,**因為可能會產生一些不希望的影響:

    • 資訊丟失 :當預期得到 double 時,但是 singledouble 運算元的粗心組合產生了精度。

    • 意外的高記憶體消耗 :當預期 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.
      

    為了獲得更好的程式碼可讀性並降低不需要的型別的風險,建議採用防禦方法,其中變數明確地轉換為所需型別。

也可以看看: