Octave 程式設計教程/向量和矩陣
以下是我們在 Octave 中指定行向量的示例
octave:1> x = [1, 3, 2] x = 1 3 2
請注意
- 向量用方括號括起來;
- 每個元素之間用可選的逗號分隔。
x = [1 3 2]會產生相同的行向量。
要指定列向量,只需將逗號替換為分號
octave:2> x = [1; 3; 2] x = 1 3 2
由此可見,我們使用逗號移動到向量(或矩陣)的下一列,並使用分號移動到下一行。因此,要指定矩陣,請鍵入行(用逗號分隔每個元素),並使用分號移動到下一行。
octave:3> A = [1, 1, 2; 3, 5, 8; 13, 21, 34] A = 1 1 2 3 5 8 13 21 34
可以使用標準運算子來
- 加(
+), - 減(
-),以及 - 乘(
*)
矩陣、向量和標量。請注意,這些運算子要起作用,矩陣需要具有匹配的維數(在乘法情況下,是內部維數)。
- 轉置運算子是單引號:
'。繼續上一節的示例,
octave:4> A' ans = 1 3 13 1 5 21 2 8 34
(注意:這實際上是複共軛轉置運算子,但對於實矩陣,這與轉置相同。要計算復矩陣的轉置,請使用點轉置 (.') 運算子。)
- 冪運算子 (
^) 也可以用於計算方陣的實冪。
當您有兩個相同大小的矩陣時,可以對它們執行逐元素運算。例如,以下程式碼將A中的每個元素除以B中的對應元素
octave:1> A = [1, 6, 3; 2, 7, 4] A = 1 6 3 2 7 4 octave:2> B = [2, 7, 2; 7, 3, 9] B = 2 7 2 7 3 9 octave:3> A ./ B ans = 0.50000 0.85714 1.50000 0.28571 2.33333 0.44444
請注意,您使用點除 (./) 運算子來執行逐元素除法。還有類似的運算子用於乘法 (.*) 和冪運算 (.^)。
讓我們引入一個標量供將來使用。
a = 5;
點除運算子還可以與標量一起以以下方式使用。
C = a ./ B
返回一個矩陣C,其中每個條目由下式定義
即a被B中的每個條目除。類似地
C = a .^ B
返回一個矩陣,其中
您可以透過索引來處理矩陣和向量的部分內容。您使用一個整數向量來告訴 Octave 使用向量或矩陣的哪些元素。例如,我們建立一個向量
octave:1> x = [1.2, 5, 7.6, 3, 8] x = 1.2000 5.0000 7.6000 3.0000 8.0000
現在,要檢視x的第二個元素,請輸入
octave:2> x(2) ans = 5
您還可以按如下方式檢視元素列表。
octave:3> x([1, 3, 4]) ans = 1.2000 7.6000 3.0000
最後一個命令顯示了向量x的第 1、3 和 4 個元素。
要從矩陣中選擇行和列,我們使用相同的原理。讓我們定義一個矩陣
octave:4> A = [1, 2, 3; 4, 5, 6; 7, 8, 9] A = 1 2 3 4 5 6 7 8 9
並選擇第 1 行和第 3 行以及第 2 列和第 3 列
octave:5> A([1, 3], [2, 3]) ans = 2 3 8 9
冒號運算子 (:) 可用於從矩陣中選擇所有行或列。因此,要選擇第 2 行中的所有元素,請輸入
octave:6> A(2, :) ans = 4 5 6
您也可以像這樣使用: 來選擇所有矩陣元素
octave:7> A(:,:) ans = 1 2 3 4 5 6 7 8 9
我們還可以從矩陣中選擇一系列行或列。我們使用以下方法指定範圍
start:step:stop
您實際上可以在 Octave 提示符下鍵入範圍以檢視結果。例如,
octave:3> 1:3:10 ans = 1 4 7 10
第一個顯示的數字是start,第二個是start + step,第三個是start + (2 * step)。最後一個數字小於或等於stop。
通常,您只需將步長設定為 1。在這種情況下,您可以省略步長引數並鍵入
octave:4> 1:10 ans = 1 2 3 4 5 6 7 8 9 10
如您所見,範圍命令的結果只是一個整數向量。我們現在可以使用它來索引向量或矩陣。要選擇A左上角的 子矩陣,請使用
octave:4> A(1:2, 1:2) ans = 1 2 4 5
最後,有一個名為end的關鍵字,它可以在索引矩陣或向量時使用。它指的是行或列中的最後一個元素。例如,要檢視矩陣的最後一列,可以使用
octave:5> A(:,end) ans = 3 6 9
以下函式可用於建立和操作矩陣。
tril(A)返回A的下三角部分。
triu(A)返回A的上三角部分。
eye(n)返回 單位矩陣。您還可以使用eye(m, n)來返回 矩形單位矩陣。
ones(m, n)返回一個 矩陣,其中所有元素均為 1。類似地,ones(n)返回一個 方陣。
zeros(m, n)返回一個 矩陣,其中所有元素均為 0。類似地,zeros(n)返回一個 方陣。
rand(m, n)返回一個 矩陣,其中元素是從 範圍內均勻隨機生成的。類似地,rand(n)返回一個 方陣。
randn(m, n)返回一個 矩陣,其中元素是正態分佈的隨機數。
randperm(n)返回一個行向量,包含數字 的隨機排列。
diag(x)或diag(A)。對於向量 x,此函式返回一個方陣,對角線上為 x 的元素,其他位置為 0。對於矩陣 A,此函式返回一個向量,包含 A 的對角線元素。例如,
octave:16> A = [1, 2, 3; 4, 5, 6; 7, 8, 9] A = 1 2 3 4 5 6 7 8 9 octave:17> x = diag(A) ans = 1 5 9 octave:18> diag(x) ans = 1 0 0 0 5 0 0 0 9
linspace(a, b, n)返回一個包含 n 個值的向量,第一個元素等於 a,最後一個元素等於 b,相鄰元素之間的差值恆定。最後一個引數 n 是可選的,預設值為 100。
octave:186> linspace(2, 4, 2) ans = 2 4 octave:187> linspace(2, 4, 4) ans = 2.0000 2.6667 3.3333 4.0000 octave:188> linspace(2, 4, 6) ans = 2.0000 2.4000 2.8000 3.2000 3.6000 4.0000
logspace(a, b, n)返回一個包含 n 個值的向量,第一個元素等於 ,最後一個元素等於 ,相鄰元素之間的比率恆定。最後一個引數 n 是可選的,預設值為 50。
octave:189> logspace(2, 4, 2)
ans =
100 10000
octave:190> logspace(2, 4, 4)
ans =
1.0000e+02 4.6416e+02 2.1544e+03 1.0000e+04
octave:191> logspace(2, 4, 5)
ans =
1.0000e+02 3.1623e+02 1.0000e+03 3.1623e+03 1.0000e+04
還有一些建立特殊矩陣的函式,如下所示:
hankel(漢克爾矩陣)hilb(希爾伯特矩陣)invhilb(希爾伯特矩陣的逆矩陣)sylvester_matrix(西爾維斯特矩陣) - 在 v3.8.1 版本中,有一個警告:sylvester_matrix 已過時,將在未來版本的 Octave 中移除;請使用 hadamard(2^k) 代替。toeplitz(託普利茲矩陣)vander(範德蒙德矩陣)
使用 help 命令可以獲取有關如何使用這些函式的更多資訊。
fliplr(A)返回矩陣 A 的副本,其中列的順序反轉,例如,
octave:49> A = [1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12] A = 1 2 3 4 5 6 7 8 9 10 11 12 octave:50> fliplr(A) ans = 4 3 2 1 8 7 6 5 12 11 10 9
flipud(A)返回矩陣 A 的副本,其中行的順序反轉,例如,
octave:51> flipud(A) ans = 9 10 11 12 5 6 7 8 1 2 3 4
rot90(A, n)返回矩陣 A 的副本,該副本已逆時針旋轉 (90n)°。第二個引數 是可選的,預設值為 1,可以為負值。
octave:52> rot90(A) ans = 4 8 12 3 7 11 2 6 10 1 5 9
reshape(A, m, n)建立一個 矩陣,其元素取自 A。A 中的元素數量必須等於 。元素從 A 中按列優先順序獲取,這意味著第一列中的值()首先被讀取,然後是第二列(),等等。
octave:53> reshape(A, 2, 6) ans = 1 9 6 3 11 8 5 2 10 7 4 12
sort(x)返回向量 x 的副本,其中元素按升序排序。
octave:54> x = rand(1, 6) x = 0.25500 0.33525 0.26586 0.92658 0.68799 0.69682 octave:55> sort(x) ans = 0.25500 0.26586 0.33525 0.68799 0.69682 0.92658
有關更多可用於操作向量和矩陣、查詢特徵值等的運算子和函式的描述,請參見 線性代數 部分。