Octave笔记


------参考课程 吴恩达机器学习

基本语法

运算符号

%       表示注释
==      逻辑等于
~=      逻辑不等于
&&      逻辑与
||      逻辑或
1/0/xor(1,0)逻辑异或
a = 4   %在命令行中直接回车,则出a = 4,如果写在脚本中需要在该语句中加入分号

变量表示

a = pi %表示的是将圆周率赋值给a 
PS1('>>'); %表示的是Octave的提示改为 >>
disp(a) %这样输出的也是3.1416
disp(sprintf('2 decimals:%0.2f',a)) %sprintf()生成一个字符串
>>format long  %让字符串显示更长的位数
>>a
a = 3.141592653589793
>>format short %让字符串显示较短的位数
>>a
a = 3.1416

矩阵表示

A = [1 2;3 4;5 6] %空格分割开每行的元素,分号换行
v = 1:0.1:2 %定义一组数值v,从1到2,步长为0.1
v = 1:6;
ones(2,3)  %输出一个两行三列的纯1矩阵
zeros(1,3) %输出一个一行三列的纯0矩阵
eye(4)     %输出一个4*4的单位矩阵
w = randn(1,3)%得到3个随机数字,但它们服从正态分布,均值为0,标准差和方差都为1
w = -6 + sqrt(10)*(randn(1,1000)); %设计一个更大的服从正态分布的一组数
hist(w,50)	%将这组数用直方图画出来,50表示柱子的条数,可以不写,运行结果如下:

符合正态分布的图像

size(A)  %输出矩阵A的大小
ans = 3 2
size(A,1) %矩阵A第一维度的大小,也就是矩阵A的行数
v = [1 2 3 4 5]
v =1   2   3   4   5
length(v)		%表示矩阵最大维度的大小,为防止误解,我们经常只对向量使用length()函数,即向量中元素的个数
%----------矩阵中的一些命令表示----------
pwd     %显示当前文件路径
cd      %切换当前文件路径
ls      %显示当前文件目录下的文件名称
clear   %清除内存中的所有的变量,而命令clear a表示只清除变量a
who     %显示当前内存中存在的所有的变量
whos    %显示所有变量及其属性
load test.dat %加载文件,等价于load('test.dat');
ex = [1 2 3 4 5 6 7 8 9]
v1 = ex(2:9) %选取ex中索引从2到9的元素赋值给v,按照列进行排序
v2 = ex(:)
save hello.mat v %将变量v的数据保存到硬盘中,文件名称为hello.mat
save hello.mat v ascii %将文件编码设置为ascii
clear v
load hello.mat  %当再次载入hello.mat文件时,你会发现内存中多了个变量v,它就是原先在保存hello.mat文件时的变量v

矩阵索引

A = [1 2;3 4;5 6]
A(3,2)  %输出A中第三行第二列的数值
A(2,:)  %矩阵A第2行的所有数据
A(:,2) = [10;11;12] %take the second column of A and assign that to 10, 11, 12
A = [A,[100;101;102]]; %append another column vector to right
size A %求A矩阵有几行几列
A[:]  %put all elements with A into a single column vector

矩阵操作

%--------%
A = [1 2;3 4;5 6]; 
B = [10 11;12 13; 14 15];
C = [A B] %means taking these two matrices and just concatenating onto each other (just like left right)
C = [A; B]%The semicolon notation(分号) means that I go put the next thing at the bottom.
A = [1 2;3 4;5 6];
B = [11 12;13 14;15 16];
C = [1 1;2 2];
A * C %表示两个矩阵相乘
A .* B %表示两个矩阵对应位置相乘
A .^ 2 %表示矩阵的每一元素都平方
1 ./ A %表示对A中的每一元素都取倒数
%可以看出.是对矩阵中元素进行直接运算
log(A) %取A中每个元素的log
exp(A) %取A中每个元素的e^(A中的元素)
abs(A) %取A中每个元素的绝对值
-A %相当于是-1 * A  即将A每个元素都取负值
A + ones(length(A),1) %将A中的每一元素都加1
A' %表示为A的转置矩阵
a = [1 15 2 0.5];
val = max(a); %输出是15
[val,ind] = max(a) %返回的是val = 15 ind = 2 此处的ind是索引的意思
max(A)  %返回的是A中的最大行
a < 3   %返回的是对应每一个元素比较后 是否满足小于3 满足则为1 不满足则为0 ans = 1 0 1 1
find(a < 3) %返回的ans = 1 3 4也就是a中满足条件元素的索引下标
%-------------------------------------------%
D = magic(3)	%生成一个幻方矩阵D,每行、每列、每条对角线的元素之和都相等
[hang, lie] = find(D >= 7)	%通过find函数找到矩阵D中大于等于7的所有元素的行列索引
a = [1 15 2 0.5]		%定义一个向量a
sum(a)	    %a中元素之和
prod(a)	    %a中元素之积
floor(a)	%向下取整
ceil(a)  	%向上取整
flipud(A)	%上下翻转
pinv(A)		%求A矩阵的逆矩阵,即使A不可逆,所以这里是伪逆
rand(3)     %生成一个3 * 3的随机矩阵
x = rand(3)
max(x,[],1) %取第一维度中x个元素的最大值,也就是每列元素的最大值
max(x,[],2) %取每行元素中的最大值
max(max(x)) %取x中的最大值
max(x(:))   %同上,此处x(:)的含义是将x转变为一个单维度的向量
A = magic(9)%A为一个9 * 9的幻方矩阵,其对角线还有每一行和每一列的加和均为同一个数,为此进行如下验证
sum(A,1)    %求A中每一列的元素之和
sum(A,2)    %求A中每一行的元素之和
A.*eye(9)   %生成一个只有A对角线元素的矩阵
A.*flipud(eye(A)) %生成副对角线元素的矩阵
sum(sum(A.*eye(9)))%结果为369同每一行和每一列的元素之和
sum(sum(A.*flipud(eye(9))))

