1.正常的算术运算
1*2
1+2
5/6
2.正常的逻辑判断
1==2
1~=2
1&&0
xor(1,0)
1||0
Note: false : 0 true : 1
3.格式
format long %长格式输出
format short %短格式输出
tips:
1.如果运行一条语句后不想打印结果就在结尾加上';' 即 a=3 will print a=3
but if a=3; will print nothing.
2.字符串不是""而是example: b='hi';
3.eg: a=pi;
disp(a);
将打印3.1416
disp(sprintf('2 decimals:%0.2f',a));
将打印
2 decimals:3.14
4.向量和矩阵
A = [1 2; 3 4; 5 6]
行向量 v = [1 2 3]
列向量 v = [1; 2; 3]
v = 1:0.1:2
将创建行向量 1.0000 1.1000 ... 2.0000,1行11列
v = 1:6
1 2 3 4 5 6
ones(2,3) %2行3列全1阵
c = 2*ones(2,3) %全2阵
zeros(1,3) %全0阵
rand(3,3) %0-1的随机数矩阵
randn %高斯随机
hist(w) %将w以直方图形式展现
eye(3) %谐音取自I 单位矩阵 3*3 不懂可以help eye
5.移动数据
size(A) %返回3 2,即一个1行2列的结果,代表A的大小:3行2列
size(A,1) %返回行数
size(A,2) %返回列数
length(A) %返回最大维度的大小
v = [1 2 3 4]
length(v) = 4
pwd/cd/ls 在octave中也可以正常使用
桌面上有featuresX.dat和pricesY.dat
想读进来
load featuresX.dat 或 load('pricesY.dat')
who %显示出当前octave路径中储存的变量
whos %显示得更详细
clear featuresX 可以删掉featuresX变量
clear 全删
v = pricesY(1:10) %前10个取出
保存:save hello.mat v;
save hello.txt v -ascii %save as text(ASCII)
取矩阵中某个值
A = [1 2; 3 4; 5 6]
A(3,2) = 6
A(2,:) %取2行所有元素 ':'取所有
A([1 3],:) %1行和3行所有列取出
A想加1列 A=[A,[100; 101; 102]]
A中所有元素导出成一个列向量 A(:)
6.Octave中的运算
A = [1 2; 3 4; 5 6]
C = [1 1; 2 2]
A*C %得到矩阵乘法的结果
B = [11 23; 42 56; 32 10]
A .* B %每个元素对应相乘 '.'一般表示元素位运算
A .^ 2 %每个元素取平方运算
1 ./ A %除法也可
v 如果是个向量 v = [1; 2; 3]
log(v) 每个向量取log exp(v) e指数运算
abs(v)取绝对值
想将v中每个元素+1
v + ones(length(v),1) 或 v+1
转置A'
a = [1 15 2 0.5]
val = max(a) %val = 15
[val ind] = max(a) % val = 15 ind =2索引值
如果A = [1 2; 3 4; 5 6]
max(A)是对它的每一列求最大值
如果a<3 将对它的每个元素<运算 => [1 0 1 1]
如果find(a<3)将索引值输出 => [1 3 4]
A = magic(3) 得到3*3的魔方矩阵(对角线,行,列的和一样)
[r c] = find(A>=7) r为行 c为列
sum(a)求和
prod(a)乘积
floor(a) a中元素向下取整
ceil(a) 向上取整
max(rand(3),rand(3)) 两个rand(3)逐个元素比较取最大值
max(A,[],1) %得A每列最大值 和max(A)等价
max(A,[],2) %得A每一行最大值
想得到A中最大值max(max(A)) 或 max(A(:))
eye(9)
想要另一个对角线全1
fliplr/flipud表示向上/向下翻转
A = magic(3)
pinv(A) 求逆矩阵(伪)
7.Octave Plotting Data
t = [0:0.01:0.98]
y1=sin(2*pi*4*t)
plot(t,y1)
y2=cos(2*pi*4*t)
plot(t,y2)
但是将替换原有图
若想两个同时显示plot(t,y1);hold on;plot(t,y2,'r');
如果想标记横/纵坐标用xlabel('time') ylabel('value')
legend('sin','cos') %将出现这两条线的说明
title('my plot')
如果想保存这个图
print -dpng 'myPlot.png'
close %关闭图像
如果想显示两个窗口两个图 figure(1); plot(t,y1); figure(2); plot(t,y2);
如果一个窗口显示两个窗口图内容
subplot(1,2,1); plot(t,y1); %1*2窗口,用1窗口显示
改变(缩放)横纵轴
axis([0.5 1 -1 1]) %0.5-1横轴范围 -1 - 1纵轴范围
clf; %清除一个图像(窗口)
如果你是一个矩阵 A=magic(5);
imagesc(A) %用5*5的彩色图表示矩阵
imagesc(A), colorbar, colormap gray; %同时运行了三个命令
8.Octave 过程
for, while, if
v = [1 2 3 4 5 6 7 8 9 10];
for i=1:10
v(i) = 2^i;
end
break和continue也正常使用
if 和 while最后也需要有end作为结果
9.Octave的向量化
有时候你研究一个算法,有循环,但如果你用好线性向量库,会提高很多效率,比如
求theta(j)*x(j) j=0...n
我们可以把theta和x分别看成一个n+1维向量,向量的乘法即是循环
10.Octave中的优化算法
在选择算法时,会有优于梯度下降法以供选择,如Conjugate gradient, BFGS, L-BFGS. Octave会自动选择其中之一运行(一般远优于梯度下降法)
需要做的仅仅是
function [jVal, gradient] = costFunction(theta)
jVal = [...code to compute J(theta)..];
gradient = [...code to compute derivative of J(theta)];
end
然后使用
options = optimset('GradObj', 'on', 'MaxIter', 100);
initialTheta = zeros(2,1);
[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);
11.矩阵组合与恢复
当使用BP算法是需要对theta多维向量进行组合,并在求costFunction的时候进行恢复,因而需要对矩阵进行组合和恢复操作。
Theta1 = ones(10,11);
Theta2 = 2*ones(10,11);
Theta3 = 3*ones(10,11);
initialTheta = [ Theta1(:); Theta2(:); Theta3(:) ];
当进入costFunction后
Theta1 = reshape(initialTheta(1:110), 10, 11);
Theta2 = reshape(initialTheta(111:220), 10, 11);
Theta3 = reshape(initialTheta(221:330), 10, 11);