开始使用Octave

Octave是一个开源的科学计算以及数值分析的工具,在一定程度上,它与MATLAB语法兼容。

那位要问了:为什么不直接用MATLAB呢?因为MATLAB贵啊!

数值计算

计算数值很简单,只需要输入需要的表达式就可以了:

>> 5 + 5
ans =  10
>> 5 / 2
ans =  2.5000

或者调用一些函数:

>> 2^2
ans =  4
>> sqrt (4)
ans =  2

敲入变量名即可查看变量的值。首先创建两个变量:

>> v = 1 + 3;
>> x = v * 2;

在语句后面加上;可以不把表达式的值立刻显示出来,我们知道v值为4且x值为8。下面分别查看它们的值:

>> v
v =  4
>> x
x =  8

也可以使用disp命令:

>> disp (v)
 4
>> disp (sprintf ('The value of v is %.2f', v) )
The value of v is 4.00

查看工作区域中所有的变量,可以使用who或者whos命令,其中whos显示的信息更加详细一些:

>> who
Variables in the current scope:

ans  v    x

>> whos
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        ans         1x1                          8  double
        v           1x1                          8  double
        x           1x1                          8  double

Total is 3 elements using 24 bytes

删除变量可以使用clear命令,%表示注释:

>> clear x  % 删除 x
>> clear    % 删除所有变量

使用format修改小数点后位数:

>> format short
>> pi
ans =  3.1416
>> format long
>> pi
ans =  3.14159265358979u

逻辑运算

逻辑运算与C语言很相似:

>> 1 == 2   % 比较是否相等
ans = 0     % 假
>> 1 ~= 2   % 比较是否不相等,这里符号与C语言不太一样
ans =  1    % 真
>> 0 && 1   % 与
ans = 0
>> 0 || 1   % 或
ans =  1

创建向量与矩阵

创建一个向量:

>> v = [1 2 3]
v =

   1   2   3

创建一个矩阵:

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

   1   2
   3   4
   5   6

创建特殊的矩阵:

>> B = ones (2, 3)  % 创建元素值为1,维度为2 x 3的矩阵
B =

   1   1   1
   1   1   1

>> zeros (2,3)      % 创建元素值为0,维度为2 x 3的矩阵
ans =

   0   0   0
   0   0   0

>> rand (2,3)       % 创建元素值为随机数,维度为2 x 3的矩阵
ans =

   0.667607   0.340230   0.020027
   0.713828   0.791409   0.713673

可以创建单位阵:

>> eye (3)
ans =

Diagonal Matrix

   1   0   0
   0   1   0
   0   0   1

查看矩阵的维度:

>> A
A =

   1   2
   3   4
   5   6

>> size (A)
ans =

   3   2

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

size()函数返回矩阵的维度,1维度显示矩阵的行数,2维度显示矩阵的列数。

length()函数会返回向量的长度,或者矩阵的最大维度:

>> v
v =

   1   2   3

>> length (v)   % 返回向量的元素数量
ans =  3
>> B
B =

   1   1   1
   1   1   1

>> length (B)   % 由于矩阵B的是2 x 3矩阵,所以返回大值 3
ans =  3

矩阵中数据的操作

查看A矩阵中第2行第2列的数值:

>> A (2,2)
ans =  4

获取矩阵A的某行或者某列:

>> A
A =

   1   2
   3   4
   5   6

>> A (:,2)      % 获取A的第2列
ans =

   2
   4
   6

>> A (3,:)      % 获取A的第3行
ans =

   5   6

>> A ([1,3],:)  % 获取A的第1,3行
ans =

   1   2
   5   6

将A中所有元素组成一个向量:

>> A (:)
ans =

   1
   3
   5
   2
   4
   6

合并矩阵:

>> A
A =

   1   2
   3   4
   5   6

>> C = ones (2,2);
>> A = [A ; C]              % 将C合并到A的下方,并且将结果赋值给A
A =

   1   2
   3   4
   5   6
   1   1
   1   1
   
>> A = [A, [1; 2; 3; 4; 5]] % 将[1;2;3;4;5]合并到A的右边,将结果赋值给A
A =

   1   2   1
   3   4   2
   5   6   3
   1   1   4
   1   1   5

求向量中的最大值:

>> v = [5, 4, 3];
>> max (v)
ans =  5
>> [val, ind] = max (v)
val =  5
ind =  1

求矩阵的最大值:

>> A = [ 1 3 5 7 9; 2 4 6 8 10]
A =

    1    3    5    7    9
    2    4    6    8   10

>> max (A)          % 求出A的每一列的最大值
ans =

    2    4    6    8   10

>> max (A, [], 1)   % 在第1维求A的最大值
ans =

    2    4    6    8   10

>> max (A, [], 2)   % 在第2维求A的最大值
ans =

    9
   10

向量中的值与某一个数值的比较:

>> v
v =

   5   4   3

>> v > 3            % 将v中的每一个元素同3比较
ans =

   1   1   0
   
>> find (v > 3)     % 得到符合条件的元素的下标
ans =

   1   2

