Octave学习
本文最后更新于:2023年4月4日 下午
Octave入门
首先很多的语法和MATLAB非常的类似,可以说很多语法都是兼容的(毕竟Octave就是来解决MATLAB价格高昂的问题来的),基本上99%的语法都是一样的。要想了解一下MATLAB的语法,可以点这里。
杂谈
首先还是一样的:我们通过%
来进行注释,然后“输入即所得”的概念依然适用,同样我们输入;
后就不会显示结果了。
当然,我们使用#
也能够为行代码进行注释
同时我们使用终端中的Octave的时候,想要将前缀变得简单一点,可以这样:
PS1('>> ');
ps: 记得输入;
不管在MATLAB中还是Octave中,下标都是从1开始的
你可以输入who
来显示Octave中的所有变量
使用部分函数操作变量
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 协议 ,转载请注明出处!