Table of Contents

Octave语法


文件结构

Matlab的代码文件后缀名为m,在旧版的Matlab中,一个文件只能包含一个函数,在Matlab2016b之后的版本中,需要用到的函数,可以在当前文件中定义(而不是单独新建一个文件,存储一个可能只有一行的函数),但是需要注意一点,函数的定义必须放在文件的最后。建议的写法为:在一份代码文件中,末尾定义需要用到的子函数,开头定义一个与文件名相同的函数(注意在开头定义,名字相同),作为这份文件的“代表”,在此函数中写主体的框架,不要把语句写在函数体的外面,不要把变量定义在函数体外面(看起来是全局的,但实际上并不是,而且会引起很多麻烦)

%文件名为fib.m
%具体知识点下文总结
function []=fib()
    for i=1:10
        fprintf('%02d\n',cal_fib(i));
    end
end
function [res]=cal_fib(index)
    if index<=2
        res=1;
    else
        res=cal_fib(index-1)+cal_fib(index-2);
    end
end

函数

%如果没有返回值或者参数,方括号或圆括号可以不写
%如果没有参数,调用时圆括号也可以不写
%返回值和参数都可以有多个
%返回值不建议使用ans命名
function [return_list]=function_name(para_list)
    function body;
end

比较

x==y;%是否相等
x~=y;%是否不等
x>=y;%大于等于
x<=y;%小于等于
x>y;%大于
x<y;%小于

运算

c=a+b;%加法
c=a-b;%减法
c=a*b;%乘法
c=a/b;%除法
c=a^b;%幂
c=a&b;%并且
c=a&&b;%并且
c=a|b;%或者
c=a||b;%或者
c=mod(a,b);%取模
c=xor(a,b);%异或
c=bitxor(a,b);%按位异或
c=bitand(a,b);%按位和
c=bitor(a,b);%按位或

矩阵

%声明矩阵时,逗号分隔同一行的元素,分号分隔不同的列
%逗号可以用空格代替(我是肯定不会用空格的)
arr=[1,2;3,4];

下标

arr=zeros(4,5);
%使用圆括号进行索引,逗号分开维度
x=arr(2,3);
%数组下标从1开始
arr(0,0);%错误
arr(4,5);%正确
 
%线性索引,只通过一个数字进行索引
%也就相当于把高维度数据“拍平”
arr(20);%正确
 
%下标越界的时候
%如果是作为左值,会自动填充至符合条件
%如果是作为右值,会报错
 
%不会报错,自动填充
%但是一般不要这样,非预期范围内的事情都很玄学
arr(99)=x;
%会报错
x=arr(100);

切片

%Matlab中切片是闭区间
a=[1,2,3,4,5,6,7];
b=a(3:6);%[3,4,5,6]

逻辑

x=true;
y=false;

判断

if x
    do some thing;
elseif y
    do some thing;
end

循环

%for循环
for i=1:100
    do some thing;
    %continue;
    %break;
end
%while循环
while x
    do some thing;
end

注释

%注释语句 不会生效

换行

line_part_a...
    line_part_b;

特殊

点乘:在Matlab中,我们可以把变量看作两种:单一变量(数字)和组合变量(数组、矩阵),单一变量之间的操作、单一变量和组合变量的操作并无歧义,但是组合变量之间的操作,可以是预先定义的操作(例如矩阵乘法),也可以是组成元素之间先进行操作再重新组合(先打碎再重组),这样就产生了歧义。所以点乘就代表了组成元素之间先进行操作再重组,写法为在操作符之前加上一个点;普通的写法就按照人们定义好的规则进行

a=[1,2];
b=[3;4];
disp(a*b);%ans=[11];
disp(a.*b);%ans=[3,6;4,8];

转置:矩阵后面加上一个单引号表示转置

a=[1,2;3,4];
disp(a);%ans=[1,2;3,4];
disp(a');%ans=[1,3;2,4];

全局变量:全局空间默认是隐蔽的,正常声明的变量的可见范围都是本函数,声明全局变量要使用global关键字,声明后该变量会存在于全局空间,在需要使用该变量的其他函数内要重新声明(只是引入其可见性,不更改或者重新初始化其值),注意不要和本地变量命名冲突

function []=fun_a()
    %x=0;
    %不要以上操作:在声明全局变量前声明一个同名的本地变量
    global x;
end
function []=fun_b()
    %两个函数共享了一份x的内容
    global x;
end

虚数:Matlab默认数字范围就是全复数集合,i、j可以直接当作复数单位来用

%可以直接这么写
a=1+i;
b=1-j;