5.Octave使用

Octave

1. 基本操作

1. 数学运算,逻辑运算

2. 注释

% 这是注释

3. 分号

一个语句的后面加上分号,则不会再次打印该语句(或赋予的值)

4. 输出

  1. disp(a)

  2. disp(sprintf('2 decimals: %0.2f ', a))

5. 矩阵

分号分隔:

A = [1 2; 3 4; 5 6]
A = [1 2;
3 4;
5 6]

v = [1 2 3]
v = [1; 2; 3]

步长:

v = 1:0.1:2   % 以1开始,步长为0.1, 2结束的一组数
v = 1:10      % 以1开始,步长为1, 2结束的一组数

函数:

ones(2,3)              % 2×3 全是1的矩阵
C = 2 * ones(2, 3)     % 2×3 全是2的矩阵
w = zeros(1, 3)        % 1×3 全是0的矩阵

w = rand(1, 3)         % 1×3 由0~1的随机值组成的矩阵

w = randn(1, 3)         % 1×3 服从高斯分布的值组成的矩阵

w = -6 + sqrt(10)*(randn(1, 100000))
hist(w)``% 绘制直方图
hist(w, 50)

单位矩阵:

eye(6)

帮助函数:

help 函数名

q 退出

2. 移动数据

如果有一些机器学习问题的数据,如何把这些数据加载到Octave中, 如何把数据存入矩阵, 如何对矩阵进行操作,如何保存计算结果?

>> A = [1 2; 3 4; 5 6]
A =

   1   2
   3   4
   5   6

>> size(A)  % 返回矩阵A的大小, 其实size函数返回的是一个 1×2 矩阵
ans =

   3   2
>> sz = size(A);
>> sz
sz =

   3   2

>> size(sz)
ans =

   1   2
ݣ>> size(A, 1)   % 返回A矩阵的第一维度大小,即A矩阵的行数
ans = 3


>> v = [1, 2, 3, 4];  % this is a vector
>> length(v)  % 返回v最大维度的大小
ans = 4
>>

1. 文件系统中加载和查找数据

% load 文件名
% load ('文件名')
% 将数据载入Octave中
load ex1data1.txt

% who  查看当前Octave中的变量
% who  查看当前Octave中的变量, 能够显示变量的信息

% 删除变量
clear(ex1data1)
clear  % 删除工作空间中的所有变量

% 存储数据
v = ex1data1(1:10)  % 将矩阵ex1data1第一列的前10个元素存入v中

% 将数据存储到硬盘中
save hello.mat v;   % 存储为二进制的形式

save hello.txt -ascii   % 存储为文本文档

2. 操作数据

A = [1 2; 3 4; 5 6;]
% 索引
A(3, 2)    % 对应第三行第二列的元素
A(2, :)	   % 对应第二行的所有元素,冒号表示行或列的所有元素
A([1 3], :)   % 对应第一行和第三行的所有元素

A(:, 2) = [10; 11; 12]   % 对A的第二列重新赋值
A = [A,[100; 101; 102]]  % 在A的右边重新加上一列

A(:)    % 把A的所有元素放入一个单独的列向量


3. 计算数据

>> A=[1 2;3 4;5 6];
>> B=[11 12; 13 14; 15 16];
>> C = [1 1; 2 2];
>> A * C     % 两个矩阵相乘
ans =

    5    5
   11   11
   17   17

>> A .* B    % 两个矩阵对应元素相乘, . 告诉我们这是针对元素的运算
ans =

   11   24
   39   56
   75   96
   
>> A .^ 2    % A 中的每个元素乘方
ans =

    1    4
    9   16
   25   36

>> v = [1; 2; 3];      
>> 1 ./ v    % v中的每个元素取倒数
ans =

   1.0000
   0.5000
   0.3333

>> log(v)    % v中的每个元素进行对数运算
ans =

        0
   0.6931
   1.0986

>> exp(v)    % 以e为底,以v中元素为指数进行幂运算
ans =

    2.7183
    7.3891
   20.0855

>> abs(v)    % v中所有元素的绝对值
ans =

   1
   2
   3

>> -v        % 相当于 -1 * v

% 将v中的每个元素加1
% 方法一:构造一个3×1的每个元素都是1的矩阵y, 将v与y相加
>> v + ones(length(v),1)
ans =

   2
   3
   4

% 方法二: 直接 v+1
>> v = [1;2;3];
>> v +1
ans =

   2
   3
   4

>> A'    % 矩阵转置
ans =

   1   3   5
   2   4   6

>>

常用函数

a = [12 13 14 15]

% max
val = max(a);    % 获取a中的最大元素, 刺死a必须是向量
[val, ind] = max(a);  % 获取a中的最大元素, 赋值给val, 并将最大元素的索引赋值给ind	

