Octave 是一个类似 matlab 和 Scilab 的数学软件包,可以进行各种运算,编程。它还有丰富的 C++ 接口可以让用户编程时调用。它绘图使用 gnuplot。
Octave 是一个和 MATLAB 十分类似的软件,相比 MATLAB 而言,Octave 的优点在于开源免费,体积相对很小。而且两者的语法相差也很小,一个能在其中一个软件上运行的程序稍作修改就能够运行于另一个软件之上。下面记录一些 Octave 常用的语句和指令。
- 利用Octave进行四则运算比较基础,和常见的科学计算器用法类似。
- "1 == 1" % 判断相等
- "1 ~= 2" % 注意不等号
- "1 && 0" % 求逻辑与
- "xor(1, 0)" % 求异或,注意这是另一种语法形式
- a = 3
- a = 3; % 区别在于分号,不带带分号会紧接着打印出来
- disp(a) % 打印变量a
- a = 3.141593;
- disp(sprintf("2 decimals : %0.2f), a) % 格式控制,类似C风格,打印出来只留两位小数
- >> format long
- >> a = pi
- a = 3.14159265358979
- >> format short
- >> a = pi
- a = 3.1416
- %精度不同
- >>
- >> A = [1 2; 3 4; 5 6]
- A =
- 1 2
- 3 4
- 5 6 %建立矩阵
- >> V = [1 2 3]
- V =
- 1 2 3 %建立行向量
- >>
- >> V = [1; 2; 3] % 建立列向量
- V =
- 1
- 2
- 3
- >> V = 1: 0.1: 2 % 比较直观,步长为0.1,建立了一个行向量
- V =
- Columns 1 through 8:
- 1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000
- Columns 9 through 11:
- 1.8000 1.9000 2.0000
- >> V = 1:6 % 显然是默认步长为1,省略了,和前面一致
- V =
- 1 2 3 4 5 6
- >> ones(2, 3) % 生成矩阵的其它方法
- ans =
- 1 1 1
- 1 1 1
- >> zeros(2, 3) % 生成零矩阵
- ans =
- 0 0 0
- 0 0 0
- >> rand(2, 3) % 取随机数,定义维度,随机数大小总在0到1之间
- ans =
- 0.57457 0.79732 0.29826
- 0.61112 0.51547 0.88642
- >> randn(2, 3) % randn表明随机数来自标准正态分布
- ans =
- 0.897613 0.063959 -0.838812
- 0.205952 -1.267830 -1.060730
- >> w = randn(1, 10000);
- >> hist(w) % 绘制直方图指令
- >> eye(4) % 得到单位矩阵
- ans =
- Diagonal Matrix
- 1 0 0 0
- 0 1 0 0
- 0 0 1 0
- 0 0 0 1
- >> A = [1 2; 3 4; 5 6]
- A =
- 1 2
- 3 4
- 5 6
- >> size(A) % 得到矩阵维度
- ans =
- 3 2
- >>
- >> size(A, 1) %获取行数
- ans = 3
- >> size(A, 2) %获取列数
- ans = 2
- >>
- >> V = [1 2 4 5 6];
- >> length(V) % 获取向量的长度
- ans = 5
- >> A = [1 2; 3 4; 5 6;];
- >> A(3,2) % 根据索引获取一个元素
- ans = 6
- >> A(2, :) % 直接获取一行元素,冒号在这里表示某一行或者一列的所有元素
- ans =
- 3 4
- >> A([1 2], :) % 返回第一行和第二行的所有元素
- ans =
- 1 2
- 3 4
- >> v = [11; 22; 33];
- >> A = [A, v] % 给A附加一列向量
- A =
- 1 2 11
- 3 4 22
- 5 6 33
- >> A(:) % 含义很特殊,结果是将A中所有元素都放于一个列向量中
- ans =
- 1
- 3
- 5
- 2
- 4
- 6
- 11
- 22
- 33
- >> A = [1 2; 3 4; 5 6;];
- >> B = [1 2; 3 4; 5 6;];
- >> C = [A B] % "横"着连接
- C =
- 1 2 1 2
- 3 4 3 4
- 5 6 5 6
- >> C = [A; B] % "竖"着连接
- C =
- 1 2
- 3 4
- 5 6
- 1 2
- 3 4
- 5 6
pwd 指令:得到 Octave 默认路径;
cd 指令:change direction 即改变路径,自己指定路径,但路径名中不要包含汉字
ls 指令:列出默认路径中包含的所有路径或者文件
load test.dat : 加载文件指令
load('test.dat) : 同上
test : test 在这里不是指令,是文件名,显示出已经加载的名为 test 的文件
size(test) : 得到 test 文件的维度
who/whos : 列出目前 Octave 工作空间中包含的所有变量
clear test : test 是文件名,删除了工作空间的变量 test
v = test(1 : 10) : 取 test 中的前十个赋值给变量 v
save hello.dat v : 将变量 v 保存在 hello.dat 文件中,注意当再次加载进来时,变量的名称是 v 非 hello
- >> A = [1 2; 3 4; 5 6;];
- >> B = [11 12; 13 14; 15 16];
- >> C = [1 2; 3 4];
- >> A*C % 常规的矩阵乘法
- ans =
- 7 10
- 15 22
- 23 34
- >> A.*B % 特殊的矩阵乘法:对应元素相乘
- ans = %那么还有.^ 和 ./的道理也是相同的
- 11 24
- 39 56
- 75 96
- >> v = [1; 2; 3];
- >> log(v) % 对列向量每个元素求对数
- ans =
- 0.00000
- 0.69315
- 1.09861
- >> exp(v) %求指数
- ans =
- 2.7183
- 7.3891
- 20.0855
- >> abs(v) %求绝对值
- ans =
- 1
- 2
- 3
- >> v = v + ones(length(v), 1) % 给列向量每个元素加1的简洁写法
- v =
- 2
- 3
- 4
val = max(v) : 返回列向量中最大的值,也可以得到索引
val = max(A) : 返回矩阵中每列的最大元素,因此若 A 为 m*n 维且不重复,返回 1*n 维
- >> v = [1 15 2 5];
- >> v < 3 % 每个元素进行逻辑判断
- ans =
- 1 0 1 0
- >> find(v<3) % 在上面进行逻辑判断的基础上,返回结果为真的索引
- ans =
- 1 3
- >> max(max(A))
- ans = 9
- >> max(A(:)) % 两种求矩阵中所有元素最大值的方法
- ans = 9
- sum(A); 求矩阵A中每一列之和
- sum(A,1); 同上
- sum(A, 2); 求每一行之和
- sum(sum(A)); 这样就得到了矩阵中所有元素之和
- sum(sum(eye(3) .* A)); 得到主对角线元素之和
- sum(sum(A.*flipud(eye(3)))); 得到副对角线元素之和
- pinv(A); A为奇异阵,得到A的逆矩阵,A为非奇异方阵或者不为方阵时,得到A的广义逆
- for i = 1:10
- v = i * 2;
- end
- % 两种写法,大同小异,分号或者是逗号或者是没有符号,都可以
- indices = 1:10;
- >> for i=indices,
- v(i) = i*i;
- end;
- % while循环的写法
- i = 1;
- >> while i <= 5;
- v(i) = 100;
- i = i+1;
- end;
- %break语句的用法
- >> i = 1;
- >> while true;
- v(i) = 999;
- i = i+1;
- if i == 6;
- break;
- end;
- end;
- % if-else语句用法示例
- >> a = 1
- a = 1
- >> if a == 1,
- disp('The value is one');
- elseif a == 2,
- disp('The value is two');
- else
- disp('whocare');
- end;
- The value is one
- %函数的使用,列举两个实例
- function [a,b] = CubeFunc(x)
- a = x^3 ; b = x^4; % 有多个返回值
- %Cost Function的简单实现
- function J = CostFunc(X,y,theta)
- m = length(y);
- var = y - X * theta;
- sqrError = sum(var .^2);
- J = 1/(2*m)*sqrError;
- %在写函数时尽量体现公式,并不会太麻烦,且不易出错
来源: http://www.phperz.com/article/17/0322/326591.html