可视化图像

t = [0:0.01:0.98];
y1 = sin(2 * pi * 4 * t); %y1为正弦函数
y2 = cos(2 * pi * 4 * t); %y2为余弦函数
plot(t,y1);
plot(t,y2);
%如果想让上述两个图放在一块进行绘制则需要
plot(t,y1);
hold on;
plot(t,y2,'r');%'r'表示的是绘制的线条的颜色
xlabel('time');%将x轴的名称更改为time
ylabel('value');%将Y轴的名称更改为value
legend('sin','cos');%增加标签,标注每条线所表示的对象
title('my plot');%更改图片描述为my plot
hold off; %同hold on对应
cd 'E:\postgraduate\Octave-8.2.0\currentworkplace';print -dpng 'myplot.png'%保存图片
close %用于关闭图片的展示
%结果如下所示

请添加图片描述

%如果想要展示出来两张图片,可以用如下的处理方式
figure(1);plot(t,y1);
figure(2):plot(t,y2);
%如果想要在一个图片中显示两个图
subplot(1,2,1); %Divides plot a 1*2 grid,access first element
plot(t,y1);
subplot(1,2,2);
plot(t,y2);
axis([0.5 1 -1 1]) %更改x y轴的比例,也就是x和y的范围
clf %表示清屏--清除图片上的曲线
A = magic(5);
imagesc(A)
imagesc(A),colorbar,colormap gray;

imagesc(A)
imagesc(A),colorbar,colormap gray;

>>a = 1,b = 2,c = 3  %此处的逗号连接,相当于函数调用时候的逗号连接,此处会进行打印
a = 1
b = 2
c = 3
>>a = 1;b = 2;c = 3;  %分号则不同,不能进行打印

控制语句编写

>>v = zeros(10,1);
%------for循环
>>for i = 1:10,
>v(i) = 2^i;
>end;
%另一种写法
indices = 1:10;
>>for i = indices,
>disp(i);
>end;
%输出 1 2 3 4 5 6 7 8 9 10
%----while语句
i = 1;
>>while i <= 5,
>v(i) = 100;
>i = i + 1;
>end;
%-----%
i = 1;
>>while true,
>   v(i) = 999;
>   i = i + 1;
>   if i == 6,
>       break;
>   end;
>end;
%-----if-else的用法
v(1) = 2;
>>if v(i) == 1,
>	disp('The value is one.');
>elseif v(i) == 2,
>	disp('The value is two.');
>else
>	disp(The value is not one or two.');
>end;
%退出软件
quit or 'q'
%函数的用法
%1、首先在当前工作目录下创建一个.m文件
%2、函数名即为文件名
%3、编写函数体,如下为一个平方函数
squareThisNumber.m
%%文件中的内容如下
	function y = squareThisNumber(x)
	y = x^2;
%调用即为
>>squareThisNumber(5)
ans = 25;
%如果你在其他的路径下,仍然想调用上述路径中函数对象,于是可以
addpath('函数文件所在的文件目录'); %Octave search path (advanced/optional)
cd 'C:\' %转移到其他路径后
>>squareThisNumber(5%调用仍然有效
ans = 25
%Octave可以返回多个值
%如定义如下函数
function [y1,y2] =  SquareAndCubeThisnumber(x)
	y1 = x^2;
	y2 = x^3;
%调用
>>[a ,b] = SquareAndCubeThisnumber(4)
a = 16
b = 64
%---实际应用
x = [1 1;1 2;1 3]
y = [1;2;3]
theta = [0;1]
%调用的函数体为
function J = costFunction(x, y,theta)
	%x is the "design matrix" containing our training examples.
	%y is the class labels
	m = size(x,1);   %number of training examles
	predictions = x * theta; %predictions of hypothesis on all m examples
	sqrErrors = (predictions - y).^2;  %square errors
	J = 1/(2*m) * sum(sqrErrors);
endfunction
%函数调用
>>j = costFunction(x,y,theta)
j = 0
%if theta changes,for example theta equals [0;0],J will equal 2.33333
>>theta = [0;0];
>>j = costFunction(x,y,theta);
j = 2.33333

矢量化

example

%Vectorization example
%C++写法 Unvectorized implementation
double prediction = 0.0;
for(int j = 0;j <= n;j++)
	prediction += theta[j] * x[j];
%C++写法 Vectorized implementation
double prediction
	= theta.transpose() * x;
%Octave写法 Unvectorized implementation
prediction = 0.0;
for j = 1:n+1,
	prediction = prediction +
				 theta(j) * x(j)
end;
%Octave写法 Vectorized implementation
prediction = theta' * x;

cost function

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值