% 比较和find
val = a < 3;     % 将a中的每个元素与3比较,根据比较结果返回真假
ind = find(a<3); % 找到a中所有满足小于3的元素,并返回他们的索引


% magic  返回名为幻方的矩阵
% 幻方的数学性质:它任意行、列、对角线上的元素加起来等于相同的值
A = magic(3)        % 生成3×3的幻方矩阵
[r,c] = find(A>=7)  % 找到A中所有满足大于等于7的元素,并返回他们的索引,其中r存储这些元素的行索引,					  % c存储这些元素的列索引

% 求和函数
sum(a)    % 返回a中所有元素的和
prod(a)   % 返回a中所有元素的乘积
floor(a)  % 向下取整
ceil(a)   % 向上取整


% rand
rand(3)   % 返回一个3×3的随机矩阵

max(A, [], 1)  % 返回A中每一列的最大值, 1表示从A的第一维度取值
max(A, [], 2)  % 返回A中每一行的最大值, 2表示从A的第二维度取值
max(A)         % max默认求每列的最大值

% 求矩阵A的最大值
max(max(A))
max(A(:))

A = magic(9)
sum(A,1)	% 得到每一列的总和
sum(A,2)    % 得到每一行的总和
% 获取对角线的和
eye(9)      % 构造单位矩阵
A .* eye(9) % 将A中的元素与9×9单位矩阵的元素对应相乘
sum(sum(A .* eye(9)))  % 获得A对角线元素的和
% 获取反对角线的和
flipud(eye(9))  % flipud 表示将矩阵垂直翻转
sum(sum(A .* flipud(eye(9)) ))  % 获得A反对角线元素的和


A = magic(3)
pinv(A)   % 求A的逆矩阵

4. 数据绘制

plot(t, y1);		# t 横轴,y1纵轴

hold on;			# 在旧的图像上绘制新的图像
plot(t, y2, 'r');	# r代表颜色
xlabel('time')    	# 横轴标签
ylabel('value')		# 纵轴标签
legend('sin', 'cos'); # 标记绘制的图像
title('为图像命名')
cd 'C:\Users\Yang\Desktop':print -dpng 'MyPlot.png' # 将绘制的图像保存

close				# 关闭图片

figure(1);plot(t, y1)	# 绘制第一个图像

subplot(1,2,1)		# 将图像分成 1*2 的格子(前两个参数的含义), 使用第一个格子(第三个参数的含义)
plot(t, y1);

# 改变坐标轴的刻度
axis([0.5 1 -1 1])	# 前两个参数改变横坐标的范围, 后两个参数改变纵坐标的范围

clf					# 清除图像

# 可视化矩阵
A = magic(5)		# A为5*5矩阵
imagesc(A)			# 将矩阵绘制成 5*5的彩色方格图,不同的颜色对应A矩阵中的不同值

imagesc(A), colorbar, colormap grey;	# 灰度分布的矩阵图像

5. for while if

v = zeros(10,1)
for i=1:10,
	v(i) = 2^i;
end;

indices = 1:10;
for i = indices,
	disp(i);
end;

# break continue

# while
i = 1;
while i<=5,
	v(i) = 100*i;
	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(1) == 1,
	disp('It is 1');
elseif v(1) == 2,
	disp('It is 2');
else
	disp('It is not 1 or 2');
end;

6. 定义和调用函数

创建一个文件,并在文件中定义函数,并且将文件命名为 函数名.m, 如area.m

再在Octave中调用定义的函数 area

需要注意的是,需要先把工作路径切换到定义函数的文件所在的路径下,然后再调用定义的函数

area.m

function y = area(x);
y = x^2;

Octave调用:

cd C:\Users\Yang\Desktop
a = area(2);
a

Octave一个函数可以返回多个值

area2.m

function [y1,y2] = area(x);
y1 = x^2;
y2 = x^3;

Octave调用:

cd C:\Users\Yang\Desktop
[a,b] = area2(2);
a
b

更复杂的函数:

定义一个Octave函数计算代价函数\(J(\theta)\) 不同 \(\theta\) 值所对应的代价函数 \(J\)

costFunctionJ.m

function J = costFunctionJ(X,y,theta)

% X is the "design matrix"containing our training examples.
% y is the class labels 

m size(X, 1);  					% number of training examples 
predictions = X*theta;			% predictions of hypothesis on all m examples 
sqrErrors =(predictions-y)^2;	%squared errors 

J = 1/(2*m)*sum(sqrErrors);

Octave 调用

X = [1 1; 1 2; 1 3];
y = [1; 2; 3];
theta = [0; 1];
J = costFunctionJ(X, y, theta);

7. 向量化实现

梯度下降:

\[\frac{1}{m}\sum_{i=0}^n(h_\theta(x^{(i)})-y^{(i)})x^{(i)} \]

posted @ 2022-07-23 17:07  cloudinwind  阅读(505)  评论(0编辑  收藏  举报