求向量或者矩阵元素之和:

>> v
v =

   5   4   3

>> sum (v)      % 求出向量中元素的和
ans =  12
>> A
A =

    1    3    5    7    9
    2    4    6    8   10

>> sum (A,1)    % 求出A中第1维之和
ans =

    3    7   11   15   19

>> sum (A,2)    % 求出A中第2维之和
ans =

   25
   30

矩阵计算

求矩阵的转置与逆:

A =

   1   2
   3   4

>> A'           % 求A的转置
ans =

   1   3
   2   4

>> pinv (A)     % 求A的逆矩阵
ans =

  -2.00000   1.00000
   1.50000  -0.50000

矩阵与数字计算:

>> A
A =

   1   2
   3   4

>> A + 2    % A中每个元素+2
ans =

   3   4
   5   6

>> A * 2    % A中每个元素*2
ans =

   2   4
   6   8

>> A / 2    % A中每个元素/2
ans =

   0.50000   1.00000
   1.50000   2.00000

矩阵与矩阵计算:

>> A
A =

   1   2
   3   4

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

   5   6
   7   8

>> A + B        % 矩阵加法
ans =

    6    8
   10   12

>> A .* B       % A中的元素与B中对应的元素相乘
ans =

    5   12
   21   32

>> A * B        % 矩阵乘法
ans =

   19   22
   43   50

控制结构

while循环和if条件:

>> v
v =

    1    2    3    4    5    6    7    8    9   10

>> while true,              % start loop
        v(i) = v(i) + 1;
        if v(i) > 4,        % 如果v中的元素>4,则退出循环
                break;
        end;
        i = i + 1;          % 下标自增1
   end;                     % end loop
>> v
v =

    2    3    4    5    5    6    7    8    9   10

上面的程序中使用了whileif。注意在循环或者判断结构的结尾写明end;

for循环:

>> for i = [1 3 5],
        v (i) = 0;
   end;
>> v
v =

    0    3    0    5    0    6    7    8    9   10

switch判断:

>> a = 2
a =  2
>> switch (a),
        case 1,
                disp ('The value is 1.');
        case 2,
                disp ('The value is 2.');
        case 3,
                disp ('The value is 3.');
        otherwise,
                disp ('Wo...');
   end;
The value is 2.

switch中并不需要写break来划分情况。

函数

新建一个名为addOne.m的文件,写入:

function y = addOne (x)
y = x + 1

这表示一个函数,这个函数的参数为x,返回值为y,函数的内容是y = x + 1

调用它:

>> addOne(1.2)
y =  2.2000
ans =  2.2000

画图

使用plot()函数画图:

>> x = 0:0.1:2*pi;                      % 为x赋值
>> y_sin = sin (x);                     % 为y赋值
>> plot (x, y_sin);                     % 绘制x与y的图像
>> xlabel ('x');                        % x轴的标签设置为"x"
>> ylabel ('sin(x)');                   % y轴的标签设置为"sin(x)"
>> title ('y = sin (x), 0 < x < 2pi');  % 设置图片标题
>> print -dpng 'octave_plot_sin.png'    % 保存为png图片,并设置文件名
>> close                                % 关闭图片

图像如下:

y=sin(x)图像

可以使用hold on命令在一幅图中绘制多条曲线:

>> x = 0:0.1:2*pi;
>> y_sin = sin (x);
>> y_cos = cos (x);
>> plot (x, y_sin);
>> hold on;                         % 接下来还在此图中绘制
>> plot (x, y_cos, 'r');            % 红色线条绘制y_cos
>> xlabel ('x');
>> ylabel ('y');
>> legend ('y=sin(x)','y=cos(x)');  % 设置图例
>> print -dpng "octave_plot_sin_cos.png";
>> close

图像如下:

octave在一幅图像中绘制两条曲线

使用subplot对图像进行分格:

>> x = 0:0.1:2*pi;
>> y_sin = sin (x);
>> y_cos = cos (x);
>> y = 0.5 * x;
>> subplot (1,2,1);     % 将图像分为1行2列,使用第1个格
>> plot (x, y, 'b');
>> xlabel ('x'); ylabel ('y=x/2');
>> subplot (2,2,2);     % 将图像分为2行2列,使用第2个格
>> plot (x, y_sin, 'r');
>> xlabel ('x'); ylabel ('y=sin(x)');
>> subplot (2,2,4);     % 将图像分为2行2列,使用第4个格
>> plot (x, y_cos, 'g');
>> xlabel ('x'); ylabel ('y=cos(x)');
>> print -dpng "octave_subplot_3.png";
>> close

图像如下:

octave中使用subplot画三幅图

文件操作

导入一个文件非常简单:

>> load ('featureX.dat')    % 导入featureX.dat文件

保存一个文件也很简单:

>> save I.mat I;                % 保存I到I.mat 会对数据进行压缩
>> save hello.txt I --ascii;    % 保存为可读文本文档

获取帮助

查看函数eye()的帮助文档:

>> help eye
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容