Octave語法

garfielder007發表於2016-05-09

向量

  • 分號:分割行

  • 空格或逗號:分割列

建立與訪問

行向量

  • 空格或逗號分割

>> v = [1 2 3] % 等效:v = [1, 2, 3]
v =

   1   2   3
   
>> v(2) % 只有一行,所以指定就是列
ans =  2

列向量

  • 分號分割

>> v = [1; 2; 3]
v =

   1
   2
   3

>> v(2) % 只有一列,所以指定就是行
ans =  2

矩陣

  • 與向量一樣,空格或逗號分割列,分號分割行

  • 冒號:代表所有,所有行或所有列

建立

>>   A = [1, 2; 3, 4] % 一行寫完
A =

   1   2
   3   4

>> A = [1, 2; % 分行寫
> 3, 4]
A =

   1   2
   3   4

建立技巧

  • a:c --- 從a到c

  • a:b:c --- 從a,間隔b,到c

  • 向量也可以用這樣的方法建立

>> A = [1:3; 4:6]
A =

   1   2   3
   4   5   6
   
>> A = [1:2:5; 2:2:6]
A =

   1   3   5
   2   4   6

特殊矩陣

單位矩陣

>> eye(3) % 單位矩陣
ans =

Diagonal Matrix

   1   0   0
   0   1   0
   0   0   1

>> flipud(eye(3))
ans =

Permutation Matrix

   0   0   1
   0   1   0
   1   0   0

轉置矩陣

A =

   1   2
   3   4

>> A'
ans =

   1   3
   2   4

逆矩陣

A =

   1   2
   3   4

>> pinv(A)
ans =

  -2.00000   1.00000
   1.50000  -0.50000

>> pinv(A) * A
ans =

   1.00000   0.00000
  -0.00000   1.00000

全1矩陣

>> ones(2, 3)
ans =

   1   1   1
   1   1   1

全0矩陣

>> 0*ones(2, 3)
ans =

   0   0   0
   0   0   0
>> zeros(2, 3)
ans =

   0   0   0
   0   0   0

隨機矩陣

>> rand(1, 3) % 0~1的隨機數,13列
ans =

   0.99291   0.65946   0.95102

高斯分佈矩陣

>> randn(1, 3) % 高斯分佈
ans =

   0.14646   2.02587   1.33266

訪問

  • 冒號:代表所有,所有行或所有列

訪問元素

A =

   1   2   3
   4   5   6
   7   8   9
   
>> A(2, 2) % 第二行,第二列,先定行再定列
ans =  5

訪問單行或單列

>> A(1, :) % 第一行,所有,元素
ans =

   1   2   3
   
>> A(:, 2) % 第二列,所有,元素
ans =

   2
   5
   8

訪問多行或多列

>> A(:, [1, 3]) % 第一列和第三列,所有,元素
ans =

   1   3
   4   6
   7   9

>> A([1, 3], :) % 第一行和第三行,所有,元素
ans =

   1   2   3
   7   8   9

連線

  • C = [A B],把B按列加到A上,生成C

  • C = [A; B],把B按行加到A上,生成C

新增元素

>> A = [1]
A =  1

>> A = [A, 2] % 把2,按列,新增到A上,再賦給A
A =

   1   2
   
>> A = [A; 3] % A有兩列,3只有一列,規模不匹配
error: vertical dimensions mismatch (1x2 vs 1x1)

新增行或列

>> A = [A; [3, 4]] % 將向量[3, 4],作為行,新增到A上,在賦給A
A =

   1   2
   3   4
   
>> A = [A, [5; 6]] % 將向量[5, 6],作為列,新增到A上,在賦給A
A =

   1   2   5
   3   4   6

矩陣連線

>> A = [1, 2; 3, 4]
A =

   1   2
   3   4

>> B = [5, 6; 7 ,8]
B =

   5   6
   7   8

>> [A; B] % 將B,作為行,新增到A上
ans =

   1   2
   3   4
   5   6
   7   8

所有的資料放入一個向量中

>> A
A =

   1   2
   3   4

>> A(:)
ans =

   1
   3
   2
   4

>> A(:)'
ans =

   1   3   2   4

賦值

  • 在訪問基礎上,給定相同規模的資料

A =

   1   2   3
   4   5   6
   7   8   9

