The assignments require the Octave or MATLAB scientific computing languages。
官方教程:https://cn.mathworks.com/support/learn-with-matlab-tutorials.html?s_tid=hp_learn_tutorials
MATLAB中常用方法:
行向量,和列向量的初始化
对向量的单个元素进行操作
对矩阵的每个元素进行操作
生成向量的转置
以 起始值:间隔值:结束值 的方式创建列向量,可以不写间隔值,默认是1
linspace(起始值,结束值,总共点的数量) 方式创建行向量
用向量画图,并设置颜色和标记
为图添加轴标签,标题,说明
创建 大矩阵,需要使用方法
rand,ones,eye,randi,randn,zeros,toeplitz,vander,diag,magic,hilb
获取矩阵的元素
>> M=[5,-2,3,1;0,1,2,3;8,-5,0,9;10,2,7,4]
M =
5 -2 3 1
0 1 2 3
8 -5 0 9
10 2 7 4
>> %获取第3行第2列的元素值
>> s1=M(3,2)
s1 =
-5
>> %获取第2行和第3行第2列的元素值
>> s2=M([2,3],2)
s2 =
1
-5
>> %获取第2行到第4行第2列的元素值
>> s2=M(2:4,2)
s2 =
1
-5
2
>> %获取第2列所有元素值
>> s4=M(:,2)
s4 =
-2
1
-5
2
length(matirx) 计算矩阵行或列数的最大值
size(matirx) 计算行数和列数
连接两个矩阵
关系运算符和逻辑运算符
Octave 是一种很好的原始语言(prototyping language),使用 Octave 你能快速地实现你的算法,如果你能让你的学习算法在 Octave 上快速的实现,基本的想法实现以后,再用 C++或者Java 去改写,这样你就能节省出大量的时间。
1. Basic Operation
异或运算 如 XOR ( 1, 0 ),其返回值为 1
如果你想分配一个变量,但不希望在屏幕上显示结果,你可以在命令后加一个分号,可以抑制打印输出,敲入回车后,不打印任何东西。
现在举一个字符串的例子:变量 b 等于”hi”。
设置 A 等于圆周率π
对于更复杂的屏幕输出,也可以用 DISP 命令显示:
也有一些控制输出长短格式的快捷命令:
V=1:0.1:2
集合 V 是一组值,从数值 1 开始,增量或说是步长为 0.1,直到增加到 2,按照这样的方法对向量 V 操作,可以得到一个行向量,这是一个 1 行 11 列的矩阵,其矩阵的元素是 1 1.1 1.2 1.3,依此类推,直到数值 2。
v=1:6
其他的方法来生成矩阵
如果,你知道什么是高斯随机变量,或者,你知道什么是正态分布的随机变量,你可以设置集合 W,使其等于一个一行三列的 N 矩阵,并且,来自三个值,一个平均值为 0 的高斯分布,方差或者等于 1 的标准偏差。
并用 hist 命令绘制直方图。
绘制单位矩阵:
如果对命令不清楚,建议用 help 命令:
2.Moving Data Around
size(A, 1),将返回 3,这个命令会返回 A 矩阵的第一个元素,A 矩阵的第一个维度的尺寸,也就是 A 矩阵的行数。
命令 size(A, 2),将返回 2,也就是 A 矩阵的列数。
如果你有一个向量 v,假如 v = [1 2 3 4],然后键入 length(v),这个命令将返回最大维度的大小,返回 4。
读入文件数据:
cd 到文件所在目录
load(‘featureX.dat’)
who 命令,能显示出 在我的 Octave 工作空间中的所有变量
whos 命令,能更详细地进行查看
如果你想删除某个变量,你可以使用 clear 命令,我们键入 clear featuresX
假如我们想把它存入硬盘,那么用
save hello.mat v
命令,这个命令会将变量 v 存成一个叫 hello.mat 的文件,这个命令把数据按照二进制形式储存,或者说是更压缩的二进制形式,因此,如果 v 是很大的数据,那么压缩幅度也更大,占用空间也更小。如果你想把数据存成一个人能看懂的形式,那么可以键入:
save hello.txt v -ascii
这样就会把数据存成一个文本文档,或者将数据的 ascii 码存成文本文档。
A(2,:) 来返回第二行的所有元素,冒号表示该行或该列的所有元素。
A(:,2),这将返回 A 矩阵第二列的所有元素
A([1 3],:),这个命令意思是取 A 矩阵第一个索引值为 1 或 3 的元素,也就是说我取的是 A 矩阵的第一行和第三行的每一列,冒号表示的是取这两行的每一列元素
依然是 A 矩阵,A(:,2) 命令返回第二列,我们还可以为它赋值,第二列就被替换为 10 11 12。
接下来一个操作,让我们把 A 设为 A = [A, [100; 101; 102]],这样做的结果是在原矩阵的右边附加了一个新的列矩阵,就是把 A 矩阵设置为原来的 A 矩阵再在右边附上一个新添加的列矩阵。
最后,还有一个小技巧,如果你就输入 A(:),这是一个很特别的语法结构,意思是把 A中的所有元素放入一个单独的列向量,这样我们就得到了一个 9×1 的向量,这些元素都是A 中的元素排列起来的。
C = [A B],这个意思就是把这两个矩阵直接连在一起
我还可以设 C = [A; B],上下排列
这个[A B]命令跟 [A, B] 是一样的,这两种写法的结果是相同的。
3.Computing On Data
两个矩阵的乘积,比如说 A × C,我只需键入 A×C,这是一个 3×2 矩阵乘以2×2 矩阵,得到这样一个 3×2 矩阵。
做点乘运算 A .*B,矩阵 A 中的每一个元素与矩阵 B 中的对应元素相乘
输入 A .^ 2,这将对矩阵 A 中每一个元素平方
同样:1 ./ A 得到 A 中每一个元素的倒数
进行求对数运算,也就是对每个元素进行求对数运算
自然数 e 的幂次运算,就是以 e 为底,以这些元素为幂的运算
abs 来对 v 的每一个元素求绝对值
直接用 -v ,其实就等于 -1*v
v 中的每个元素都加 1,ones(length(v) ,1) 就相当于ones(3,1),然后我做的是 v + ones(3,1)
另一种更简单的方法是直接用 v+1,v + 1 也就等于把 v 中的每一个元素都加上 1
A 的转置矩阵, A’, (A’)’ A 转置两次,那么我又重新得到矩阵 A
a=[1 15 2 0.5],这是一个 1 行 4 列矩阵, val=max(a),这将返回 A 矩阵中的最大值 15。
[val, ind] = max(a),这将返回 a 矩阵中的最大值存入 val,以及该值对应的索引,元素 15 对应的索引值为 2 存入 ind,所以 ind 等于 2
命令 max(A), 返回A矩阵每一列的最大值
如果你想要找出整个矩阵 A 的最大值,你可以输入max(max(A))
或者你可以将 A 矩阵转成一个向量,然后键入 max(A(:)),这样做就是把 A 当做一个向量,并返回 A 向量中的最大值。
max(A,B) ,表示取A,B两个矩阵每个位置上的最大值,组成一个维度相同的矩阵
max(A,[],1),这样做会得到每一列的最大值,1表示取矩阵的第一个维度即列
max(A,[],2),这样做会得到每一行的最大值,2表示取矩阵的第二个维度即行
a 矩阵 a=[1 15 2 0.5],如果输入 a<3,这将进行逐元素的运算,所以元素小于 3 的返回 1,否则返回 0。
如果我写 find(a<3),这将告诉我 a 中的哪些列元素是小于 3 的
A = magic(3),magic 函数将返回一个矩阵,称为魔方阵或幻方 (magic squares),它们具有以下这样的数学性质:它们所有的行和列和对角线加起来都等于相同的值。
[r,c] = find( A>=7 ),这将找出所有 A 矩阵中大于等于 7 的元素,因此,r 和c 分别表示行和列,这就表示,第一行第一列的元素大于等于 7,第三行第二列的元素大于等于 7,第二行第三列的元素大于等于 7。
sum(a),就把 a 中所有元素加起来了
prod(a),prod 意思是 product(乘积),它将返回这四个元素的乘积
floor(a) 是向下四舍五入,因此对于 a 中的元素 0.5 将被下舍入变成 0。
ceil(a),表示向上四舍五入,所以 0.5 将上舍入变为最接近的整数,也就是 1。
a =
1.0000 15.0000 2.0000 0.5000
>> sum(a)
ans =
18.5000
>> prod(a)
ans =
15
>> floor(a)
ans =
1 15 2 0
>> ceil(a)
ans =
1 15 2 1
sum(A,1),得到矩阵A每一列的总和,组成的行向量
sum(A,2),得到矩阵A每一行的总和,组成的列向量
sum(sum(A.*eye(3)),得到矩阵A的对角线的和
>> A=magic(3)
A =
8 1 6
3 5 7
4 9 2
>> sum(A,1)
ans =
15 15 15
>> sum(A,2)
ans =
15
15
15
>> sum(sum(A.*eye(3)))
ans =
15
>>
pinv(A),矩阵 A 求逆,伪逆矩阵
flipud 表示向上/向下翻转。
>> flipud(eye(9))
ans =
0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
4.Plotting Data
正弦函数
plot(t, y1)
>> plot(t,y1)
>> hold on
>> plot(t,y2);
>> plot(t,y2,'r');%r表示使用的颜色
>> plot(t,y2,'g');%r表示使用的颜色
>> xlabel('time');%标记X轴
>> ylabel('value');%标记Y轴
>> legend('sin','cos')%添加图例
>> title('myplot')%添加标题
>> print('myplot.png','-dpng')%将图保存成png格式的文件
>> close %关闭图形窗口
Octave 也可以让你为图像标号:
figure(1); plot(t, y1);将显示第一张图,绘制了变量 t y1。
figure(2); plot(t, y2); 将显示第一张图,绘制了变量 t y2。
>> subplot(1,2,1)%将图像分为一个 1*2 的格子,使用第一个格子
>> plot(t,y1);
>> subplot(1,2,2)%使用第二个格子
>> plot(t,y2);
axis([0.5 1 -1 1])
设置 x 轴和 y 轴的范围,它将图中的横轴的范围调整至 0.5到 1,竖轴的范围为-1 到 1。
clf
清除一幅图像
>> A=magic(5)
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
>> imagesc(A)%可视化矩阵,不同的颜色对应 A 矩阵中的不同值
>> imagesc(magic(15)),colorbar,colormap gray
实际运行了三个命令,生成了一个颜色图像,一个灰度分布图,并在右边也加入一个颜色条。所以这个颜色条显示不同深浅的颜色所对应的值。
逗号可以连接多个命令或函数调用。
5.控制语句(Control Statements)
>> v=zeros(10,1) %将 v 值设为一个 10 行 1 列的零向量
v =
0
0
0
0
0
0
0
0
0
0
>> for i=1:10, %循环 让 i 等于 1 到 10
v(i)=2^i;
end;
>> v
v =
2
4
8
16
32
64
128
256
512
1024
>> indices=1:10 %设置索引等于1一直到10
indices =
1 2 3 4 5 6 7 8 9 10
>> for i=indices,
disp(i);
end;
1
2
3
4
5
6
7
8
9
10
Octave 里也有 “break” 和 “continue”语句,你也可以在 Octave 环境里使用那些循环语句。
>> while i<=5,
v(i)=100;
i=i+1;
end;
>> v
v =
100
100
100
100
100
64
128
256
512
1024
>> i=1;
>> while true,
v(i)=999;
i=i+1;
if i==6,
break;
end;
end;
>> 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
如何定义和调用函数:
创建squareThisNumber.m 文件,写入函数体
function y=squareThisNumber(x)
y=x^2;
在MATLAB中将工作区间,cd 到squareThisNumber.m 文件所在文件夹,即可调用函数:
也可以增加环境路径
addpath(‘C:\Users\zxm\Desktop\MATLAB测试’)
>>squareThisNumber(2)
ans =
4
定义函数function J=costFunctionJ(X,y,theta) 来计算代价函数的值,模型为y= θ0+θ1x
X位训练数据组成的矩阵,y为数据对应的标签
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 X的行数
predictions=X*theta; %predictions of hypothesis on all m examples
sqrErrors=(predictions-y).^2; %squared errors
J=1/(2*m)*sum(sqrErrors);
X =
1 1
1 2
1 3
y =
1
2
3
theta =
0
1
>> costFunctionJ(X,y,theta)
ans =
0
设置 θ0=0,θ1=1 ,模型为y=x,测试数据完全拟合,所以代价函数值为0
6.向量化(Vectorization)
对于一些问题,如果能用合适的向量化方法来实现,就会简单许多:
如,这是一个常见的线性回归假设函数:
hθ(x)=∑j=1nθjxj
未向量化的代码实现方式:
function prediction=summatrix(n,theta,x)
prediction=0.0;
for j=1:n,
prediction=prediction+theta(j)*x(j);
end;
theta =
1
2
3
>> x=[1;2;3]
x =
1
2
3
>> summatrix(3,theta,x)
ans =
14
向量化的实现只需要将 hθ(x) 看作 θTx :
>> prediction=theta'*x
prediction =
14