Octave 使用方法


 

查詢和退出

使用 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)函數,例如將如下方程組:

\[\left\{\begin{aligned} &\sin x_1 + x_2 + x_3^2e^{x_1} - 4 = 0\\ &x_1 + x_2x_3 = 0\\ &x_1x_2x_3 = -2 \end{aligned}\right. \]

轉化為下面的形式函數:

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 的數據范圍作為橫坐標的區間范圍,然后從左向右將出現在該區間中的元素個數(頻數)作為縱坐標

untitled1

如圖是一個 100000 維數組繪制的直方圖,圖中柱形的高度之和就是 100000 。

 

  • 划分區間個數
hist(w, n);

可以指定將區間范圍划分為 n 塊,然后從左向右將出現在該區間中的元素個數(頻數)作為縱坐標

untitled

這是之前的 100000 維數組在 50 個區間上的頻數直方圖。

 

package

有時需要手動安裝一些包,這時就需要使用 pkg 命令

pkg install -forge name

安裝指定的 package ,然后加載 package

pkg load name


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM