MATLAB GUI设计入门与实战
上QQ阅读APP看书,第一时间看更新

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类型数据显示是一致的。