使用 i 或 j 作為虛數單位迴圈索引或公共變數

建議

因為符號 ij 在 MATLAB 中可以代表顯著不同的東西,所以它們作為迴圈索引的使用已經分裂了 MATLAB 使用者社群。雖然一些歷史性的表現原因可以幫助平衡傾向於一方,但現在不再是這種情況,現在選擇完全取決於你和你選擇遵循的編碼實踐。

Mathworks 目前的官方建議如下:

  • 由於 i 是一個函式,它可以被重寫並用作變數。但是,如果你打算在複雜的算術中使用它們,最好避免將 ij 用於變數名稱。
  • 為了提高複雜算術的速度和穩健性,可以使用 1i1j 代替 ij

預設

在 MATLAB 中,預設情況下,字母 ij 是內建的 function 名稱,它們都指複雜域中的虛構單位。

所以預設情況下 i = j = sqrt(-1)

>> i
ans =
   0.0000 + 1.0000i
>> j
ans =
   0.0000 + 1.0000i

正如你所料:

>> i^2
ans =
    -1

將它們用作變數(用於迴圈索引或其他變數)

MATLAB 允許使用內建函式名作為標準變數。在這種情況下,使用的符號不再指向內建函式,而是指向你自己的使用者定義變數。但是,通常不推薦這種做法,因為它可能導致混淆,除錯和維護困難( 參見其他示例 do-not-name-a-variable-with-an-existing-name )。

如果你對尊重約定和最佳實踐非常迂腐,你將避免在這種語言中將它們用作迴圈索引。但是,編譯器允許它並且功能完備,因此你也可以選擇保留舊習慣並將其用作迴圈迭代器。

>> A = nan(2,3);
>> for i=1:2        % perfectly legal loop construction
       for j = 1:3
        A(i, j) = 10 * i + j;
       end
   end

請注意,迴圈索引在迴圈結束時不會超出範圍,因此它們保留其新值。

>> [ i ; j ]
ans =
     2
     3

如果你將它們用作變數,請確保在使用它們之前對它們進行初始化。在上面的迴圈中,MATLAB 在準備迴圈時自動初始化它們,但如果沒有正確初始化,你可以很快發現你可能無意中在結果中引入了 complex 數字。

如果稍後,你需要撤消內建函式的陰影(=例如,你希望 ij 再次表示想象單位),你可以改變變數:

>> clear i j

*如果你打算在複雜算術中使用它們,*你現在可以理解 Mathworks 保留將它們用作迴圈索引。你的程式碼將充滿變數初始化和 clear 命令,最好的方式來混淆最嚴重的程式設計師( 是的,你在那裡!…… )和程式事故等待發生。

如果沒有預期的複雜算術,ij 的使用是完全正常的,沒有效能損失。

將它們用作虛構單位:

如果你的程式碼必須處理 complex 號碼,那麼 ij 肯定會派上用場。但是,為了消除歧義甚至是表演,建議使用完整形式而不是速記語法。完整的形式是 1i(或 1j)。

>> [ i ; j ; 1i ; 1j]
ans =
   0.0000 + 1.0000i
   0.0000 + 1.0000i
   0.0000 + 1.0000i
   0.0000 + 1.0000i

它們確實代表了相同的價值 sqrt(-1),但後來的形式:

  • 以語義的方式更明確。
  • 更易於維護(稍後檢視程式碼的人不必閱讀程式碼來查詢 ij 是變數還是虛構單位)。
  • 更快(來源:Mathworks)。

請注意,完整語法 1i 對符號前面的任何數字有效:

>> a = 3 + 7.8j
a =
   3.0000 + 7.8000i

這是唯一可以在沒有操作符的情況下使用數字的函式。

陷阱

雖然它們作為虛構單位變數使用是完全合法的,但這裡只是一個小例子,說明如果這兩種用法混合起來會讓人感到困惑:

讓我們覆蓋 i 並將其變為變數:

>> i=3
i =
     3

現在 i 是一個變數 (保持值 3),但我們只覆蓋了虛構單位的速記符號,完整形式仍然正確解釋:

>> 3i
ans =
   0.0000 + 3.0000i

現在讓我們構建最模糊的配方。我讓你評估以下所有結構的可讀性:

>> [ i ; 3i ; 3*i ; i+3i ; i+3*i ]
ans =
   3.0000 + 0.0000i
   0.0000 + 3.0000i
   9.0000 + 0.0000i
   3.0000 + 3.0000i
  12.0000 + 0.0000i

如你所見,上面陣列中的每個值都返回不同的結果。雖然每個結果都是有效的(假設這是最初的意圖),但大多數人都會承認閱讀充滿這種結構的程式碼將是一場正確的噩夢。