查詢和退出
使用 disp 命令輸出字符串, help 命令查看幫助
help func; % 幫助
輸入 quit 退出 octave
quit % 退出
數據類型
變量 | 含義 |
---|---|
ans | Matlab 中的默認變量 |
pi | 圓周率 |
eps | 計算機中的最小數,浮點運算的相對精度 |
inf | 無窮大,如 1/0 |
NaN | 不定值,如 0/0 0*∞ |
i / j | 復數中的虛數單位 |
realmin | 最小可用正實數 |
realmax | 最大可用正實數 |
數字格式化命令
格式 | 含義 |
---|---|
format short | 5 位定點表示 |
format long | 15 位定點表示 |
format short e | 5 位浮點表示 |
format long e | 15 位浮點表示 |
format short g | 5 位定點和 5 位浮點中自動選擇最好格式表示 |
format long g | 15 位定點和 15 位浮點中自動選擇最好格式表示 |
format hex | 16 進制格式表示 |
format + | 在矩陣中,用符號 + - 和空格表示正號、負號和零 |
使用時直接輸入命令即可
基本運算符
運算 | 作用 |
---|---|
+ - * / ^ \ |
普通加減乘除、冪運算和左除 |
.* ./ .^ .\ |
點乘,點除,點乘冪和點左除 |
變量
Octave 變量區分大小寫,解釋性語言不需要指定變量類型。變量有幾種操作命令:
clear % 清除所有變量
clear variable % 清除指定變量
其中 %
開頭的文字是注釋,命令末尾的分號不是必須的,如果不在語句結尾加上分號,會輸出語句的結果;加上分號則會隱藏結果
通過如下函數獲取變量的信息
size(var); % 變量的尺寸
length(var); % 變量的長度
設置小數位數
vpa(x, n); % 顯示 x 的 n 位小數
向量及矩陣
用方括號括起來的元素表示矩陣和向量,在方括號中由空格或者逗號隔開的一組數據被定義為行向量,而由分號或者回車隔開的一組數據被定義為列向量;實際使用時
% 給出向量
re = [
1 2
3 4
...
];
% 定義矩陣
X = [2 3 4;5 6 7;8 9 10]
使用 ...
進行換行連接,例如
Y = [1 2 3 ...
4 5 6]
它等價於
Y = [1 2 3 4 5 6]
可以用向量初始化向量,例如
a = [2 3 4]
b = [a 5]
特殊向量
冒號可以用於構建特殊向量,表示從給定值開始每次增加給定值直到大於最大值,有格式:
v = [start[:step=1]:end]
例如,我們創建一個從 2 開始,間隔為 3 ,最后一個值恰好小於 6 的向量 [2 5]
e = 2:3:6
創建均勻分布的向量
linspace(x1,x2,N) % 創建一個 N 個元素的向量,從 x1 開始,到 x2 結束
向量函數
函數 | 作用 | 函數 | 作用 |
---|---|---|---|
max | 求最大值 | mean | 求平均值 |
min | 求最小值 | median | 求中間值 |
sum | 求和 | prod | 乘積 |
length | 求長度 | sort | 從小到大排序 |
訪問元素
通過 ()
來訪問元素,注意下標從 1 開始,例如
a = [1 5 6 -3 8];
則 a(3)
就是 6 ;另外,可以利用 :
取向量切片:
a(1:2:5);
使用規則與之前相同,這里返回 [1 5 -3]
向量運算
加法、減法遵循向量的運算,但是其余運算有特殊格式:
dot(a, b) % 內積
cross(a, b) % 外積
.表示兩個向量的元素一對一地進行運算,因此當需要計算向量元素依次運算時,可以利用 .*
、./
、.^
算符對每個元素分別操作
a = [1 2 3];
b = [1 2 3];
a.*b => [1 4 9]
a.^b => [1 4 27]
創建矩陣
函數 | 矩陣 |
---|---|
[ ] | 空矩陣 |
zeros(M,N) | 創建一個 M x N 的全零矩陣 |
ones(M,N) | 創建一個 M x N 的全一矩陣 |
eye(M) | 創建一個 M x M 的單位矩陣 |
rand(M,N) | 創建一個 M x N 的矩陣,元素為 0 ~ 1 隨機值 |
randn(M,N) | 創建一個 M x N 的矩陣,元素為滿足標准正態分布 |
randi([a,b],M,N) | 創建 [a,b] 范圍的 M X N 隨機矩陣 |
compan(A) | 創建 A 的伴隨矩陣 |
diag(a) | 創建對角元為向量 a 元素的對角陣 |
矩陣運算
加法、減法、乘法遵循矩陣的運算,但除法有所不同:
- 左除
\
表示將 A 的逆乘在左邊A\b
- 右除
/
表示將 A 的逆乘在右邊A/b
轉置矩陣
利用上引號 '
來進行轉置操作,例如
A = [1 2 3]
A' = [1 2 3]^T
下面列舉常用的函數
函數 | 作用 | 函數 | 作用 |
---|---|---|---|
inv | 矩陣的逆 | det | 矩陣行列式 |
trace | 矩陣的跡 | flipud | 上下翻轉 |
fliplr | 左右翻轉 | diag | 取對角向量 |
tril | 取下三角 | triu | 取上三角 |
cond | 矩陣條件數 | norm | 矩陣范數或模 |
rank | 矩陣的秩 | size | 返回各維度上元素的數量 |
字符串
octave 中直接可以定義字符串,並且可以用單/雙引號表示字符串
a = "hello"
b = 'hello'
下面是字符串相關函數
函數 | 作用 | 函數 | 作用 |
---|---|---|---|
size | 查看字符數組維數 | deblank | 刪除字符串中的空格 |
char | 把數字轉換為字符串 | strmatch | 查找匹配字符串 |
strcmp | 比較字符串 | strjust | 對齊字符數組 |
strcat | 字符串連接 | findstr | 在字符串中找字符串 |
upper | 轉換為大寫 | lower | 轉換為小寫 |
運算符
關系運算
關系運算符有 == >= <= > < ~=
,注意其中 ~=
表示不等於;如果關系成立結果為 1 ,否則結果為 0 。
邏輯運算
邏輯運算符有 & | ~
表示或、與、非;另外使用 xor 表示異或
xor(1, 0);
數值計算
計時方法
% 開始計時
tic
% 需要計時的部分
...
% 停止計時
time = toc;
disp(time);
fprintf('Time = %3.2f',time);
函數求導
定義函數
syms x y z % 表示用 x y z 作為變量
u = x^2+y^2; % 定義函數
函數取值 u(1,2,z)
得到一個 z 的函數
subs(u,x,y,1,2);
使用 disp 輸出
disp(subs(u,x,y,1,2));
函數求偏導
函數 | 含義 |
---|---|
diff(u,x) | u 對 x 求偏導 |
diff(u,x,2) | u 對 x 求 2 階偏導 |
求得結果可以在給定點取值。注意它不能取得數值,只能取得表達式,因此給定值的個數不能超過未知數的個數
subs(diff(u,x),x,y,1,2); % 在 x = 1, y = 2 取值
只帶其中一個變量的值
subs(diff(u,x),x,1); % 在 x = 1 取值
最后會得到有關 y 的函數或者可以直接得到函數的 Jacobi 矩陣:
J = jacobian(u,[x y]);
數值求導
Matlab 沒有內置直接計算數值求導的函數,只能把求導轉化為差分格式。例如已知橫坐標向量 x 和對應的函數值向量 y ,則導數向量可以被估計為
diff(y)./diff(x);
對於求梯度的時候, Matlab 有內置的函數,例如求 \(u=x^2y^3\) 在點 \((1,-2)\) 處的梯度
x = -3:0.2:3; % 將函數在一個 x y 的二維矩陣中離散
y = x'; % 這里 y 做了轉置
f = x.^2 ∗ y.^3; % 計算函數的二維矩陣
[fx,fy] = gradient(f,0.2,0.2); % 求梯度
% 要找到 x = 1, y = -2 的那個點
x0 = 1;
y0 = -2;
% 判斷表達式
t = (x == x0) & (y == y0);
% 尋找條件
indt = find(t);
% 查找滿足坐標條件 x = 1, y = -2 的那個點的值
grad = [fx(indt) fy(indt)];
我們介紹其中的部分函數
gradient(F, dx, dy, ...);
它會求取矩陣 F 在不同方向上的梯度,默認每個方向的間隔為 1
x = gradient(F);
它會求出向量 F 的梯度向量 \(\partial F/\partial x\) ,默認間隔為 1
[x y] = gradient(F, 0.2, 0.2);
它會求出二維矩陣 F 的兩個梯度向量 \(\partial F/\partial x\) 和 \(\partial F/\partial y\) ,每個方向間隔為 0.2
ind = find(X)
查找條件函數,找出矩陣 X 中的所有非零元素,並將這些元素的線性索引值(linear indices:按列)返回到向量 ind 中。如果 X 是一個行向量,則 ind 是一個行向量;否則,ind是一個列向量。
ind = find(X, k)
找到前 k 個不為 0 的線性索引值。 k 必須是一個正數,但是它可以是任何數字數值類型。
ind = find(X, k, 'last')
找到后 k 個不為零元素的線性索引值。
[row,col] = find(X, ...)
返回矩陣 X 中非零元素的行和列的索引值。這個語法對於處理稀疏矩陣尤其有用。如果 X 是一個N(N>2)維矩陣,col 包括列的線性索引。
需要注意, find 有精度要求,如果搜索精度過高會找不到,因此需要設定一個最小誤差
t = (abs(x - x0) < 1e-5 & abs(y - y0) < 1e-5 );
求解線性方程組
設方程組形式為 \(Ax=b\) ,分為適定、超定、欠定三種情況討論。
適定方程組
-
inv(A)*b;
-
A\b;
-
[L,U] = lu(A); x = U\(L\b);
超定方程組
-
A\b;
求得最小二乘解 -
x = pinv(A)*b;
利用矩陣偽逆求解
欠定方程組:
-
A\b;
求得最小二乘解 -
x = pinv(A)*b;
利用矩陣偽逆求解 -
上面兩種方法都只能求得一個特解,利用
null(A)
可以求得零空間,通過零空間的線性組合加特解可以得到通解
多項式
通過向量 \(p=[a_0,a_1,\cdots,a_n]\) ,多項式降冪排列系數數組可以直接構造多項式
poly2sym(p)
這個函數在 symbolic 包當中,需要手動安裝
我們可以直接將數組當做一個多項式使用。通過將兩個數組補充為相同長度,就可以通過數組加減進行多項式加減;還可以做乘法
p = conv(p1, p2)
返回相乘后得到的數組;以及帶余除法
[p, r] = deconv(p1, p2)
返回商數組和余數數組;也可以進行積分和求導,同樣返回結果數組
de = polyder(p);
in = polyint(p);
可以對多項式逐點求值,也可以利用函數轉換為向量或矩陣
polyval(p, x) % 單點求值
polyval(p, [x y]) % 數組求值,返回向量
polyvalm(p, [x y; z w]) % 矩陣求值,返回矩陣
通過 roots 函數求多項式的所有根
roots(p)
最后給出兩個暫時不用的函數:
polyeig % 求解特征值問題
residue % 部分分式展開
插值函數
進行多項式插值
interp1(x, y, x1, 'method')
其中 x y 表示節點和對應的值,x1 是要插值的點,最終會返回 y1 ,表示插值多項式在 x1 處的值向量;最后一個參數選擇插值方法:
method | 作用 |
---|---|
nearest | 最近插值 |
linear | 線性插值 |
spline | 三次樣條插值 |
cubic | 三次插值 |
舉一個例子:
interp1([1 2], [2 3], [1 1.5 2], 'linear')
注意 x1 不能超出 x 的范圍。
曲線擬合函數
polyfit(x, y, n)
其中 x y 表示節點和對應的值, n 是多項式階數,返回多項式系數和生成預測值誤差估計的矩陣 s ,因此可以接收返回值
[p,s]= polyfit(x, y, n);
腳本
Octave 腳本是普通的文本文件,但需要以 .m 為后綴
調用腳本的命令有:
edit 調出編輯器來編輯腳本
edit name 編輯已有腳本
run name 運行腳本
全局變量
無論在腳本文件還是在函數文件中,都會定義一些變量。函數文件所定義的變量是局部變量,這些變量獨立於其他函數的局部變量和工作空間的變量,即只能在該函數的工作空間引用,而不能在其他函數工作空間和命令工作空間引用。
但是如果某些變量被定義成全局變量,就可以在整個工作空間進行存取和修改,以實現共享。因此,定義全局變量是函數間傳遞信息的一種手段。
global A B C
數學函數
函數 | 作用 | 函數 | 作用 |
---|---|---|---|
sin(x) | 正弦 | asin(x) | 反正弦 |
cos(x) | 余弦 | acos(x) | 反余弦 |
tan(x) | 正切 | atan(x) | 反正切 |
cot(x) | 余切 | acot(x) | 反余切 |
abs(x) | 絕對值 | max(x) | 最大值 |
min(x) | 最小值 | sum(x) | 求和 |
sqrt(x) | 開平方 | exp(x) | 以 e 為底的指數 |
log(x) | 自然對數 | log10(x) | 以 10 為底的對數 |
sign(x) | 符號函數 | fix(x) | 取整 |
ceil(x) | 向上取整 | floor(x) | 向下取整 |
輸入輸出
input() % 輸入函數
disp(); % 輸出函數
例如:
x = input('請輸入數據:');
disp(x);
還可以格式化輸出結果
fprintf(format, ...);
使用方法和 C 語言中的 printf 類似。
載入和保存
save name % 保存一個指定名稱的命名空間(當前所有變量儲存在其中)
save name var1 var2 ... % 保存包含這些變量的命名空間
load name % 載入一個指定名稱的命名空間
可以從其它文件中載入數據
x = load('test.txt');
條件語句
if condition1
% code
elseif condition2
% code
else
% code
end
循環語句
for n = n1:step:n2
% code
end
while condition
% code
end
循環控制語句
break 結束當前循環
continue 跳過本次循環
return 返回
pause 程序暫停直到鍵盤響應;可以用 pause(n) 指定暫停的秒數
函數
用戶可以自定義函數, octave 函數通過值傳遞並能返回多個返回值,按如下格式定義函數:
function[輸出1, 輸出2, ...] = name(輸入1, 輸入2, ...)
% code
end
例如我們可以定義計算 sin 的函數
function s=sind(x)
% SIND(x) Calculates sine(x) in degrees
s=sin(x*pi/180);
end
octave 中也有內聯(inline)函數,例如將如下方程組:
轉化為下面的形式函數:
f = @(x) [sin(x(1)) + x(2) + x(3)^2*exp(x(1))-4; ...
x(1) + x(2)*x(3); x(1)*x(2)*x(3)+2];
這樣就可以直接通過 f(x)
來調用該函數,返回一個結果向量;相當於求解該函數等於 [0 0 0]
的解。
繪圖方法
圖形窗口
通過 figure 來創建窗口
figure(n); % 創建 n 號窗口
可以對創建的窗口進行操作
命令 | 作用 |
---|---|
close | 關閉當前窗口 |
close(n) | 關閉指定窗口 |
close all | 關閉所有窗口 |
clf | 清空當前窗口 |
只需要點擊一下窗口,就會自動把該窗口作為當前繪圖窗口。
基本繪圖函數
plot(x); % x 的序號作為橫坐標, x 值為縱坐標
plot(x, y); % 其中x, y分別為橫縱坐標數據
subplot(a, b, c); % 表示在一個格子中畫圖,分成axb的格子,在第c個格子里畫圖,其中格子的順序為從左到右從上到下
可以對顏色和樣式進行選擇
- ro 代表紅色圓圈
- b 代表藍色點
plot(re(:, 1), re(:, 2), '.', 'MarkerSize', 20);
plot(re(:, 1), re(:, 2)./(re(:, 1).*log(re(:, 1))), '.');
plot(x, x.^2); % 繪制y = x^2的圖像
% 這表示將re分成re(:, 1)和re(:, 2)兩個列向量
注意:由於這是向量運算,如果報錯的話,盡量在每一個運算前加點'.'
plot 參數
- 曲線線型、顏色和標記點類型
plot(X1,Y1,LineSpec,...) % 通過字符串LineSpec指定曲線的線型、顏色及數據點的標記類型
% 注意:這些標識符寫在一個字符串里
plot(x, y, '-b');
標識符 | 意義 | 標識符 | 意義 |
---|---|---|---|
- | 實線 | + | 加號 |
-. | 點划線 | x | 叉號 |
-- | 虛線 | r | 紅色 |
: | 點線 | g | 綠色 |
. | 點 | b | 藍色 |
* | 星號 | y | 黃色 |
- 設置曲線線寬、標記點大小,標記點邊框顏色和標記點填充顏色
plot(..., 'Property Name', Property Value, ...);% 設置屬性plot(x, y, '-b', 'MarkerSize', 20);
Property Name | 意義 | 選項 |
---|---|---|
LineWidth | 線寬 | 數值,單位為points |
MarkerEdgeColor | 標記點邊框線條顏色顏色字符 | 'g','b'等 |
MarkerFaceColor | 標記點內部區域填充顏色顏色字符 | 'g','b'等 |
MarkerSize | 標記點大小 | 數值,單位為points |
具體參數的部分:https://blog.csdn.net/wzhw1992/article/details/26866491
- 同時繪制多條曲線
plot(x1, y1, 'style1', x2, y2, 'style2');
- 設置與保存
set(gca, 'FontSize', 20); % 設置字號
saveas(gcf, '文件名.xxx'); % 輸出為指定文件
- 更多函數
title() % 添加標題
xlabel() % 添加 x 軸名稱
ylabel() % 添加 y 軸名稱
legend() % 添加圖例
- 在原圖上繼續繪制
plot(x, y);
hold on;
plot(x, y);
- 設置坐標軸
% 橫縱坐標等比例
axis equal
% 設置橫、縱坐標范圍
axis([x1 x2, y1 y2]);
- 快速繪制曲線
linspace(a, b) 設置區間為a到b
x = linspace(-10, 10); % 設置 x 自變量為 -10 到 10
plot(x, sin(x)); % 繪制 sinx 在 -10 到 10 的圖像
- 三維繪圖
繪制三維曲線的函數
plot3(x, y, z);
具體使用類似於 plot 函數;還可以繪制三維網格
mesh(x, y, z);
繪制三維曲面
surf(x, y, z);
直方圖
使用 hist 函數繪制直方圖,它有如下幾種用法:
- 單一參數
hist(w); % 繪制向量 w 的直方圖
此時,向量 w 的數據范圍作為橫坐標的區間范圍,然后從左向右將出現在該區間中的元素個數(頻數)作為縱坐標

如圖是一個 100000 維數組繪制的直方圖,圖中柱形的高度之和就是 100000 。
- 划分區間個數
hist(w, n);
可以指定將區間范圍划分為 n 塊,然后從左向右將出現在該區間中的元素個數(頻數)作為縱坐標

這是之前的 100000 維數組在 50 個區間上的頻數直方圖。
package
有時需要手動安裝一些包,這時就需要使用 pkg 命令
pkg install -forge name
安裝指定的 package ,然后加載 package
pkg load name