>> A(3, 3) = 10 % 修改單個元素的值
A =

    1    2    3
    4    5    6
    7    8   10

>> A(1, :) = [0, 0, 0] % 修改一行的值
A =

    0    0    0
    4    5    6
    7    8   10

>> A(2:3, 2:3)
ans =

    5    6
    8   10

>> A(2:3, 2:3) = [0, 0; 0, 0] % 修改指定矩陣的值
A =

   0   0   0
   4   0   0
   7   0   0

運算

加,減

>> A = [1 1; 1 1]
A =

   1   1
   1   1

>> B = [2 2; 2 2]
B =

   2   2
   2   2

>> A + B
ans =

   3   3
   3   3

>> A - B
ans =

  -1  -1
  -1  -1

>> A - 1
ans =

  0  0
  0  0

相乘

>> A = [1 2; 3 4]
A =

   1   2
   3   4

>> B = [5 6; 7 8]
B =

   5   6
   7   8

>> A * B
ans =

   19   22
   43   50

>> -A % -1 * A
ans =

  -1  -2
  -3  -4

點運算

對應元素運算

  • 維度相同:對應元素相乘

  • 行維度相同:每行對應元素相乘

  • 列維度相同:每列對應元素相乘

  • A .* B = B .* A

  • 乘 *;除 /; 平方 ^;等

維度相同

A =

   1   1
   1   1

B =

   2   3
   2   3

>> A .* B
ans =

   2   3
   2   3

行維度相同

A =

   1   1
   1   1

B =

   5   6

>> A .* B
ans =

   5   6
   5   6

列維度相同

A =

   1   1
   1   1

B =

   5
   6

>> A .* B
ans =

   5   5
   6   6

點除

  • 矩陣乘以常數,A * 2,除可以是,A / 2

  • 反過來,2 * A沒問題,2 / A 就不行,要用2 ./ A

A =

   1   2
   3   4

>> 1 ./ A
ans =

   1.00000   0.50000
   0.33333   0.25000

邏輯

  • 每一個元素做比較,標記0或1

  • &gt, <, ==, !=(或~=), &&, ||

A =

   1   2
   3   4

>> A > 2
ans =

   0   0
   1   1

位運算

  • 或 | ,函式xor

  • 且 &

  • 非 ~

  • 異或 ^

控制語句

if

i =  1
>> if i == 1
>     disp(1)
>  elseif i == 2
>     disp(2)
>  else
>     disp(3)
>  end

for

>> for i = 1:3 % 從13
>     disp(i)
>  end
 1
 2
 3

while

>> while i <= 3
>     disp(i)
>     i = i + 1
>  end
 1
 2
 3

break,continue

與C、C++、Java沒有區別

函式

  • size:獲取矩陣維度

  • length:獲取最大維度

  • who:變數列表

  • whos:變數詳情

  • clear 變數名:刪除指定變數

  • clear:刪除所有變數

  • find:返回符合條件元素的下標

  • log:log以e為底

  • exp:e的多少次方

  • abs:絕對值

  • floor:向下取整

  • ceil:向上取整

  • sum:求和

  • prop:求積

size

  • 獲取矩陣維度

A =

   1   2
   3   4
   5   6
>> aSize = size(A)
aSize =

   3   2
   
>> size(A, 1) % 3行
ans =  3

>> size(A, 2) % 2列
ans =  2

length

  • 獲取最大維度

A =

   1   2
   3   4
   5   6

>> length(A) % 輸出最大維度
ans =  3

who

變數列表

>> who % 現在都有哪裡變數
Variables in the current scope:

A          aSize      ans        featuresX  w

whos

變數詳情

>> whos % 變數詳情
Variables in the current scope:

   Attr Name           Size                     Bytes  Class
   ==== ====           ====                     =====  =====
        A              3x2                         48  double
        aSize          1x2                         16  double
        ans            1x20                        20  char
        featuresX     27x2                        432  double
        w              1x10000                  80000  double

Total is 10082 elements using 80516 bytes

clear

刪除變數

>> clear featuresX
>> who
Variables in the current scope:

A      aSize  ans    w
>> clear % 清除全部變數
>> who % 一個變數都沒有了

find

  • 返回符合條件元素的下標

A =

   5   6
   7   8

