专栏首页mwangblog开始使用Octave

开始使用Octave

开始使用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                                % 关闭图片

图像如下:

可以使用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

图像如下:

使用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

图像如下:

文件操作

导入一个文件非常简单:

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

保存一个文件也很简单:

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

获取帮助

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

>> help eye

本文分享自微信公众号 - mwangblog(mwangblog),作者:WM

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-01-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 虚拟机软件ORACLE VM VIRTUALBOX的安装并安装WINDOWS 7 文字版

    mwangblog
  • 虚拟机软件ORACLE VM VIRTUALBOX的安装并安装WINDOWS 7 图文版

    mwangblog
  • 专注模式和发散模式——《学习之道》(Barbara Oakley)读书笔记一

    专注模式的启动常常是因为已掌握的概念对你而言熟悉又轻松。发散模式能让学习更有深度和创造力。

    mwangblog
  • Gym 100952H&&2015 HIAST Collegiate Programming Contest H. Special Palindrome【dp预处理+矩阵快速幂/打表解法】

    H. Special Palindrome time limit per test:1 second memory limit per test:64 mega...

    Angel_Kitty
  • NYOJ----次方求模

    次方求模 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 求a的b次方对c取余的值 输入第一行输入一个整数n表示测试数据的组数...

    Gxjun
  • 剑指offer——丑数

    题目描述 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑...

    AI那点小事
  • 勾股数组

          一般地,若三角形三边长a,b,c都是正整数,且满足a,b的平方和等于c的平方,那么数组(a,b,c)称为勾股数组。勾股数组是人们为了解出满足勾...

    Ch_Zaqdt
  • UVAlive 3708 Graveyard(最优化问题)

    题目描述: 在周长10000的圆上,初始等距的放置着n个雕塑,现在新加入m个雕塑,要使得这n+m个雕塑仍然等距,问原来n个雕塑要移动的距离总和的最小值. 原...

    Angel_Kitty
  • 【Gym 100947C】Rotate It !!

    饶文津
  • LeetCode 984. 不含 AAA 或 BBB 的字符串(贪心)

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/string-without-aaa-or-bbb ...

    Michael阿明

扫码关注云+社区

领取腾讯云代金券