本课程有编程做业,编程做业须要使用Matlab或Octave,本文章使用Octave。下载地址:http://www.gnu.org/software/octave/#install。安装完成后,打开GNU Octave (GUI)开始写代码。编程
值得注意的是Octave使用“^”符号表示次幂,而不是向其余语言同样表示异或,而异或运算使用xor()函数。而且不等于使用“~=”而不是“!=”。函数
% 基本运算 5 + 6 3 - 2 5 * 8 1 / 2 % 0.5 2 ^ 6 % 2的6次方 1 == 2 % false,返回0 1 ~= 2 % 1不等于2,true,返回1 1 && 0 % AND 1 || 0 % OR xor(1, 0) % 异或 PS1('>> ') % 修改提示符
注意:当Octave变量声明语句后面不带分号(“;”)时,Octave会打印该变量,故不须要打印的务必加分号。spa
disp方法也能够用于打印,该方法支持较复杂打印,能够组合字符串和数字。如 disp(sprintf('2 decimals: %0.2f', a));。3d
% 变量 a = 3; % 数字变量,double。加分号不打印出来 b = 'hi'; % 字符串变量 c = (3 >= 1); % 返回1 a = pi; % 打印 disp(a); disp(sprintf('2 decimals: %0.2f', a));% C风格 disp(sprintf('6 decimals: %0.6f', a)); % 显示长变量 format long % 打印小数点后15位 a % 显示短变量 format short % 打印小数点后四位 a
format long打印小数点后15位数字(注意是总共打印15位,而不是最后15位的意思),format short打印小数点后4位数字。orm
通常用大写字母表示矩阵,例如A、B、X等;用小写字母表示向量,例如v、w。blog
% 矩阵和向量 A = [1 2; 3 4; 5 6] % 3×2矩阵 v = [1 2 3] % 1×3向量 v = [1; 2; 3] % 3×1向量 v = 1: 0.1: 2 % 1到2,步长为0.1 v = 1: 6 ones(2, 3) % 生成一个2×3且所有元素为1的矩阵 C = 2 * ones(2, 3) % 矩阵和数 数乘运算 w = zeros(1, 3) % 1×3向量且所有元素为0 w = rand(1, 3) % 1×3的随机矩阵,数据大小在0-1之间 rand(3, 3) % 3×3随机矩阵 w = randn(1, 3) % 高斯随机变量? w = -6 + sqrt(10) * (randn(1, 10000)); % 绘制直方图 %hist(w); hist(w, 50) eye(5) % 生成5×5的单位矩阵(对角线元素为1,其他全为0)
注意到声明矩阵的每一行时,用空格分隔每一个元素,其实使用逗号也是能够的。语句v = 1:0.1:2代表按照步长0.1生成一个行向量,元素为[1 1.1 1.2 ....... 2]。语句v = 1:6的步长为1,不指定步长默认为1,生成[1 2 3 4 5 6]向量。图片
A = [1 2; 3 4; 5 6] sz = size(A) % 返回[3 2],分别表示行数和列数 size(A, 1) % 返回行数 size(A, 2) % 返回列数 % 返回长度4,length函数返回最大维度的大小 % 若矩阵为10×1,则长度为10。一般对向量使用length函数 v = [1 2 3 4] length(v)
使用size函数可求得矩阵的行数与列数,使用size(A,1)取得行数,使用size(A, 2)取得列数。ip
length函数会返回长度最长的长度,如length(A)返回3,一般对向量使用length函数。ci
pwd % 查看当前所在目录 % cd 'path' % 改变当前目录 ls % 列出当前全部文件 clc % 清空控制台输出 who % 查看工做空间全部变量 whos % 查看工做空间全部变量的细节 % clear data % 清空(删除)data变量 % clear % 清空全部变量 load hello.txt % 加载数据并赋值,注意:这样加载不能赋值到变量中 data = load('hello.txt') % 也能够这样加载 save hello.mat v % 将变量v存入hello.mat文件中
一些命令的运行结果以下:字符串
A(3, 2) % 取第3行第2列的数据 A(3, 2) = 10 % 将第3行第2列赋值为10 A(2, :) % 取出第2行数据, :表示某一行或某一列的全部数据 A(:, 2) % 取出第2列数据 A([1 3], :) % 取出第1行和第3行全部数据 A([1;3], :) % 同样,取出第1行和第3行全部数据 A(:, 2) = [10; 11; 12] % 修改第2列 A = [A, [100; 101; 102]] % 附加1列做为最后一列 A(:) % 将A全部元素按列造成一个列向量 A = [1 2; 3 4; 5 6] B = [11 12; 13 14; 15 16] C = [A B] % A和B按列链接造成C(3×4)矩阵 C = [A; B] % A和B按行链接造成C(6×2)矩阵
使用冒号能够很方便的取出某一行或某一列的数据。访问和修改数据只须要使用下标便可。值得注意的是,在修改矩阵某一列或添加一列的时候赋值的向量必定要和矩阵的行数相同,不然报错。同理,修改一行时须要和列数相同。
A = [1, 2; 3, 4; 5, 6] % 3x2矩阵 B = [11, 12; 13, 14; 15, 16] % 3x2矩阵 C = [1, 1; 2, 2] % 2x2矩阵 A * C % 矩阵乘法 A .* B % 矩阵对应元素相乘 A .^ 2 % 矩阵每一个元素都作平方运算
A' % A的转置
v = [1; 2; 3] 1 ./ v % 向量每一个元素取倒数 log(v) % 每一个元素取对数 exp(v) % 每一个元素进行指数运算 abs(v) % 每一个元素取绝对值
矩阵乘法须要左矩阵的列数与右矩阵的行数相同,例如A矩阵为3x2,C矩阵为2x2,他们相乘后获得3x2矩阵。
点乘运算为“.*”,两个矩阵点乘须要为同型矩阵,同型矩阵就是行数和列数都同样的矩阵。同理还有“.+”、“.-”、“./”等运算,当两边都是矩阵时须要同型。
若点乘的时数字,如A .^ 2,这个运算就是矩阵中的每一个元素都作平方运算。同理A.-2就是每一个元素减2。
log函数、exp函数、abs函数对每一个元素分别就行求对数、求指数、求绝对值。
使用max函数查找最大值,使用find函数查找知足条件的元素下标。
a = [1, 15, 2, 0.5] [val, ind] = max(a) % 返回最大值以及最大值的下标 a < 3 % 返回全部值的比较结果,小于则返回1, 大于则返回0 find(a < 3) % 仅返回那些小于3的值的下标 A = magic(3) % 返回魔术矩阵,该矩阵每行、每列、对角线、副对角线之和均相等 [rows, cols] = find(A >= 7) % 返回行下标和列下标 sum(a) % 求和 prod(a) % 全部元素相乘 floor(a) % 向下取整 ceil(a) % 向上取整 round(a) % 四舍五入 max(rand(3), rand(3)) % 对应元素对比,较大者存入新矩阵 max(A, [], 1) % 找到每一列的最大值组成向量 max(A, [], 2) % 找到每一行的最大值组成向量 max(A) % 等价于max(A, [], 1) max(max(A)) % 找到矩阵最大值,等价于max(A(:)) A = magic(9) sum(A, 1) % 求出每一列之和 sum(A, 2) % 求出每一行之和 sum(A) % 等价于sum(A, 1) A .* eye(9) % 取对角线元素 sum(sum(A .* eye(9))) % 求对角线元素之和 flipud(eye(9)) %翻转造成副对角 sum(sum(A .* flipud(eye(9)))) % 副对角元素求和 A = magic(3) pinv(A) % 求逆矩阵
a<3将a向量中每一个元素与3比较,小于的返回1,大于的返回0,这样每一个元素的真假值组成一个向量。而find函数则是返回符合条件的全部元素的下标。
绘制图像使用plot函数,plot函数绘制的是曲线图。绘制函数主要是使用向量(行向量或列向量都可)给出x轴和y轴的一系列点,每一个点(x,y)绘制在二维坐标系上,再将这些点连线。
t = [0: 0.01: 0.98];% x轴 y1 = sin(2 * pi * 4 * t); % sin函数,函数值,y轴 plot(t, y1); y2 = cos(2 * pi * 4 * t); % cos函数 plot(t, y2); % 绘制后sin函数会被cos替代
上图的函数一块儿绘制的话sin函数会被cos函数覆盖。
要使得两个函数绘制在同一个窗口中,须要使用hold on命令。此外使用xlabel、ylabel、legend、title分别制动x轴标签、y轴标签、图例和标题。
plot(t, y1); hold on; % 在同一个坐标系上绘制 plot(t, y2, 'r'); % 绘制为红色 xlabel('time') % x轴标签 ylabel('value') % y轴标签 legend('sin', 'cos') % 图例 title('my plot') print -dpng 'myPlot.png' % 保存为图片文件 close; % 关闭图像
还可使用figure命令打开多个窗口,用数字对窗口编号。
% 打开两个窗口 figure(1); plot(t, y1); figure(2); plot(t, y2);
还可使用subplot函数将窗口分为多个格子,指定在某一格子绘图。用axis指定x轴的范围和y轴的范围。
subplot(1, 2, 1) % 将画板分为1×2的格子,并使用第1个格子绘制 plot(t, y1); subplot(1, 2, 2) % 使用第2个格子 plot(t, y2, 'r') axis([0.5 1 -1 1]) % 前两个是x的范围,后两个是y的范围 clf; % 清除全部绘制图像
还能够对矩阵绘制,每一格表示一个数值,元素数值越大越接近黄色。对于绘制灰色图像,数值越大越接近白色。这能够帮助咱们直观了解矩阵内元素的大小关系。
A = magic(5); imagesc(A), colorbar; % 可视化矩阵,绘制为彩色 imagesc(A), colorbar, colormap gray; % 绘制为灰白色
和其余语言基本同样,不同的是没有花括号包住语句,取而代之的是缩进和end。
v = zeros(10, 1); % for for i = 1 : 10, v(i) = 2 ^ i; end v % 打印,下面的同理 indices = 1:10; for i = indices, disp(i); end % while i = 1; while i <= 5, v(i) = 100; i = i + 1; end v % if break i = 1; while true, v(i) = 999; i = i + 1; if i == 6, break; end end v % if、elseif、else 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;
函数的编写与其余语言差异较大,Octave函数能够返回多个返回值。多返回值用逗号隔开。y1和y2是返回值,Octave不使用return语句返回,而是在函数体内直接对返回变量赋值。
function [y1, y2] = squareThisNumber(x), y1 = x ^ 2; y2 = x ^ 3; end
调用函数
[val1, val2] = squareThisNumber(10) % 调用函数
打印输出
若咱们要求解θ0x0 + θ1x1 + θ2x2 + θ3x3 + θ4x4 +θ5x5。为向量化的实现多是使用for循环实现。
但若是使用向量化将令θ = [θ0; θ1; θ2; θ3; θ4; θ5](l列向量),令 x = [x0; x1; x2; x3; x4; x5](列向量)。
这样只须要用θTx就可求解θ0x0 + θ1x1 + θ2x2 + θ3x3 + θ4x4 +θ5x5。极大方便了咱们的运算。称之为向量化。