Octave
基本操作
1、语法
~:取反
&&:与
%:注释
||:或
XOR:异或
PS1(‘>>’):省略前面的octave前缀
format long:让字符串显示默认位数
format short:默认输出打印少量的小数点后位数
2、变量
a=3 %打印a=3
a=3; %阻止打印,后车后不打印
a=pi;
a
a=3.1416
disp(a);
3.1416
disp(sprintf(‘2 decimals:%0.2f’,a))
2 decimals:3.14
3、向量和矩阵
A=[1 2;3 4;5 6]
A=
1 2
3 4
5 6
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 %从1每次步长0.1一直增加到2
1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000 1.8000 1.9000 2.0000
V=1:6 %从1每次默认步长1增加到6
V=1 2 3 4 5 6
ones(2,3) %快速生成矩阵
ans=
1 1 1
1 1 1
w=zeros(1,3)
w=
0 0 0
C=2*ones(2,3)
C=
2 2 2
2 2 2
w=rand(1,3) %形成1×3的矩阵,数是介于(0,1)之间的随机数
w=
0.9147 0.1435 0.8496
randn(1,3) //形成矩阵的数符合高斯分布:均值为0,方差为1
w=-6+sqrt(10)*(randn(1,10000)); //-6加上根号10乘以以高斯随机变量
hist(w); //绘制直方图
hist(w,50);
eye(4); //生成4*4单位矩阵
移动数据
1、移动数据
size:矩阵的大小,行和列
length:最大维度的大小,行列的最大值
2、加载和查找数据
pwd:显示当前所在路径
cd:表示改变路径
ls:查询当前目录下的文件/文件夹
load:加载文件
who:显示所有变量
whos:显示更详细的变量信息
clear:删除变量
save hello.mat v:会压缩
save hello.txt v -ascii:可读
v=priceY(1:10); //把princeY中的前10个元素给v
save hello.txt v -ascii; //把v以ASC2码的形式存储在hello.txt文件中
3、操作数据
数据计算
A*B:矩阵相乘
A.*B:A中各元素与B中对应的元素相乘
A.^2:A中各元素进行平方
1./A:对A中元素求倒数
log(A):求对数
exp(A):以e为底,以A为幂
abs(A):求绝对值
v+ones(length(v),1):对v的元素加1 =v+1
max(A):求A 的每一列的最大值
max(A,[],1):取每一列的最大值,1表示第一维度(列)
max(A,[],2):取每一行的最大值,2表示第二维度(行)
sum(A):矩阵所有数据之和
sum(A,1):每列求和,1表示第一维度
prod(A):数据乘积
ceil(A):向下取整
floor(A):向上取整
m=magic(3):得到一个3×3的幻方矩阵,幻方矩阵是任意行、列、对角线中的元素加起来都等于相同的值
flipud(A):矩阵翻转
a=[1 15 2 0.5]
a=1.00000 15.00000 2.00000 0.50000
max(a)
ans=15
[val,ind]=max(a)
val=15 %最大值
ind=2 %该最大值的索引
a<3
ans=1 0 1 1; %判断a中是否小于3,小于3则记为1,否则记为0
find(a<3)
ans=1 3 4; %返回小于3的元素的索引
A=magic(3)
A=
8 1 6
3 5 7
4 9 2
[r,c]=find(A>=7) %大于等于7的行和列
r= %行
1
3
2
c= %列
1
2
3
数据绘制
t=[0:0.01:0.98];
y1=sin(2pi4t);
plot(t,y1); %绘制sin图象
y2=cos(2pi*4t);
hold on; %两个图象重叠,保持第一个图象不消失
plot(t,y2,‘r’); %r表示用红色显示cos图象
xlabel(‘time’); %x轴加上标签time
ylabel(‘value’); %y轴加上纵轴标签value
legend(‘sin’,‘cos’); %表示两条曲线内容
title(‘my plot’); %图象的顶部显示的标题
print -dpng ‘myPlot.png’; %将图象保存为一个文件
close; %关闭图象
subplot(1,2,1); 将图象分为1×2的格子,使用第一个格子
plot(t,y1);
subplot(1,2,2);
plot(t,y2);
axis([0.5 1 -1 1]); %设置X轴的范围为(0.5,1),Y轴的范围是(-1,1)
clf; %清除图象
A=magic(A)
imagesc(A); %可视化矩阵,不同颜色对应A矩阵中的不同值
imagesc(A),colorbar,colormap,colormap gray; %使用逗号连续调用函数
控制语句和函数
1、for语句
该几个语句的使用方式和c语言一样,不同的是大括号的功能是通过end实现的
>>for i=1:10,
v(i)=2^i;
end;
结果:
v=
2
4
8
16
32
64
128
256
512
1024
2、while语句
>>i=1;
>>while i<=5,
disp(v(i));
i=i+1;
end;
或者
>>i=1;
>>while true,
disp(v(i));
if i>5,
break;
end;
i=i+1;
end;
结果:
2
4
8
16
32
64
3、if语句
>>i=1;
>>while true,
v(i)=999;
i=i+1;
if i==6,
break; %当i到达6就用break中止while循环
end; %结束if
end; %结束while
结果:
999
999
999
999
999
64
128
256
512
1024
>>v(1)=2
>>if v(1)==1
disp('The value is one');
elseif v(1)==2
disp('The value is two');
else
disp('The value is not one or two');
end;
结果:
The value is two
4、函数
>>function y=squareNum(x)
y=x^2;
end;
>>squareNum(3)
ans=9
在Octave中,定义一个函数需要使用function 关键字,然后紧跟在 function 后面的是函数的声明,包括返回值,函数名称和参数,之后换行来实现具体的函数功能。
Octave的函数不需要显示的返回语句,Octave会将函数第一行声明的返回值返回给调用方,因此,我们在函数体中只需将最终的计算结果赋给定义的返回值,比如上面例子中的y。
还有一点需要说明的是,在Octave中,函数可以返回多个值:
>>function [y1,y2]=calVal(x)
y1=x^2;
y2=x^3;
end;
>>[a,b]=calVal(3)
a=9
b=9
也可以把函数写进文件中,然后加载实现函数。
进入octave后,cd到指定的目录下,这里我是把函数文件存在d盘下的文件中cd D:\app2018\octave
之后你可以用pwd打印出当前目录的路径看看是否是在该文件下。在该目录下新建一个文件名为“squareThisNumber.m”后缀是.m这样octave可以自动识别
注意:文件名要和函数名保持一致。
5、矢量
有道时候方程向量化,计算起来会更加高效。
A = [a1;a2;a3;…;an]
X = [x1;x2;x3;…xn]
例子:h(x) = a1x1 + a2x2 + a3x3 + …+ anxn = AX’(X的转置);
没有向量化之前可能会使用for循环的方式实现求和函数,但是转换成向量来做只需要一条语句就能实现;
p = A * X‘ ;
当对某个函数不清楚的时候,试试help {func name}
计算线性回归假设函数
1、octave实现
未向量化
prediction=0.0
for j=1:n+1,
prediction=prediction+theta(j)*x(j)
end;
向量化
prediction=thata'*x;
2、C++实现
未向量化
double prediction=0.0;
for(int j=0;j<=n;j++)
prediction+=theta[j]*x[j]
向量化
double prediction=theta.transpose()*x;