>> [r, c] = find(A > 6) % 符合要求的是:第二行第一個和第二行第二個
r =

   2
   2

c =

   1
   2

sum

求和

>> A = [1, 2; 3, 4]
A =

   1   2
   3   4

>> sum(A) % 等效:sum(A, 1)
ans =

   4   6
   
>> sum(A, 2)
ans =

   3
   7

prod

求積

>> A
A =

   1   2
   3   4

>> prod(A) % 等效:prod(A, 1)
ans =

   3   8

>> prod(A, 2)
ans =

    2
   12

max

向量

>> a = [1 5 2 3.3]
a =

   1.0000   5.0000   2.0000   3.3000

>> max(a)
ans =  5

>> [val, ind] = max(a)
val =  5
ind =  2

矩陣比較

兩個矩陣比較每個元素,保留大的

>> A = rand(3)
A =

   0.2620788   0.6346345   0.4659161
   0.0880455   0.1258945   0.0079559
   0.0296765   0.7917592   0.4321800

>> B = rand(3)
B =

   0.039237   0.672424   0.214649
   0.491320   0.362929   0.197626
   0.821090   0.675265   0.698960

>> max(A, B)
ans =

   0.26208   0.67242   0.46592
   0.49132   0.36293   0.19763
   0.82109   0.79176   0.69896

行與列的最大值

引數二:與之比較的矩陣
引數三:按行還是按列

>> A = [1 2; 3 4]
A =

   1   2
   3   4

>> max(A) % 每列最大值
ans =

   3   4

>> max(A, [], 1) % 每列最大值
ans =

   3   4

>> max(A, [], 2) % 每行最大值
ans =

   2
   4

randperm

生成亂序序列

>> A = [2, 3, 4 ,5 ,6]
A =

   2   3   4   5   6
>> rand_indices = randperm(length(A))
rand_indices =

   1   2   4   5   3
>> A(:, rand_indices(1:3))
ans =

   5   6   2

自定義函式

建立步驟

  • 建立存放函式的檔案(檔名要與函式名相同,.m結尾)

square.m
  • 建立函式

% 一個返回值
function 返回值 = 函式名(引數列表)
    函式體
end

% 多個返回值
function [返回值1, 返回值2] = 函式名(引數列表)
    函式體
end
function y = square(x)
  y = x^2;
end

function [y1, y2] = squareAndCube(x)
  y1 = x^2;
  y2 = x^3;
end

呼叫

  • 進入到存放函式檔案的目錄

  • 新增存放函式檔案的目錄,到,搜尋路徑

>> cd Downloads/ % 進入存放函式檔案的目錄
>> square(2)
ans =  4

>> addpath('~/Downloads') % 新增到搜尋路徑
>> cd ..
>> square(2)
ans =  4

資料

路徑

與Linux命令一樣

>> pwd % 當前路徑
ans = /Users/XXX

>> cd ~/Developer

>> pwd
ans = /Users/XXX/Developer

>> ls % 列出目錄檔案和資料夾

>> cd .. % 回到上級目錄

載入與儲存

>> load featuresX.dat % 載入資料,變數名為featuresX
>> data = load('ex1data1.txt'); % 變數名為data

>> save featuresX.mat featuresX; % 將featuresX中的資料儲存到featuresX檔案中
>> save hello.txt v -ascii % 將變數v中得資料已ascii編碼方式儲存到hello.txt中

其他

命令

  • 簡化命令列:PS1('>> ');

  • 關閉圖表:close或close all

  • 命令列清屏:clc

註釋

%後為註釋

列印

自動列印

a = 3 % 會列印資料
a = 3; % 不會列印資料,分號可以防止輸出

格式化

disp(pi) % 輸出:3.1416
disp(sprintf('pi is %.2f', pi)) % c語言風格

預設格式

format long % 修改預設列印格式

幫助

help size % 檢視size函式的幫助文件
help help % 檢視help函式的幫助文件

plot

屬性

  • LineWidth:線寬

  • MarkerFaceColor:標記顏色

  • MarkerSize:標記大小

x,y軸

ylabel('x');
xlabel('y');

直方圖

>> w = -6 + sqrt(10)*randn(1, 10000);
>> hist(w)
>> hist(w, 30) % 30
from: https://segmentfault.com/a/1190000004204177