1.1 矩阵运算
矩阵分为数值矩阵、符号矩阵、元胞矩阵和结构体矩阵等,矩阵运算包括矩阵的数值运算和符号运算,矩阵运算贯穿于整个程序设计。
1.1.1 数值矩阵运算
MATLAB俗称矩阵实验室,其矩阵运算功能简单易用,且执行效率颇高。
具体的矩阵运算如下。
1.矩阵的加减法
编写MATLAB程序如下:
% Designed by Yu Shengwei From SWJTU University % 20141229 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 y1 = [182,8037,8241] y2 = [117,406,3087] y3 = y1 + y2 % 加法 y4 = y1 - y2 % 减法 y1 = 182 8037 8241 y2 = 117 406 3087 y3 = 299 8443 11328 y4 = 65 7631 5154
2.矩阵的点乘除法运算
编写MATLAB程序如下:
y5 = y1.*y2 % 乘法,元素对应相乘 y6 = y1./y2 % 除法,元素对应相除 y5 = 21294 3263022 25439967 y6 = 1.5556 19.7956 2.6696
3.矩阵的点开方运算
编写MATLAB程序如下:
y7 = y1.^2 % 平方运算 y8 = y1.^(1/2) % 开方运算 y7 = 33124 64593369 67914081 y8 = 13.4907 89.6493 90.7800
4.矩阵乘除法运算
这里需要注意的是:矩阵的点乘除运算,表示对矩阵内部的元素进行乘除运算;而矩阵乘除法运算,则是依据线性代数中矩阵与矩阵的乘除法运算。
编写MATLAB程序如下:
>> y9 = y1'*y2 % 乘法,矩阵乘法。“y1'”表示y1的转置 y10 = y1/y2 % 除法,矩阵相除 y9 = 21294 73892 561834 940329 3263022 24810219 964197 3345846 25439967 y10 = 2.9588
5.矩阵求逆运算
需要注意的是,矩阵求逆运算,需要矩阵为方阵,即nnn矩阵。
编写MATLAB程序如下:
y11 = [y1;y2;y2]; inv(y11) % 求逆矩阵 ans = Inf Inf Inf Inf Inf Inf Inf Inf Inf
MATLAB矩阵运算较简单,读者朋友一方面查阅书本知识时,另一方面可以借助于网络平台,有针对性地挖掘自己项目背景下的运算函数。
1.1.2 符号矩阵生成
MATLAB提供两个符号函数:sym和syms,sym声明一个字符变量,syms可同时声明好几个字符变量或者函数名,具体的使用如下。
1.sym
编写MATLAB程序如下:
% Designed by Yu Shengwei From SWJTU University % 2014年12月29日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 % 符号矩阵 ysw1 = sym('ysw1') % 符号 r = sym(1/3) % 符号变量 f = sym(1/3, 'f') % 符号变量 d = sym(1/3, 'd') % 符号变量 e = sym(1/3, 'e') % 符号变量 ysw1 = ysw1 r = 1/3 f = 6004799503160661/18014398509481984 d = 0.33333333333333331482961625624739 e = 1/3 - eps/12
2.syms
编写MATLAB程序如下:
syms ysw1 ysw2 % 符号变量声明 syms f(x,y) % 函数声明 f(x,y) = 1*x + 2*y f(1,2) % 赋值计算 f(x,y) = x + 2*y ans = 5
1.1.3 元胞数组
元胞数组应用较广泛,特别是样本数较多,且样本与样本之间是独立存在的,此时采用元胞数组来保存数据显得很有必要。具体的元胞数组用“{}”来表示。
编写MATLAB程序如下:
% Designed by Yu Shengwei From SWJTU University % 2014年12月29日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 % 元胞数组 ysw{1} = [1,2]; ysw{2} = [3,2]; ysw{3} = [1,4]; celldisp(ysw) % 显示元胞数组
运行程序输出结果如图1-2所示。
图1-2 cell元胞数组创建
元胞数组的循环赋值操作应用较广泛,具体的程序代码如下:
for i=1:3 ys{i} = i; % 赋值 end celldisp(ys) % 显示元胞数组
运行程序输出结果如下:
ys{1} = 1 ys{2} = 2 ys{3} = 3
1.1.4 结构体
结构体数组和元胞数组一样,同样可以存储各类数据,结构体包含元胞数组。具体结构体编程如下:
% Designed by Yu Shengwei From SWJTU University % 2014年12月29日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 ysw.y1{1} = [1,2]; ysw.y2{1} = [3,2]; disp(ysw) % 显示结构体
运行程序输出结果如图1-3所示。
图1-3 结构体使用
同样采用For循环进行结构体数组赋值并输出,程序如下:
for i =1:2 ysw.y3{i} = i; % i=1时,赋值 if i==2 ysw.y = i^2; % i=2时,赋值 end end disp(ysw) % 显示结构体 y1: {[1 2]} y2: {[3 2]} y3: {[1] [2]} y: 4
1.1.5 数据类型转换
数据类型在图像数据中应用较广泛。图像数据常常复杂多变,具体有0-1二值化类型、uint8、double、single和uint16等,表1-1列出了数值型的不同格式。
表1-1 数据类型
如何进行这些类型的转换,具体程序如下所述。
1.double数据类型
转化为double数据类型,程序如下:
% Designed by Yu Shengwei From SWJTU University % 2014年12月29日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 for i= 1:255; ysw(i,:) = i*ones(1,255); % 赋值 end imshow(ysw,[]) % 显示图像 colormap(jet) % 颜色 shading interp % 消隐
运行程序输出图形如图1-4所示。
图1-4 double数据类型
2.uint8类型
转化为uint8类型,程序如下:
ysw1 = uint8(ysw); % 转化为uint8类型 imshow(ysw1) % 显示图像 colormap(jet) % 颜色 shading interp % 消隐
运行程序输出图形如图1-5所示。
图1-5 uint8类型
3.0-1类型
转换为0-1类型(logical),程序如下:
ysw2 = ysw >100; % 大于100为1,否则为0 imshow(ysw2) % 显示图像 colormap(jet) % 颜色 shading interp % 消隐
运行程序输出图形如图1-6所示。
图1-6 logical类型
4.uint16类型
转换为uint16类型,程序如下:
ysw3 = uint16(ysw); % 转化为uint16类型 imshow(ysw3) % 显示图像 colormap(jet) % 颜色 shading interp % 消隐
运行程序输出图形如图1-7所示。
图1-7 uint16类型
5.single类型
转换为single类型,程序如下:
ysw4 = single(ysw); % 转化为单精度类型 imshow(ysw4) % 显示图像 colormap(jet) % 颜色 shading interp % 消隐
运行程序输出图形如图1-8所示。
图1-8 single类型
如图1-4~图1-8中,uint8类型为图像常用数据类型,logical类型则在图像二值化中扮演主要角色。由于数据为1~255,此时单精度single和双精度double类型数据显示是一致的。