Octave学习

本文最后更新于:2023年4月4日 下午

Octave入门

首先很多的语法和MATLAB非常的类似,可以说很多语法都是兼容的(毕竟Octave就是来解决MATLAB价格高昂的问题来的),基本上99%的语法都是一样的。要想了解一下MATLAB的语法,可以点这里

杂谈

首先还是一样的:我们通过%来进行注释,然后“输入即所得”的概念依然适用,同样我们输入;后就不会显示结果了。

当然,我们使用#也能够为行代码进行注释

同时我们使用终端中的Octave的时候,想要将前缀变得简单一点,可以这样:

PS1('>> ');

ps: 记得输入;

不管在MATLAB中还是Octave中,下标都是从1开始的

你可以输入who来显示Octave中的所有变量

其实讲真的,这个Octave的教程和MATLAB没什么区别(*出一个就够了(⊙v⊙)*)

使用部分函数操作变量

  • disp()这个的函数就相当于是展示一个变量的结果,和普通的输入一个变量没什么区别。(但是会有函数式的变化,而且语义性更好

我们可以在disp()中写入disp(sprintf('2 decimals: %0.2f', a))

  • sprintf(),上面的例子就用到了这个函数,这个函数可以将一个字符串输出,当然我们还有格式化的%f类似于python等语言中的数据标准化,定义每一个输出变量的格式
  • format,其实并不是一个函数,这里的作用是将当前的输入出数字的格式进行转换,比如format long,之后的数字展示就会变成long格式。

需要注意的一点就是,不再是!=代表不等于,而是变成了~=,(在MATLAB中也是一样的

使用矩阵

还是和MATLAB一样:

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

   1   2
   3   4
   5   6

但是当你没有使用[]来构造时,比如

>> v = 1:0.1:2

这样就会构造一个1~2的步长为0.1的一个行向量。

当然你还可以使用A = [1:2:10; 11:2:20; 21:2:30]这种方式得到一个多个行向量组成的矩阵,步长为中间值。

  • ones(2, 3),这个函数也是在MATLAB中出现的,用来得到一个全部为1的一个$n\times m$的矩阵。

同样还有zeros(1, 3),也是和MATLAB一样,生成一个全0的矩阵。

  • rand(n, m)生成一个$n \times m$的随机数矩阵(随机种子[1, 2]),randn(n, m)生成一个$n \times m$​的高斯分布的随机数矩阵(就当是复习)
  • eye(n)生成$n^2$​的单位矩阵
  • size(A)输出矩阵A的大小
  • linspace(0, 10, 21)来输出0到10数字的21等分。

对矩阵的操作

您想要求一个矩阵A的转置,非常简单,只需要使用A'即可

  • 对矩阵进行切片
  • 对矩阵进行拼接

直接用[],如[A, B]这样就能将B添加到A后面,也就是说行不变,列增加。如果使用[A;B]就是行增加,列不变

和matlab一样,.在矩阵中就是算术运算

运算

普通的sin()等三角函数肯定是有的,fix()是向零取整,ceil()是向正无穷取整

数的运算

虽然我们经常用到的是矩阵,但是普通的数(float)也很重要,而且和普通的编程语言是差不多的。

  • 比如我们可以直接+=
  • 数之间可以直接用+,-,*,/,同时我们可以直接用^表示指数(MATLAB同样适用),记住Python中是使用**

ps:给一个建议,因为我们很多时候都是用的矩阵运算,所以可以直接在需要`等运算时直接用.`

循环和分支

还是和MATLAB是一样的,使用if.. elseif..end这种语法结构

if a > b
	'成立语句';
elseif a < b
	'成立语句';
else
	'不成立语句';
end

switch 表达式(数值或字符串)
	case 数值或字符串
		语句1;
	case 数值或字符串
		语句2;
	otherwise
		语句n;
end

ps: 同时,我们还是养成习惯,在end后面写上标识,endif

为了和python相互区别,你要记住语句头是没有结尾的:

循环也是和MATLAB一样滴~:

%% 实现1到5的阶乘和
sum = 0;
for i = 1:5
	p = 1;
		for j = 1:i
			p = p * j;
		end
	sum = sum + p;
end
sum

函数文件

当我们想要调用一个封装好的功能的时候,我们可以在一个文件中写入这个函数,然后命名为FuncName.m,之后我们调用就可以直接使用FuncName来调用函数(当然得在一个文件夹下说明一下,Octave的脚本文件也是以.m结尾的

函数声明

function [a, b] = swap(a, b)
c = a;
a = b;
b = c;
endfunction

可以看到首先就要定义有几个参数,然后才是函数名的声明。

句柄函数

相当于将函数起一个别名,如:

fname = @sin;

inline函数

fun = inline('函数表达式', '自变量')
>> fname = inline('sum(1./(1:m).^2)', 'm')
% 然后我们就可以调用这个函数(通过我们声明的名字)

匿名函数

真的就相当于Python中的匿名函数,我们只需要:

fun = @(自变量)函数表达式
>> fn = @(m)sum(1./(1:m).^k)

部分有用函数

  • fsolve():用来求解非线性方程的解
  • input():和Python一样的输入函数,必须写提示信息
  • nargin():记录调用函数时输入的参数个数(从侧面说明了Octave和MATLAB可以输入差参数),重载的好帮手
  • nargout():记录调用函数时输出的变量个数
  • tic()/toc():查看运行时间

读取和保存变量

使用load()函数来加载(或叫做读取)变量,如load a.mat,当然我们可以使用save来保存变量,如save a.mat a

使用clear清空所有变量(清空工作区),使用clc清屏

写入文件

写入文件使用fopen()fprintf()

file = fopen('ceg.txt', 'w');
fprintf(file, '%12.4f %4.2f\n', [pi, 2*pi]); % 也就是说数据就写在[]中
fclose(file);

画图(Plot)

首先使用plot(x1,y1,选项1,x2,y2,选项2...) 这种形式来画出一个二维的图(相比于python的plt.show()确实好多了

然后简单的plot2()就是画三维图像的呗。

同时更强大的是:通过使用fplot('fun', [a,b])可以直接画出这个名叫fun的函数图像。

ps:使用hold on来保持之前画的图在画布上。

绘制网格图

使用meshgrid()函数绘制,

xa = -2:0.2:2;
ya = xa;
[x,y] = meshgrid(xa, ya);
z = x.*exp(-x.^2 - y.^2);
mesh(x,y,z);pause(2)
surf(x,y,z);pause(2)
contour(x,y,z);pause(2)
contour3(x,y,z);pause(2)
contour(x,y,z, [0.1 0.1]);
surf(x, y, z);

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!