+ All Categories
Home > Documents > 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1....

第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1....

Date post: 10-Sep-2020
Category:
Upload: others
View: 31 times
Download: 0 times
Share this document with a friend
86
2 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat 文件的读取与写入、Txt 文件的 读取与写入、 EXCEL 文件的读取与写入、神经网络 Net 训练窗口的显示与关闭、虚拟现实 Virtual reality 窗口的显示与关闭、图像读取与保存、视频采集及保存与读取、音频采集及 保存与读取等。通过这些功能的讲解,读者可以清晰地掌握各种常用文件的使用方法,并 在后续章节 GUI 设计中,可以简便地通过 GUI 软件调用存在的常用文件。 2.1 Mat 文件的读取与写入 MATLAB 数据保存文件后缀名默认为.mat,因此对于.mat 文件的操作是必须掌握的。 本节主要讲叙 Mat 文件的读取与写入操作方法。 2.1.1 Mat 文件的写入 MATLAB 默认保存的数据为.mat 格式,具体如图 2-1 所示。 2-1 .mat 文件生成 具体如何保存为.mat 文件呢?MATLAB 有很多不同的保存数据的方式,具体如下。 1)首先产生数据,代码如下: clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 x = randn(1000,1); % 产生数据 2)进行数据的保存。 save x.mat x % 数据保存
Transcript
Page 1: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

本章就常用文件读取和写入进行讲解,具体有:Mat 文件的读取与写入、Txt 文件的

读取与写入、EXCEL 文件的读取与写入、神经网络 Net 训练窗口的显示与关闭、虚拟现实

Virtual reality 窗口的显示与关闭、图像读取与保存、视频采集及保存与读取、音频采集及

保存与读取等。通过这些功能的讲解,读者可以清晰地掌握各种常用文件的使用方法,并

在后续章节 GUI 设计中,可以简便地通过 GUI 软件调用存在的常用文件。

2.1 Mat 文件的读取与写入

MATLAB 数据保存文件后缀名默认为.mat,因此对于.mat 文件的操作是必须掌握的。

本节主要讲叙 Mat 文件的读取与写入操作方法。

2.1.1 Mat 文件的写入

MATLAB 默认保存的数据为.mat 格式,具体如图 2-1 所示。

图 2-1 .mat 文件生成

具体如何保存为.mat 文件呢?MATLAB 有很多不同的保存数据的方式,具体如下。 (1)首先产生数据,代码如下: clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 x = randn(1000,1); % 产生数据 (2)进行数据的保存。 save x.mat x % 数据保存

Page 2: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·78·

save 函数将 x 数据保存到 x.mat 文件中,同样也可以采用如下保存方式: save y.mat x % 数据保存 这句代码的意思是将 x 这个数据保存到 y.mat 中。 相应的 MATLAB 工作路径文件夹下出现.mat 数据文件,具体如图 2-2 所示。

图 2-2 mat 文件

(3)当有多个数据时,同样可以采用 save 一次性保存,具体如下: % Designed by Yu Shengwei From SWJTU University clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 x=rand(10,1); % 产生数据 y = x; % 赋值 save xy.mat x y % 保存数据 读者只需要在第一数据后面添加要保存的数据名称即可,不同数据间采用空格隔开。

(4)MATLAB 工作区存储着不同名称对应的数据包,用户可以通过鼠标右键保存,具

体如图 2-3 所示。

图 2-3 保存数据

Page 3: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·79·

用户单击如图 2-3 所示的【另存为…】命令,即弹出如图 2-4 所示数据保存界面。 MATLAB 默认的数据保存文件名为 matlab.mat,当然用户可以对该名称进行修改,例

如修改为 ysw,单击【保存】按钮,在工作文件夹路径下可得到 ysw.mat 文件,如图 2-5所示。

图 2-4 保存数据包 图 2-5 ysw.mat

(5)同样,对于工作区的数据,也可以选择多个数据包,一起打包保存,具体如图 2-6所示。

图 2-6 多个数据包打包保存

因此,总的说来,MATLAB 数据保存是比较容易的。

2.1.2 Mat 文件的读取

如图 2-7 所示为一个数据加载过程示意图。

Page 4: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·80·

图 2-7 数据加载示意图

首先进行 MATLAB 工作区和命令窗口的清理工作,代码如下: clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 (1)加载数据文件,采用 load 函数进行加载,具体代码如下: load('ysw.mat') % 加载数据 当然 MATLAB 也提供了另外一种加载方式,其代码如下: load ysw.mat % 加载数据 用户也可以双击选择的数据文件,则 MATLAB 命令窗口自动生成代码: load('data.mat') % 加载数据 具体加载数据的方式,使用较多的则是通过脚本文件进行加载,即采用 load('data.mat')

代码形式。 (2)同样用户也可以用鼠标右键菜单命令进行数据导入,具体如图 2-8 所示。 单击【导入数据…】命令,弹出导入向导,如图 2-9 所示。 如图 2-9 所示,用户可以知道要导入的数据的大小、字节以及数据类型,也可以生成

完成这个导入过程的 MATAB 代码,直接单击【完成】按钮,即可导入数据。 如果用户勾选【生成 MATLAB 代码】,则自动生成一个 Untitled.m 脚本文件,程序

如下:

Page 5: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·81·

图 2-8 数据导入 图 2-9 导入向导

function importfile(fileToRead1) %IMPORTFILE(FILETOREAD1) % 从指定文件中导入数据 % FILETOREAD1: 要读取的文件 % 由 MATLAB 于 04-Jan-2015 19:38:37 自动生成 % 导入文件 newData1 = load('-mat', fileToRead1); % 加载.mat后缀的文件 % 在基础工作区中从这些字段创建新变量。 vars = fieldnames(newData1); % 变量名称 for i = 1:length(vars) % 长度 assignin('base', vars{i}, newData1.(vars{i})); % 进行 base空间设置,赋值 end 具体如图 2-10 所示。

图 2-10 生成导入数据函数文件

Page 6: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·82·

此时用户可以直接在 MATLAB 命令行输入: >> importfile('data') % 导入数据 即完成数据加载。

(3)load 加载数据,能够节约程序执行时间,例如对一个图像进行读取,程序如下: clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 tic % 运算计时 I = imread('me.jpg'); % 读图 toc % 计时结束 运行程序输出执行时间如下: 时间已过 0.260756 秒。 当采用 load 函数时,即直接加载保存的图像数据时,程序如下: clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 tic % 运算计时 load('I.mat') toc % 计时结束 运行程序输出执行时间如下: 时间已过 0.009754 秒。 对比系统执行时间可知,采用 load 加载已经读取的数据,有助于提高系统执行效率,

节约 CPU 损耗时间,特别是在循环读取图像数据时,可以事先将很多图像数据保存在一个

cell 细胞体中。

2.2 Txt 文件的读取与写入

Txt 文件也是我们常用的文本文件,文本文件的一个好处是可以清楚字符串的格式,

并且 Txt 文件的保存数据和读取数据的快捷性受到业界的支持,本节着重讲解 Txt 文件的

读取与写入操作方法。

2.2.1 Txt 文件的打开

MATLAB 提供了 Txt 文本文件的读取功能,并且操作方式有很多, 简单的外部查看

Txt 文件的操作,如图 2-11~图 2-12 所示。

Page 7: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·83·

图 2-11 鼠标右键打开 图 2-12 MATLAB 显示 Txt 文件

如图 2-11 所示,单击【打开】命令,则弹出一个类似于 MATLAB 脚本文件的文件窗

口,脚本文件的内容显示和文本文件显示一致,且不会出现乱码的现象,MATLAB 软件完

全兼容 Txt 文件。 如图 2-11 所示,当单击【在 MATLAB 外部打开】命令时,则采用文本文件查看模式,

如图 2-13 所示。

图 2-13 在 MATLAB 外部打开

如图 2-13 所示,采用文本文件浏览器打开记事本。 当然,用户也可以用鼠标双击【person.txt】文件,实现打开文本文件,即得到图 2-13

所示文本浏览器。

2.2.2 Txt 文件数据的导入

如图 2-14 所示 data.txt 的文件,采用 MATLAB 读取该文本数据。 如图 2-11 所示,选择 MATLAB 自带的【导入数据…】命令,弹出导入数据界面,如

图 2-15 所示。

Page 8: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·84·

图 2-14 data.txt 数据

图 2-15 导入数据 GUI 界面

如图 2-15 所示,左侧显示为文本文件内数据,数据的维数一目了然,范围为 A1:A8,为列矢量,用户只需要单击图 2-15 箭头指向的按钮即可载入该数据,导入的数据在

MATLAB 工作区可以查看,如图 2-16~图 2-17 所示。

图 2-16 数据导入完成 图 2-17 工作区导入读数据

Page 9: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·85·

如图 2-17 所示,导入的数据自动以 VarName1 命名,以此类推为 VarName2、VarName3……等。

如图 2-18 所示,当文本文件存储为两列数据时,采用外部导入的方法即可,如图 2-19所示。

图 2-18 两列数据 图 2-19 外部导入

如图 2-19 所示的数据导入,MATLAB 导入数据功能,能够自动识别所输入数据。 特别的,当文本文件含有字符变量时,导入功能仍然可以轻松地完成,含字符的文本

文件如图 2-20 所示,选择【导入数据…】命令,得到如图 2-21 所示结果。

图 2-20 带字符的数据 图 2-21 导入数据

如图 2-21 所示,选择【导入数据…】功能,MATLAB 能够自动识别数据,即排除字

符干扰,使得用户能够轻松地对有用数据进行高效处理。 然而 MATLAB 只会识别含字符文档的前几行字符,一旦出现数字即认为后面的所有

的行的矢量均为数值类型,如图 2-22 和图 2-23 所示。 选择 MATLAB【导入数据…】功能可实现数据的导入,另外 MATLAB 也提供了相应

的可供用户加载数据的函数,例如如图 2-23 所示的数据导入过程,MATLAB 能够自动加

载数据,同时也自动生成代码,如图 2-24 所示。 (1)如图 2-24 所示,单击【生成脚本】命令,得到相应的脚本文件,如图 2-25 所示。

Page 10: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·86·

图 2-22 前后带字符的数据 图 2-23 数据导入识别结果

图 2-24 生成脚本和生成函数

图 2-25 脚本文件

Page 11: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·87·

保存该文件为 Untitled2.m,其代码如下: %% 导入文本文件中的数据 % 用于从以下文本文件导入数据的脚本 % % F:\MATLAB Edit 2013a\MATLAB Edit 2012B\ysw\book\GUI设计手册\第 2章 \data.txt % % 要将代码扩展到其他选定数据或其他文本文件,请生成函数来代替脚本 %% 初始化变量 filename = 'F:\MATLAB Edit 2013a\MATLAB Edit 2012B\ysw\book\GUI 设计手册\第 2章\data.txt'; delimiter = ' '; % 定界符 startRow = 2; % 起始行 %% 将数据列作为字符串读取 formatSpec = '%s%s%[^\n\r]'; % 将数据列作为字符串读取 %% 打开文本文件 fileID = fopen(filename,'r'); % 打开文件 %% 根据格式字符串读取数据列 % 该调用基于生成此代码所用的文件的结构。如果其他文件出现错误,请尝试通过导入工具重新生

成代码 dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'HeaderLines' ,startRow-1, 'ReturnOnError', false); % 获取数据矩阵 %% 关闭文本文件 fclose(fileID); %% 将包含数值字符串的列内容转换为数值 % 将非数值字符串替换为 NaN raw = repmat({''},length(dataArray{1}),length(dataArray)-1); for col=1:length(dataArray)-1 raw(1:length(dataArray{col}),col) = dataArray{col}; % 结构体转化为数值矩阵 end numericData = NaN(size(dataArray{1},1),size(dataArray,2)); for col=[1,2] % 将输入元胞数组中的字符串转换为数值。已将非数值字符串替换为 NaN rawData = dataArray{col}; for row=1:size(rawData, 1); % 创建正则表达式以检测并删除非数值前缀和后缀 regexstr = '(?<prefix>.*?)(?<numbers>([-]*(\d+[\,]*)+[\.]{0,1}\d* [eEdD]{0,1}[-+]*\d*[i]{0,1})|([-]*(\d+[\,]*)*[\.]{1,1}\d+[eEdD]{0,1}[-+]*\d*[i]{0,1}))(?<suffix>.*)'; try result = regexp(rawData{row}, regexstr, 'names'); numbers = result.numbers; % 在非千位位置中检测到逗号 invalidThousandsSeparator = false; if any(numbers==','); thousandsRegExp = '^\d+?(\,\d{3})*\.{0,1}\d*$';

Page 12: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·88·

if isempty(regexp(thousandsRegExp, ',', 'once')); numbers = NaN; invalidThousandsSeparator = true; end end % 将数值字符串转换为数值 if ~invalidThousandsSeparator; numbers = textscan(strrep(numbers, ',', ''), '%f'); numericData(row, col) = numbers{1}; raw{row, col} = numbers{1}; end catch me end end end %% 将非数值元胞替换为 NaN R = cellfun(@(x) ~isnumeric(x) && ~islogical(x),raw); % 查找非数值元胞 raw(R) = {NaN}; % 替换非数值元胞 %% 将导入的数组分配给列变量名称 ysw = cell2mat(raw(:, 1)); % cell转化为 mat格式文件 person = cell2mat(raw(:, 2)); % cell转化为 mat格式文件 %% 清除临时变量 clearvars filename delimiter startRow formatSpec fileID dataArray ans raw col numericData rawData row regexstr result numbers invalidThousandsSeparator thousandsRegExp me R; 用户可直接运行 Untitled2.m,则 MATLAB 工作区将自动得到相应的加载数据。

(2)如图 2-24 所示,单击【生成函数】命令,得到相应的函数文件,如图 2-26 所示。

图 2-26 自动生成加载数据函数文件

如图 2-26 所示,MATLAB 自动生成一个 importfile1.m 函数文件,用户可以输入数据,

Page 13: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·89·

即可实现数据的加载,具体的 importfile1.m 函数文件如下: function [ysw1,person1] = importfile1(filename, startRow, endRow) %IMPORTFILE1 将文本文件中的数值数据作为列矢量导入 % [YSW1,PERSON1] = IMPORTFILE1(FILENAME) 读取文本文件 FILENAME 中默认选定范

围的数据 % % [YSW1,PERSON1] = IMPORTFILE1(FILENAME, STARTROW, ENDROW) 读取文本文件 % FILENAME的 STARTROW起始行到 ENDROW终止行中的数据 % % Example: % [ysw1,person1] = importfile1('data.txt',2, 10); % 导入数据调用格式 %% 初始化变量 delimiter = ' '; % 定界符,终止符 if nargin<=2 startRow = 2; % 起始行 endRow = inf; % 结束行 end %% 将数据列作为字符串读取 % 有关详细信息,请参阅 TEXTSCAN 文档 formatSpec = '%s%s%[^\n\r]'; %% 打开文本文件 fileID = fopen(filename,'r'); %% 根据格式字符串读取数据列 % 该调用基于生成此代码所用的文件的结构。如果其他文件出现错误,请尝试通过导入工具重新生

成代码 dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'HeaderLines', startRow(1)-1, 'ReturnOnError', false); % 获取数据矩阵 for block=2:length(startRow) frewind(fileID); dataArrayBlock = textscan(fileID, formatSpec, endRow(block)-startRow (block)+1, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'HeaderLines', startRow(block)-1, 'ReturnOnError', false); for col=1:length(dataArray) dataArray{col} = [dataArray{col};dataArrayBlock{col}]; % 赋值 end end %% 关闭文本文件 fclose(fileID); %% 将包含数值字符串的列内容转换为数值 % 将非数值字符串替换为 NaN raw = repmat({''},length(dataArray{1}),length(dataArray)-1); for col=1:length(dataArray)-1 raw(1:length(dataArray{col}),col) = dataArray{col}; end numericData = NaN(size(dataArray{1},1),size(dataArray,2)); for col=[1,2] % 将输入元胞数组中的字符串转换为数值。已将非数值字符串替换为 NaN rawData = dataArray{col}; for row=1:size(rawData, 1);

Page 14: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·90·

% 创建正则表达式以检测并删除非数值前缀和后缀 regexstr = '(?<prefix>.*?)(?<numbers>([-]*(\d+[\,]*)+[\.]{0,1}\d*[eEdD]{0,1}[-+]*\d*[i]{0,1})|([-]*(\d+[\,]*)*[\.]{1,1}\d+[eEdD]{0,1}[-+]*\d*[i]{0,1}))(?<suffix>.*)'; try result = regexp(rawData{row}, regexstr, 'names'); numbers = result.numbers; % 在非千位位置中检测到逗号 invalidThousandsSeparator = false; if any(numbers==','); thousandsRegExp = '^\d+?(\,\d{3})*\.{0,1}\d*$'; if isempty(regexp(thousandsRegExp, ',', 'once')); numbers = NaN; invalidThousandsSeparator = true; end end % 将数值字符串转换为数值 if ~invalidThousandsSeparator; numbers = textscan(strrep(numbers, ',', ''), '%f'); numericData(row, col) = numbers{1}; raw{row, col} = numbers{1}; end catch me end end end %% 将非数值元胞替换为 NaN R = cellfun(@(x) ~isnumeric(x) && ~islogical(x),raw); % 查找非数值元胞 raw(R) = {NaN}; % 替换非数值元胞 %% 将导入的数组分配给列变量名称 ysw1 = cell2mat(raw(:, 1)); person1 = cell2mat(raw(:, 2)); 在 MATLAB 命令行窗口输入如下代码: [ysw1,person1] = importfile1('data.txt',2, 10) % 调用函数 运行程序输出结果如下: ysw1 = 201517 5337 182 8037 8241 117 406 3087 NaN person1 = 201517 201517 201517 201517 201517

Page 15: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·91·

201517 201517 201517 NaN 因此,用户借助该函数文件,也可以实现其他文本文件的加载。而【生成脚本】功能

只限于加载某一个指定的文本文件,【生成函数】功能可实现同类型文件的数据导入。

MATLAB 这个自动生成代码的功能给用户提供了极大的便利。 MATLAB 也提供了较简便的文本数据加载函数,具体如下: >> ysw = load('data1.txt') % 加载数据 ysw = 201517 201517 5337 201517 182 201517 如果直接使用 load('data1.txt'),MATLAB 自动以 ans.mat 保存数据到工作区下,可供

MATLAB GUI 设计使用,也可供 MATLAB 主函数文件参数传递使用。 load('data1.txt')函数使用有其局限性,如果文本文件含有字母等变量,直接采用

load('data1.txt')是不能加载的,load('data1.txt')只对单纯的数据加载有效,例如 data.txt 的内

容如下: ysw person 201517 201517 5337 201517 182 201517 8037 201517 8241 201517 117 201517 406 201517 3087 201517 ysw person 采用 load('data.txt')进行调用,系统将提示如下信息: >> ysw = load('data.txt') 错误使用 load ASCII 文件 data.txt 的行号 1 中的文本未知 "ysw"。 因此,用户应该根据具体的问题具体对待,当含有字符类型时,可采用 MATLAB

importfile 函数进行数据分析。 (3)MATLAB 提供了向文本文件写入和读入的功能,方便用户存储调用数据,利用

MATLAB 向 ysw.txt 文件中添加数据,程序如下: % Designed by Yu Shengwei From SWJTU University % 2015年 1月 3日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 tic % 运算计时 A = [1,1,7,4,0,6,3,0,8,7,0;

Page 16: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·92·

1,8,2,8,0,3,7,8,2,4,1; 1,3,6,7,9,6,1,0,0,4,1; 1,8,3,8,2,4,5,8,0,7,4]; % 存储数据 A save ysw.txt A -ascii; 运行程序输出结果如下: 1.0000000e+00 1.0000000e+00 7.0000000e+00 4.0000000e+00 0.0000000e+00 6.0000000e+00 3.0000000e+00 0.0000000e+00 8.0000000e+00 7.0000000e+00 0.0000000e+00 1.0000000e+00 8.0000000e+00 2.0000000e+00 8.0000000e+00 0.0000000e+00 3.0000000e+00 7.0000000e+00 8.0000000e+00 2.0000000e+00 4.0000000e+00 1.0000000e+00 1.0000000e+00 3.0000000e+00 6.0000000e+00 7.0000000e+00 9.0000000e+00 6.0000000e+00 1.0000000e+00 0.0000000e+00 0.0000000e+00 4.0000000e+00 1.0000000e+00 1.0000000e+00 8.0000000e+00 3.0000000e+00 8.0000000e+00 2.0000000e+00 4.0000000e+00 5.0000000e+00 8.0000000e+00 0.0000000e+00 7.0000000e+00 4.0000000e+00 由结果可知,MATLAB 向文本文件写入数据,默认为 longE 类型,生成的数据和写入

的数据一致,用户可以将 txt 数据加载到 MATLAB 进行分析,因此在 MATLAB 中文本文

件数据写入较简便。 当 MATLAB 再次向同一文本文件写入数据时,MATLAB 将自动清空该文本文件中的

所有数据,然后再写入该数据,例如再次写入数据如下: A = [1,1,7,4,0,6,3,0,8,7; 1,8,2,8,0,3,7,8,2,4; 1,3,6,7,9,6,1,0,0,4; 1,8,3,8,2,4,5,8,0,7]; 运行程序输出结果如下。 1.0000000e+00 1.0000000e+00 7.0000000e+00 4.0000000e+00 0.0000000e+00 6.0000000e+00 3.0000000e+00 0.0000000e+00 8.0000000e+00 7.0000000e+00 1.0000000e+00 8.0000000e+00 2.0000000e+00 8.0000000e+00 0.0000000e+00 3.0000000e+00 7.0000000e+00 8.0000000e+00 2.0000000e+00 4.0000000e+00 1.0000000e+00 3.0000000e+00 6.0000000e+00 7.0000000e+00 9.0000000e+00 6.0000000e+00 1.0000000e+00 0.0000000e+00 0.0000000e+00 4.0000000e+00 1.0000000e+00 8.0000000e+00 3.0000000e+00 8.0000000e+00 2.0000000e+00 4.0000000e+00 5.0000000e+00 8.0000000e+00 0.0000000e+00 7.0000000e+00 为了直观地说明该问题,写入 1,具体程序如下: A=[1]; %存储数据 A save ysw.txt A -ascii; 运行程序输出结果如下: 1.0000000e+00 MATLAB 还提供了一个文本文件数据追加功能,即向已经生成的文本文件追加数据,

Page 17: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·93·

而不是对原先数据进行覆盖处理,那么怎么进行数据追加呢?具体操作如下: clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 format short % 数据类型 tic % 运算计时 A = [1,1,7,4,0,6,3,0,8,7; 1,8,2,8,0,3,7,8,2,4; 1,3,6,7,9,6,1,0,0,4; 1,8,3,8,2,4,5,8,0,7]; % 矩阵 A B=[1]; % 存储数据 A save ysw.txt A -ascii; % 追加存储数据 N save ysw.txt B -append -ascii; toc % 计时结束 追加数据后,ysw.txt 文本文件数据如下: 1.0000000e+00 1.0000000e+00 7.0000000e+00 4.0000000e+00 0.0000000e+00 6.0000000e+00 3.0000000e+00 0.0000000e+00 8.0000000e+00 7.0000000e+00 1.0000000e+00 8.0000000e+00 2.0000000e+00 8.0000000e+00 0.0000000e+00 3.0000000e+00 7.0000000e+00 8.0000000e+00 2.0000000e+00 4.0000000e+00 1.0000000e+00 3.0000000e+00 6.0000000e+00 7.0000000e+00 9.0000000e+00 6.0000000e+00 1.0000000e+00 0.0000000e+00 0.0000000e+00 4.0000000e+00 1.0000000e+00 8.0000000e+00 3.0000000e+00 8.0000000e+00 2.0000000e+00 4.0000000e+00 5.0000000e+00 8.0000000e+00 0.0000000e+00 7.0000000e+00 1.0000000e+00 由此,我们将很容易向文本文件中添加数据或删减数据。

2.3 EXCEL 文件的读取与写入

EXCEL 文件和 Txt 文件一样,可以很好地保存数据并显示数据,实现 EXCEL 数据的

传输和 MATLAB 的对接,也是应用探讨 多的热门话题之一。本节讲解 EXCEL 文件的读

取与写入操作方法。

2.3.1 EXCEL 数据的读取

EXCEL 文件和文本文件一样,在实际工程中,应用很广泛。EXCEL 自身就带有很强

大的数据处理功能,然而对于大数据时代的今天,EXCEL 已经不能很好地胜任目前的数据

计算任务,常常需要由 MATLAB 等软件进行数据计算,然后将计算结果写入到 EXCEL中。同样,MATLAB 工作区矩阵的容量也是有限的,很多用户都是将数据存储为 EXCEL文件,方便后期的使用。因此,有必要进行 EXCEL 的读取与写入功能介绍。

MATLAB 数据导入功能是很强大的,其具有很强的兼容性,能够对几乎所有的数据类

Page 18: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·94·

型进行导入操作,具体如图 2-27 所示。

图 2-27 EXCEL 数据导入

如图 2-27 所示,EXCEL 包含两个 Sheet 文件——Sheet1 和 Sheet2 文件,数据导入功

能,能够识别所有 Sheet 文件,并由用户自行选择 Sheet 文件进行数据的导入操作。单击导

入所选内容,即可实现 EXCEL 文件内容导入,具体如图 2-28 所示。

图 2-28 Sheet1 文件导入数据

针对每一列数据,进行一个变量命名保存,依次为 VarName1、VarName2、VarName3、

Page 19: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·95·

VarName4,如此依次类推,分别对应于 MATLAB 工作区变量。每一个变量所包含的数值

在第 2 列显示,均为 11 行 1 列的数据。用户也可以单击 Sheet2 进行数据的导入操作。 选择生成脚本文件,MATLAB 自动生成导入 EXCEL 数据的函数程序文件,如下: %% 导入电子表格中的数据 % 用于从以下电子表格导入数据的脚本 % % 工作簿: F:\MATLAB Edit 2013a\MATLAB Edit % 2012B\ysw\book\GUI设计手册\第 2章\ysw.xlsx 工作表: Sheet1 % % 要扩展代码以供其他选定数据或其他电子表格使用,请生成函数来代替脚本 %% 导入数据 data = xlsread('F:\MATLAB Edit 2013a\MATLAB Edit 2012B\ysw\book\GUI设计手

册\第 2章\ysw.xlsx','Sheet1'); %% 将导入的数组分配给列变量名称 VarName1 = data(:,1); % 赋值 VarName2 = data(:,2); % 赋值 VarName3 = data(:,3); % 赋值 VarName4 = data(:,4); % 赋值 %% 清除临时变量 clearvars data raw; 具体如图 2-29 所示。

图 2-29 脚本文件导入

采用函数文件进行 EXCEL 数据导入,选择 Sheet1 作为分析 EXCEL 数据簿,得到相

应的导入函数,具体代码如下: function [VarName1,VarName2,VarName3,VarName4] = importfile2(workbookFile,

Page 20: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·96·

sheetName,startRow,endRow) % IMPORTFILE2 导入电子表格中的数据 % [VarName1,VarName2,VarName3,VarName4]=IMPORTFILE2(FILE)读取名为 FILE的 % Microsoft Excel 电子表格文件的第一张工作表中的数据,并将该数据作为列矢量返回 % % [VarName1,VarName2,VarName3,VarName4] = IMPORTFILE2(FILE,SHEET) % 从指定的工作表中读取 % % [VarName1,VarName2,VarName3,VarName4] = % IMPORTFILE2(FILE,SHEET,STARTROW,ENDROW) 对于指定的行间隔从指定工作表中读

取。对于不连续的行间隔,将 STARTROW 和 ENDROW 指定为大小匹配的一对标量或矢量。要读取

到文件结尾,请为 inf 指定 ENDROW % 示例: % [VarName1,VarName2,VarName3,VarName4] = % importfile2('ysw.xlsx','Sheet1',1,11); % 调用格式 % %% 输入处理 % 如果未指定工作表,则读取第一张工作表 if nargin == 1 || isempty(sheetName) sheetName = 1; % 默认 EXCEL BOOK名称 end % 如果未指定行的起点和终点,则会定义默认值 if nargin <= 3 startRow = 1; % 起始行 endRow = 11; % 终止行 end %% 导入数据 data = xlsread(workbookFile, sheetName, sprintf('A%d:D%d',startRow(1), endRow(1))); for block=2:length(startRow) tmpDataBlock = xlsread(workbookFile, sheetName, sprintf('A%d:D%d', startRow(block),endRow(block))); data = [data;tmpDataBlock]; %#ok<AGROW> end %% 将导入的数组分配给列变量名称 VarName1 = data(:,1); % 变量赋值 VarName2 = data(:,2); % 变量赋值 VarName3 = data(:,3); % 变量赋值 VarName4 = data(:,4); % 变量赋值 函数具体使用如下: >> [VarName1,VarName2,VarName3,VarName4] =importfile2('ysw.xlsx',' Sheet1',1,11) 1 1 1 1 1 8 8 3 7 2 3 6 4 8 8 7 0 0 2 9 6 3 4 6 3 7 5 1 0 8 8 0 8 2 0 0

Page 21: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·97·

7 4 7 4 0 1 4 1 函数 importfile2('ysw.xlsx','Sheet1',1,11),Sheet1 为 EXCEL 的第一个工作表,1 表示第

一行,11 表示第 11 行,ysw.xlsx 表示命名为 ysw 的 EXCEL 文件。导入的数据分别存储到

VarName1、VarName2、VarName3 和 VarName4 四个变量中。 当然 MATLAB 也提供了较为简单的函数实现数据的直接导入功能,即 xlsread 函数,

该函数兼容 2003 版 EXCEL 以及更高 EXCEL 版本,例如 2007 版 EXCEL、2013 版 EXCEL以及 2014 版 EXCEL 等。

采用 xlsread 函数对 EXCEL 进行读取操作,具体如下: % Designed by Yu Shengwei From SWJTU University % 2015年 1月 3日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 tic % 运算计时 data = xlsread('ysw.xlsx','Sheet1'); toc % 计时结束 运行程序输出结果如下: data = 1 1 1 1 1 8 8 3 7 2 3 6 4 8 8 7 0 0 2 9 6 3 4 6 3 7 5 1 0 8 8 0 8 2 0 0 7 4 7 4 0 1 4 1 时间已过 1.729919 秒。 同样也可以对 EXCEL 某几行进行读取操作,如下: data = xlsread('ysw.xlsx','Sheet1','A1:D3') 运行程序输出结果如下: data = 1 1 1 1 1 8 8 3 7 2 3 6 其中,A1~D3 表示从 A~D 列,从第 1~3 行,将这个区域内的元素全部取出,并存

入 data 变量中,具体 EXCEL 数据如图 2-30 所示。

Page 22: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·98·

图 2-30 EXCEL 原始数据

修改 Sheet2 工作表为 ysw1 工作表,如图 2-31 所示。

图 2-31 EXCEL ysw1 工作表

现要求读取指定工作表的数据,具体程序如下: tic % 运算计时 data = xlsread('ysw.xlsx','ysw1','A1:D11') % 读取 EXCEL toc % 计时结束 运行程序输出结果如下: data = 1 1 1 1 1 8 8 3 7 2 3 6 4 8 8 7 0 0 2 9 6 3 4 6

Page 23: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·99·

3 7 5 1 0 8 8 0 8 2 0 0 7 4 7 4 0 1 4 1 时间已过 3.039723 秒。 如此使然,用户将可以对 EXCEL 数据导入功能熟练掌握了。

2.3.2 EXCEL 数据的写入

MATLAB 提供了强大的 EXCEL 读取功能,同样也有着强大的 EXCEL 写入数据功能。

MATLAB 提供 xlswrite 函数供用户调用,如下为 简单的向 EXCEL 中写入数据的程序。 % Designed by Yu Shengwei From SWJTU University % 2015年 2月 2日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 tic % 运算计时 % data = xlsread('ysw.xlsx','Sheet1') % 读 EXCEL ysw = [1,1,7,4,0,6,3,0,8,7]; % 数值 xlswrite('ysw1.xlsx',ysw) % 写入 EXCEL toc % 计时结束 运行程序即可向 ysw1.xlsx EXCEL文件写入 ysw变量数组的内容,具体如图 2-32所示。

图 2-32 ysw1.xlsx 文件

MATLAB 调用 xlswrite 函数进行数据写入,不需要用户提前创建 EXCEL 文件,即在

当前工作路径下,用户不需要事先创建一个 ysw1.xlsx 的 EXCEL 文件。 通过程序向 EXCEL 写入数据,然后读取 EXCEL 数据,就能知道数据是否写入 EXCEL

中,具体程序如下: ysw = [1,1,7,4,0,6,3,0,8,7];

Page 24: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·100·

xlswrite('ysw1.xlsx',ysw) % 写入 EXCEL % 写完数据后,读取数据 data = xlsread('ysw1.xlsx','Sheet1') % 读 EXCEL toc % 计时结束 运行程序输出结果如下: data = 1 1 7 4 0 6 3 0 8 7 时间已过 15.310696 秒。 MATLAB 读取 EXCEL 时,需要打开 EXCEL,然后再提取数据,因此比较耗时,用

时 15.310696 秒左右。 有时候用户的工作表名字可能为其他名称,而不是“Sheet1”,用户也可以进行修改,

将数据写入名称为“yswysw”的工作表,具体如下: xlswrite('ysw1.xlsx',ysw,'yswysw') % 写 EXCEL 其中,yswysw 为工作表名称,ysw 为数据,ysw1.xlsx 为 EXCEL 文件名称。 运行程序得到如图 2-33 所示结果。

图 2-33 工作表重命名

如图 2-33 所示,EXCEL 工作表名称已经修改为“yswysw”。 接下来用户可针对指定 EXCEL 工作表进行数据写入操作。此时用户也许会更多地关

心,如何向指定的 EXCEL 工作表位置写入数据呢?具体 MATLAB 程序如下: clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 filename = 'ysw2.xlsx'; % EXCEL文件名称 A = {'Time','Temperature'; 11,7; 40,6; 30,87}; % 写入的数据 sheet = 3; % 向第三个工作表上写数据 xlRange = 'B1'; % 从 B1列开始写入数据 A xlswrite(filename,A,sheet,xlRange) % 写数据开始 运行程序得到如图 2-34 所示结果。

Page 25: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·101·

图 2-34 指定位置写入数据

如图 2-34 所示结果,指定向该 EXCEL 的第三个工作表上的 B1 列位置开始写数据,

同理,用户也可以向 E1 的位置写入数据,程序如下: xlRange = 'E1'; % 从 E1列开始写入数据 A xlswrite(filename,A,sheet,xlRange) % 写数据开始 MATLAB 也支持胞组数据写入,即直接写入字符和数据,具体程序如下: filename = 'ysw2.xlsx'; % EXCEL文件名称 A = {92.0,'Yes',45.9,'No'}; % 胞组数据 sheet = 3; % 向第三个工作表上写数据 xlRange = 'E1'; % 从 E1列开始写入数据 A xlswrite(filename,A,sheet,xlRange) % 写数据开始 运行程序得到如图 2-35 所示结果。

图 2-35 胞组数据写入

如图 2-35 所示,数据和字符类型数据直接写入,因此 MATLAB 中的数据写入 EXCEL是极其简便的,MATLAB 支持 single、double、int8、int16、int32、int64、uint8、uint16、

Page 26: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·102·

uint32、uint64、logical、char、cell 等数据类型写入。

2.4 神经网络 Net 训练窗口的显示与关闭

神经网络应用比比皆是,例如常用的 BP 神经网络,该网络通过误差反向传播,达到

逼近目标的目的。BP 神经网络有自学习功能,能够很好地适应各种线性及非线性系统等,

结构图如图 2-36 所示。

图 2-36 BP 神经网络结构图

对于一个 BP 神经网络模型而言,定义输入输出变量,以及各层权值和符号简要说明

如下:

( )TixxxxX ,,, 3,21= ( )28,,2,1=i 输入变量向量组

1 2( , ,... ,... )Ti mY y y y y= 隐层输出变量(m 为隐变量个数)向量组

( )TihhhhH ,,,, 321= 输出层输出向量组(所预测时间范围内的功率) T

iddddD ),,,( 321= 期望输出向量组(为常向量组) T

mwwwW ),,( 21= 输入层到隐层之间的权值矩阵

( )TivvvV 21,= 隐层到输出层之间的权值矩阵

(0,1)η ∈ 比例常数,表示学习速率 对于输出层,有:

1

( ) 1, 2, , n

1, 2, ,

k km

k jk jj

h f net k

net v y k n=

= =⎧⎪⎨ = =⎪⎩

对于隐层,有:

6

1

( ) 1, 2...

1, 2...

j j

m

j ij ii

y f net j m

net w x j m=

= =⎧⎪⎨

= =⎪⎩

其中,1( )

1 xf xe−

=+

具体的 MATLAB 代码如下: % Designed by Yu Shengwei From SWJTU University % 2015年 2月 3日

Page 27: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·103·

clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 tic % 运算计时 P = [1,1,7,4,0,6,3,0,8,7; % 输入 1,3,6,7,9,6,1,0,0,4]; T = [1,8,2,8,0,3,7,8,2,4]; % 输出 % 创建一个新的前向神经网络 net_1=newff(minmax(P),[10,1],{'tansig','purelin'},'traingdm'); % 当前输入层权值和阈值 inputWeights=net_1.IW{1,1} ; % 权值 inputbias=net_1.b{1} ; % 阈值 % 当前网络层权值和阈值 layerWeights=net_1.LW{2,1} ; % 权值 layerbias=net_1.b{2} ; % 阈值 % 设置训练参数 net_1.trainParam.show = 50; % 训练显示间隔 net_1.trainParam.lr = 0.05; % 学习率 net_1.trainParam.mc = 0.9; % 动量因子 net_1.trainParam.epochs = 10000; % 迭代次数 net_1.trainParam.goal = 1e-3; % 小误差 % 调用 TRAINGDM 算法训练 BP 网络 [net_1,tr]=train(net_1,P,T); % 训练网络 % 对 BP 网络进行仿真 A = sim(net_1,P); % 计算仿真误差 E = T - A; % 误差 MSE=mse(E) % 均方差 x=[1,3,6,7,9,6,1,0,0,4; 1,8,2,4,5,7,8,9,0,1]; sim(net_1,x)' % 预测结果 toc % 计时结束 运行程序输出结果如下: MSE = 0.1187 ans = 1.0630 8.5173 2.8468 3.2789 3.1808 5.8226 0.1082 0.0756 7.9932 6.6894 时间已过 26.751669 秒。 由均方误差值可知,该网络训练输出误差很小,可以用于模型预测。 然而运行的过程中,经常弹出如图 2-37 所示的网络训练对话框,有时候很影响用户执

Page 28: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·104·

行程序的效率,因此很多用户更多地希望该对话框不出现,即隐藏该对话框,提高程序运

行速度。

图 2-37 网络训练对话框

当给程序添加以下代码时,则如图 2-37 所示的窗口将不显示,具体如下: net_1.trainParam.showWindow = 0; 默认情况下,net_1.trainParam.showWindow 等于 1,即显示网络训练状态,如图 2-37

所示。 则完整的 BP 代码如下: % Designed by Yu Shengwei From SWJTU University % 2015年 2月 3日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 tic % 运算计时 % 构建网络 nntwarn off P = [1,1,7,4,0,6,3,0,8,7; 1,3,6,7,9,6,1,0,0,4]; T = [1,8,2,8,0,3,7,8,2,4]; % 创建一个新的前向神经网络 net_1=newff(minmax(P),[10,1],{'tansig','purelin'},'traingdm'); % 当前输入层权值和阈值 inputWeights=net_1.IW{1,1} ; inputbias=net_1.b{1} ; % 当前网络层权值和阈值 layerWeights=net_1.LW{2,1} ; layerbias=net_1.b{2} ; % 设置训练参数

Page 29: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·105·

net_1.trainParam.show = 50; % 显示间隔 net_1.trainParam.lr = 0.05; % 学习率 net_1.trainParam.mc = 0.9; % 动量因子 net_1.trainParam.epochs = 10000; % 学习次数 net_1.trainParam.goal = 1e-3; % 小均方根误差 net_1.trainParam.showWindow = 0; % 不显示神经网络训练窗口 % 调用 TRAINGDM 算法训练 BP网络 [net_1,tr]=train(net_1,P,T); % 训练 % 对 BP网络进行仿真 A = sim(net_1,P); % 计算仿真误差 E = T - A; % 误差 MSE=mse(E) % 均方差 x=[1,3,6,7,9,6,1,0,0,4; 1,8,2,4,5,7,8,9,0,1]; sim(net_1,x)' % 预测结果 toc % 计时结束 运行程序输出结果如下: MSE = 9.7580e-04 ans = 1.0432 6.0335 4.1839 4.0281 3.0099 1.4709 6.3602 0.0262 7.9593 4.5517 时间已过 10.713016 秒。 对比显示 BP 网络训练窗口程序,添加 net_1.trainParam.showWindow=0 这句代码后,

程序执行时间为 10.713016 秒,大大降低了程序执行时间,而 net_1.trainParam.showWindow=1时,程序执行时间为 26.751669 秒。因此这个小技巧也应该引起读者朋友的注意。

2.5 虚拟现实 Virtual reality 窗口的显示与关闭

虚拟现实,即将现实的物体进行虚拟化,也就是采用 3D 模型进行虚拟构造,再现真

实场景。具体的虚拟现实汽车运动模型如图 2-38 所示。 当构建一个虚拟现实模型时,如何快速地打开与关闭虚拟现实对话框显得尤为重要。

采用程序打开与关闭编辑器,可以有助于内嵌到其他程序应用中, 直接的使用是为 GUI所调用并显示,因此掌握虚拟现实编辑器的打开与关闭很有必要。

Page 30: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·106·

图 2-38 虚拟现实场景

MATLAB 2014a 虚拟现实编辑器如图 2-39 所示。

图 2-39 虚拟现实编辑器

Page 31: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·107·

打开虚拟三维模型,程序如下: % Designed by Yu Shengwei From SWJTU University % 2015年 2月 3日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 tic % 运算计时 myworld = vrworld('octavia_body.wrl') % 打开查看虚拟现实文件 open(myworld) % 打开 view(myworld) % 查看 toc % 计时结束 运行程序输出结果如下: myworld = vrworld object: 1-by-1 (F:/MATLAB Edit 2013a/MATLAB Edit 2012B/ysw/book/GUI 设计手册/第 2 章 /octavia_body.wrl) ans = vrfigure object: 1-by-1 Skoda Octavia Body Model 时间已过 0.855249 秒。 得到如图 2-40 所示结果。

图 2-40 虚拟现实模型

关闭如图 2-40 所示虚拟现实窗口,程序如下: close(myworld) % 关闭

Page 32: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·108·

关闭虚拟现实窗口后,用户也可以继续删除打开的句柄,具体如下: delete(myworld) % 删除 当用户打开多个虚拟现实窗口,需要进行清屏处理,可以采用如下代码: vrclear % 清除虚拟现实窗口 vrclear('-force') % 强力清除 由此用户可以方便地打开与关闭虚拟现实窗口,方便用户嵌套使用。

2.6 图像读取与保存

我们眼睛看到的都是一幅一幅的图像,图像处理越来越引起广泛学者关注。图像本身

就是一个二维数值矩阵,因此对于图像数据的保存,首先需要读取图像,然后将得到的图

像二维矩阵保存到指定路径下。本节主要带领大家熟悉图像的基本操作——图像的读取与

保存。

2.6.1 图像读取

21 世纪,图像处理越来越受广大学者的关注,各行各业都对图像处理有一定的需求,

例如人脸识别、指纹识别、视频检测与跟踪、车牌号识别等等,图像领域的各个算法处理

也越来越多地受到各界的关注,本小节主要针对图像处理,提供 基础的图像读取与保存

操作功能,方便用户对视频图像进行预览与人为处理。 图像的数据类型有很多,例如 single、double、int8、int16、int32、int64、uint8、uint16、

uint32、uint64、logical、char 和 cell 等。针对每一种数据类型,MATLAB 进行处理的方式

都不同,需要进行图像数据类型的转化。大部分图像都是 uint8 类型,在进行图像灰度处

理时,较多地以 double 数据类型进行图像数据处理。简单的图像数据导入操作如图 2-41所示。

图 2-41 图像数据导入

Page 33: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·109·

如图 2-41 所示为图像数据导入,ysw 为数组的名称也为图像的名称,图像大小为

433×637×3,表示为 RGB 图像,字节数为 827463,为 uint8 数据类型。此时用户只需要单

击【完成】按钮,即可在 MATLAB 工作区得到 ysw 图像数组。如图 2-42 所示。

图 2-42 工作区 ysw 数组

此时可以使用图像显示函数,进行图像显示,具体如下: imshow(ysw) % 显示图像 image(ysw) % 显示图像 imagesc(ysw) % 显示图像 运行程序输出图形如图 2-43~图 2-44 所示。

图 2-43 imshow 图像 图 2-44 image 图像

同样 MATLAB 也提供较为快捷的程序函数读取方法,如 imread 函数,该函数能够读

取所有的图像,因此对不同图像均具有很强的通用性和泛化能力,具体的使用如下: % Designed by Yu Shengwei From SWJTU University % 2015年 2月 3日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行

Page 34: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·110·

format short % 数据类型 tic % 运算计时 im = imread('ysw.jpg'); % 读取图像 imshow(im) % 显示图像 toc % 计时结束 运行程序输出图像如图 2-43 所示结果。 RGB 图像由 R、G、B 三通道构成,将图像分成三通道分别显示,程序如下: figure, subplot(221),imshow(im);title('RGB') % 4分之 1窗口画图 subplot(222),imshow(im(:,:,1));title('R'); % 4分之 1窗口画图 subplot(223),imshow(im(:,:,2));title('G'); % 4分之 1窗口画图 subplot(224),imshow(im(:,:,3));title('B'); % 4分之 1窗口画图 运行程序输出图像如图 2-45 所示。

图 2-45 RGB 三通道图像

imread 函数也可以读取指定路径下的图像,具体程序如下: im = imread('C:\Users\Administrator\Desktop\360网盘.jpg'); % 读取图像 subplot(221),imshow(im);title('RGB') % 4分之 1窗口画图 subplot(222),imshow(im(:,:,1));title('R'); % 4分之 1窗口画图 subplot(223),imshow(im(:,:,2));title('G'); % 4分之 1窗口画图 subplot(224),imshow(im(:,:,3));title('B'); % 4分之 1窗口画图 运行程序输出图像如图 2-46 所示。 采用 imread 函数读取当前路径下的一个文件夹里的图像,当该文件夹移动时,不影响

程序的运行,具体操作如下: im = imread('.\ysw\me.jpg'); % 读取图像 subplot(221),imshow(im);title('RGB') % 4分之 1窗口画图 subplot(222),imshow(im(:,:,1));title('R'); % 4分之 1窗口画图 subplot(223),imshow(im(:,:,2));title('G'); % 4分之 1窗口画图 subplot(224),imshow(im(:,:,3));title('B'); % 4分之 1窗口画图

Page 35: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·111·

运行程序输出图像如图 2-47 所示。

图 2-46 指定路径下的图像读取

图 2-47 文件夹内图像读取

采用“.\ysw\”表示当前路径下的 ysw 内的文件,所以用户不需要指定当前文件夹的

具体路径,此时用户可以移动文件夹到任意盘符,均不影响程序执行。

Page 36: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·112·

2.6.2 图像保存

图像保存,即将图像读取后得到一个图像的数组,该数组为图像各通道灰度值。用户

有时候需要将已经处理好的图像数据留作后续的工作用,因此能够把一部分结果保存显得

尤为必要。MATLAB 提供了 imwrite 图像写入函数,该函数能够保存图像数据为一帧一帧

的图像。 具体的 imwrite 图像写入函数使用如下: clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 tic % 运算计时 im = imread('ysw.jpg'); % 读取图像 imshow(im) % 显示图像 imwrite(im,'curve.jpg'); % 保存图像 toc % 计时结束 运行程序输出图像如图 2-48 所示。

图 2-48 图像保存

由此可得到另一幅 curve.jpg 的图像,并保存在当前工作路径下。当用户将该图像保存

到指定路径,例如桌面时,具体的 imwrite 图像写入函数使用如下: imwrite(im,'C:\Users\Administrator\Desktop\curve.jpg'); % 保存图像 当然,MATLAB 也提供了另外的图像保存功能,具体如下: im = imread('ysw.jpg'); % 读取图像 imshow(im) % 显示图像 saveas(gcf,'curve1.jpg') % 保存图像

Page 37: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·113·

该函数 saveas 将整个 fig 一起保存,运行程序得到如图 2-49 所示结果。

图 2-49 saveas 图像保存模式

该 saveas 将整个 fig 保存,因此使得图像边缘也被保留,致使图像外围呈现白色底片。 用户可以采用 imshow 的图像填充模式显示该图像,然后再保存整个 fig,如何实现呢?

具体程序如下: im = imread('ysw.jpg'); % 读取图像 imshow(im,'border','tight') % 显示图像 saveas(gcf,'curve2.jpg') % 保存图像 运行程序输出结果如图 2-50~图 2-51 所示。

图 2-50 图像填充显示 图 2-51 图像保存模式

如图 2-51 所示,图像本身基本填充整个背景,然而由于图像尺寸原因,使得图像仍然

Page 38: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·114·

有一点白色底片,当然用户可以应用其他方法去保存图像,如果图像是长宽相等的图像,

那么采用填充后显示图像,然后保存 fig 是不会有白色底片存在的。 同样 MATLAB 中也可以直接获取图像帧函数去保存图像,具体代码如下: clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 tic % 运算计时 im = imread('ysw.jpg'); % 读取图像 newfig=figure; imshow(im) % 显示图像 set(newfig,'visible','off'); % 设置轴不可见 set(newfig,'color','w'); % 背景色为白色 set(newfig,'Units','default','Position','default'); % 位置设置,figure图形属性设置 f = getframe(newfig); % 抓帧 set(newfig,'visible','off'); % figure不可见 imwrite(f.cdata,'curve3.jpg'); % 保存图像 im = imread('curve3.jpg'); % 读取图像 imshow(im) % 显示图像 toc % 结束计时 运行程序输出结果如图 2-52 所示。

图 2-52 getframe 图像保存

以上三种保存图像的方法各有优点,有的用户只需要进行图像的简单保存,有的用户

需要带坐标轴一起保存图像,有的则需要保存图像到指定的路径,且有边框效果等等,因

此用户可以借鉴上述三种方法进行图像保存,各取长短。

Page 39: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·115·

2.7 视频采集、保存与读取

视频的采集、保存与读取是视频处理的基础,当采用摄像头对场景进行拍摄后,可能

需要保存该视频,就需要掌握 MATLAB 视频保存功能;同样对于一个静态的视频,则需

要对该视频先进行读取,才能进行处理。

2.7.1 视频的采集

视频的采集,顾名思义,就是利用 MATLAB 软件作为视频触发器,相应的摄像头作

为视频采集器,一般的笔记本电脑均带有摄像头,台式电脑没有摄像头,用户也可以通过

USB 口,外接摄像头,从而实现 MATLAB 视频采集。本小节借助于 HP 电脑进行视频的

采集、保存与读取分析,当然,用户也可以根据自己的电脑配置进行相关操作。MATLAB程序具有通用兼容性,用 MATLAB 激发摄像头,进行视频拍摄的具体程序如下:

% Designed by Yu Shengwei From SWJTU University % 2015年 2月 3日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 imaqmem(7e08); % 申请内存空间 tic % 运算计时 vid = videoinput('winvideo',1,'YUY2_320x240'); % 摄像头参数 % 设置摄像头参数 set(vid, 'FramesPerTrigger', Inf); % 帧触发器设置 set(vid, 'ReturnedColorspace', 'rgb') % RGB颜色空间 vid.FrameGrabInterval = 5; % 帧数间隔 % 启动摄像头设备 start(vid) % 采集 100帧后,结束循环 while(vid.FramesAcquired<=100) data = getsnapshot(vid); % 拍摄图像 imshow(data) % 画图 end stop(vid); % 停止 flushdata(vid); % 清除缓存数据 % 清除所有的变量 clear all toc % 计时结束 运行程序得到如图 2-53 所示结果。 如图 2-53 所示图形,通过 MATLAB 可以很轻松地实现视频场景的拍摄。

Page 40: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·116·

(a) (b)

(c) (d)

图 2-53 拍摄场景

2.7.2 视频的保存

视频能够采集之后,用户也许会更加关心能否将这一帧一帧的图像转换成视频存储

呢?MATLAB 可以实现视频的实时拍摄并实时保存为视频格式,实时场景的分析结果同样

可以写为视频,具体的程序如下: % Designed by Yu Shengwei From SWJTU University % 2015年 2月 3日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 imaqmem(7e08); % 申请内存空间 tic % 运算计时 % 将运行的结果保存为一个视频 movie=avifile('ysw','compression','none','fps',15,'keyframe',2.1429,'quality',90); vid = videoinput('winvideo',1,'YUY2_320x240'); % 摄像头参数

Page 41: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·117·

% 设置摄像头参数 set(vid, 'FramesPerTrigger', Inf); % 帧触发器设置 set(vid, 'ReturnedColorspace', 'rgb') % RGB颜色空间 vid.FrameGrabInterval = 5; % 帧数间隔 % 启动摄像头设备 start(vid) % 采集 100帧后,结束循环 while(vid.FramesAcquired<=100) data = getsnapshot(vid); % 拍摄图像 imshow(data) % 画图 movie=addframe(movie,uint8(data)); drawnow; end stop(vid); % 停止 flushdata(vid); % 清除缓存数据 % 清除所有的变量 clear all toc % 计时结束 运行程序将得到 ysw.avi 视频文件。具体如图 2-54 所示。

图 2-54 ysw.avi 视频

生成的 ysw.avi 视频可供用户后续进行视频分析以及算法验证等操作。

2.7.3 视频的读取

当用户将视频保存为.avi 或者.wav 格式的文件时,后期要用到该视频时,就需要对视

频进行再读取及分析,而不是重复去录制视频;现在的很多小区以及高速公路的监控视频,

均采用摄像头进行视频录制,接下来由专业人士对视频进行分析处理。 本小节主要对.avi 格式视频进行分析,对于.wav 视频文件在将 2.8.3 小节进行介绍。 考虑到视频处理的通用性, 常用的一种方法是将视频首先转换为一帧一帧的图像,

具体的转化函数如下: function ysw=video2pic( videoFile, outputPath, picFormat, length ) % 初始化 if nargin < 1 videoFile = input('输入视频路径:', 's'); outputPath = input('输入视频输出路径:', 's');

Page 42: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·118·

if isempty(outputPath) outputPath = videoFile(1, 1:find(videoFile=='\', 1, 'last')-1); end picFormat = input('Input output pic format[JPG by default]:'); if isempty(picFormat) picFormat = 'JPG'; % 默认数值图像格式 end end % 主程序部分 videoObject = VideoReader(videoFile); % 读取视频 numFrames = get(videoObject, 'numberOfFrames'); % 视频帧数 fileName = get(videoObject, 'Name'); % 视频名字 numOrder = max(4, size(int2str(numFrames), 2)); % 间隔帧数 mkdir(outputPath); indexFrame = [1 1]; frameLimit = 100; % 帧数设置上限 j=0; % 初始化 while indexFrame(1, 1) <= numFrames % 小于帧数量,以免超出电脑 memory indexFrame(1, 2) = min(numFrames, indexFrame(1, 1) + frameLimit); frameAll = read(videoObject, indexFrame); % 读取该帧图像 for i = indexFrame(1, 1):5:indexFrame(1, 2) % 保存为图像 imgFrame = frameAll(:,:,:,i - indexFrame(1, 1) + 1); saveFormat = strcat(int2str(((i+length)-4*j)),'.jpg'); % 图像名字 picName = sprintf(saveFormat, outputPath, fileName, ((i+length)-4*j), picFormat); % 输出显示 imwrite( imgFrame, strcat(outputPath, picName),'jpg'); % 写入图像 disp(picName); % 显示图像名字,也可以不显示 j=j+1; end indexFrame(1, 1) = indexFrame(1, 2) + 1; end ysw=(i+length)-4*(j-1); end 针对采集的 ysw.avi 视频进行分析,具体如下: clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 imaqmem(7e08); % 申请内存空间 spname = '.'; % 获取视频路径 savename = '.\ysw_pic'; % 获取视频帧图像保存路径 l=video2pic(strcat(spname,'\ysw.avi'),strcat(savename,'\'),'jpg',0); % 视频总帧数 运行程序输出结果如下: 1.jpg 2.jpg 3.jpg 4.jpg

Page 43: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·119·

5.jpg …… 16.jpg 17.jpg 18.jpg 19.jpg 20.jpg 则程序将视频分为 20 个 jpg 图像。同时在工作路径生成相应的 jpg 图像,具体如图 2-55

所示。

图 2-55 图像文件

通过上述的视频转换为图像文件的方法,可以分析任意格式的视频文件,用户通过一

帧一帧图像分析,可以内嵌不同的算法进行处理,从而找出一个 合适的算法,进行后续

的图像分割以及识别等操作。

2.8 音频采集、保存与读取

本节将分析如何借助于 MATLAB 进行音频数据采集,然后将采集的音频数据保存到

用户指定的文件夹,供后续读取、分析与处理。

2.8.1 音频数据的采集

现今较多的笔记本均有语音设备,MATLAB 也支持通过音频串口直接获取声音源数

据,同样台式机也可以插入录音设备然后进行录音操作。对于音频数据的采集,MATLAB提供了强大的技术支持,然而有一点弊端就是 MATLAB 提供的音频数据获取,只能获取

一定量的音频数据,不然 MATLAB 无法用某一个数据矩阵进行保存,因此录音需要进行

不断地掉帧录音,即不断地释放录音、不断地再录音操作,具体的程序如下: % Designed by Yu Shengwei From SWJTU University % 2015年 2月 3日

Page 44: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·120·

clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 imaqmem(7e08); % 申请内存空间 tic % 运算计时 aud = audiodevinfo; % 声音设备 % 初始化 RecordLength = 5; % 录音时间 s ShowLength = 5; % 显示的时间长度 s FrequencyWindow1 = 0; FrequencyWindow2 = 3000; fs = 44100; % 采样频率 nBits = 16; mag = 1.05; % 显示幅值倍数 idx_last = 1; recObj = audiorecorder(fs,nBits,1); % 录音设备 record(recObj,RecordLength); % 录音 while toc<.1 end bit = 2; % 2bit % 声音源数据显示 h=figure('numbertitle','off','name','锤声音设别—ysw'); set(h,'color','g'); while toc<RecordLength myRecording = getaudiodata(recObj); % 录音数据保存 idx = round(toc*fs); while idx-idx_last<.1*fs idx = round(toc*fs); end plot((max(1,size(myRecording,1)-fs*ShowLength):(2^bit):size (myRecording,1))./fs,myRecording(max(1,size(myRecording,1)-fs* ShowLength):(2^bit):end)) mag = max(abs(myRecording)); % 幅值 ylim([-1.2 1.2]*mag) % y轴显示范围

% x轴显示范围 xlim([max(0,size(myRecording,1)/fs-ShowLength) max(size(myRecording,1)/fs,ShowLength)]) drawnow % 刷新 idx_last = idx; ysw = myRecording; end 运行程序输出图形如图 2-56 所示。 当录音过程中,突然有人打喷嚏或者是拍手掌时,则音频数据将发生突变,如图 2-57~

图 2-58 所示。

Page 45: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·121·

图 2-56 平稳录音

图 2-57 拍一次手掌 图 2-58 拍两次手掌

当对录音数据进行实时分析时,则需要不断地掉帧录音,释放录音源再重启录音设备,

达到实时的效果,具体的程序如下: % 声音源数据显示 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 imaqmem(7e08); % 申请内存空间 tic % 运算计时 h=figure('numbertitle','off','name','KTV 内响锤声音设别—余胜威—西南交通大学'); set(h,'color','g'); % 5秒的数据长度

Page 46: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·122·

for num_ysw = 1:4 % 重启 4次录音设备 clc,clear all %,close all aud = audiodevinfo; % 声音设备 % 初始化 RecordLength = 20; % 录音时间 s ShowLength = 5; % 显示的时间长度 s fs = 44100; % 采样频率 nBits = 16; bit = 2; recObj = audiorecorder(fs,nBits,1); % 录音设备 record(recObj,RecordLength); % 录音 tic while toc<0.1 end while toc<RecordLength myRecording = getaudiodata(recObj); % 声音信号图 subplot(221),plot((max(1,size(myRecording,1)-fs*ShowLength):(2^bit):size(myRecording,1))./fs,myRecording(max(1,size(myRecording,1)-fs*ShowLength):(2^bit):end),'linewidth',2 ) mag = max(abs(myRecording)); % 幅值 ylim([-1.2 1.2]*mag) xlim([max(0,size(myRecording,1)/fs-ShowLength) max(size(myRecording,1)/fs,ShowLength)]) xlabel('Time(s)');ylabel('Magnitude');box off % 谱图 subplot(222),x1 = myRecording(max(1,size(myRecording,1)-fs*ShowLength):(2^bit):end); % 截取分析数据 X=stfth(x1',256); % STFT短时傅里叶变换 spectrogram(x1,2^9/(2^bit),2^7/(2^bit),2^12/(2^bit),fs/(2^bit)) view(90,-90); xlim([0 3000]); ylim([0 ShowLength]); xlabel('Frequency, Hz'); % 响锤音检测 subplot(223), plot( sum(abs(X')),'linewidth',5 ) axis xy;axis tight;box off xlabel('Time(s)'); ylabel('Energy') thre = 100; for i = 1: size(X,1) if sum(abs(X(i,:)))>thre fea_thre(i)=1; else fea_thre(i)=0; end end subplot(224), plot( fea_thre,'linewidth',5 ) axis xy;axis tight;box off xlabel('Time(s)'); ylabel('Energy') drawnow end delete(recObj); % 删除录音设备

Page 47: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·123·

drawnow end % 录音声音重放 % sound(myRecording, fs);

2.8.2 音频数据的保存

将音频数据进行赋值操作,然后保存该数据数组即可实现音频数据的保存,具体如下: clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 imaqmem(7e08); % 申请内存空间 tic % 运算计时 aud = audiodevinfo; % 声音设备 % 初始化 RecordLength = 5; % 录音时间 s ShowLength = 5; % 显示的时间长度 s FrequencyWindow1 = 0; FrequencyWindow2 = 3000; fs = 44100; % 采样频率 nBits = 16; mag = 1.05; idx_last = 1; recObj = audiorecorder(fs,nBits,1); % 录音设备 record(recObj,RecordLength); % 录音 while toc<.1 end bit = 2; % 2bit % 声音源数据显示 h=figure('numbertitle','off','name','锤声音设别——ysw'); set(h,'color','g'); while toc<RecordLength myRecording = getaudiodata(recObj); % 录音数据保存 idx = round(toc*fs); while idx-idx_last<.1*fs idx = round(toc*fs); end plot((max(1,size(myRecording,1)-fs*ShowLength):(2^bit):size(myRecording,1))./fs,myRecording(max(1,size(myRecording,1)-fs*ShowLength):(2^bit):end)) mag = max(abs(myRecording)); % 幅值 ylim([-1.2 1.2]*mag) % y轴显示范围 % x轴显示范围 xlim([max(0,size(myRecording,1)/fs-ShowLength) max(size(myRecording,1)/fs,ShowLength)]) drawnow % 刷新 idx_last = idx; ysw = myRecording;

Page 48: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·124·

end save ysw.mat ysw % 录音声音重放 sound(ysw, fs); 用户通过录音重放,也可以听到录音的声音。 同样用户也可以将录音数据保存为 wav 格式,具体如下: wavwrite(ysw,'ysw.wav') 运行该语句,得到 ysw.wav 语音文件,如图 2-59 所示。

图 2-59 ysw.wav 语音文件

2.8.3 音频数据的读取

假设当音频数据以 mat 格式存取,直接进行音频数据读取,程序如下: clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 imaqmem(7e08); % 申请内存空间 tic % 运算计时 load('ysw.mat') plot(ysw) grid on % 清除所有的变量 clear all toc % 计时结束 运行程序输出图形如图 2-60 所示。

Page 49: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 2 章 MATLAB 常用文件操作

·125·

图 2-60 音频数据显示

当更多的音频以 wav 的格式保存,如何读取 wav 格式的音频数据显得很关键,具体如下: clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 % 加载 a .wav 音频 [x, fs] = wavread('track.wav'); % 获取采样率 samples x = x(:, 1); % 得到第一个通道 plot(x) % 画图 grid on 运行程序输出图形如图 2-61 所示。

图 2-61 wav 音频数据获取

2.9 本 章 小 结

本章对常用文件进行了详细的说明,用户阅读本章可以很清晰地掌握常用文件的读

取、写入和保存等操作,从而使得不同的文件之间可以相互嵌套使用,提高用户工作效率。

Page 50: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

MATLAB 弹出窗口有很多,主要方便用户进行程序调试状态查看,例如报错窗口,能

够较迅速地获取程序运行到哪个地方报错了;文本打开窗口用于提示用户打开哪一个文件

进行操作,因此 MATLAB 弹出窗口定义的学习显得尤为必要。

3.1 文件打开操作 uigetfile

MATLAB 文件打开操作命令为 uigetfile,用户可以根据该命令进行文件打开操作,具

体的 uigetfile 命令的使用帮助如下: >> help uigetfile uigetfile - Open standard dialog box for retrieving files This MATLAB function displays a modal dialog box that lists files in the current folder and enables you to select or enter the name of a file. filename = uigetfile [FileName,PathName,FilterIndex] = uigetfile(FilterSpec) [FileName,PathName,FilterIndex] = uigetfile(FilterSpec,DialogTitle) [FileName,PathName,FilterIndex] = uigetfile(FilterSpec,DialogTitle,DefaultName) [FileName,PathName,FilterIndex] = uigetfile(...,'MultiSelect',selectmode) MATLAB 提供 5 种 uigetfile 打开功能,每一种打开方式适应一类打开模式,此 5 类打开

方式能满足用户所有打开文件操作的需求,下面将对 uigetfile 函数具体的用法进行详细介绍。 (1)直接使用 uigetfile 函数,即在 MATLAB 命令窗口输入 uigetfile 函数,如图 3-1 所示。

图 3-1 uigetfile 打开操作

Page 51: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·127·

如图 3-1 所示,直接在 MATLAB 命令行窗口输入 uigetfile 命令,弹出一个文件选择窗

口,默认文件格式为所有 MATLAB 文件格式,并且默认路径为当前路径,用户可以在这

个窗口下进行路径选择,并在设定好的路径下选择相应的要打开的文件。 (2)用 uigetfile 函数打开指定格式的文件,方便用户快速打开文件,例如打开.m 文件,

具体的操作如图 3-2 所示。

图 3-2 m 文件打开操作

如图 3-2 所示,在命令窗口输入 uigetfile(‘.m’),则弹出默认为.m 文件的打开界面,在

当前路径下,ysw3_1.m 是唯一一个以.m 为后缀的文件,则用户可以很快速地选择。 当用户单击【打开】按钮,则返回打开的文件的文件名,具体如下: >> uigetfile('.m') % 选择.m文件 ans = ysw3_1.m 用户也可以对打开界面提示的文件进行修改,如图 3-2 中的【选择要打开的文件】为

默认说明,用户也可以进行修改,具体操作如图 3-3 所示。

图 3-3 提示文字修改操作

Page 52: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·128·

具体的代码如下: >> uigetfile('.m','请打开.m文件的文件——余胜威') ans = ysw3_1.m 能够获取文件名称后,那么能不能继续获取打开的文件所在的路径呢?如何获取打开

的文件所在的路径呢?具体的方法如下: >> [filename, pathname] = uigetfile('.m','请打开.m文件的文件——余胜威') filename = ysw3_1.m pathname = F:\MATLAB Edit 2013a\MATLAB Edit 2012B\ysw\book\GUI设计手册\第 3章\ (3)多种后缀文件进行选择性的打开操作。我们知道,不同格式的文件有很多,怎么

样去选择打开多种不同后缀的文件呢?uigetfile 函数提供了相应的操作功能,具体的使用

方法如下: [filename, pathname] = ... uigetfile({'*.m';'*.slx';'*.mat';'*.*'},'File Selector'); 运行程序弹出如图 3-4 所示的窗口,可以进行不同格式文件的选择操作。

图 3-4 多种格式文件选择

如图 3-4 所示,单击【MATLAB 代码文件(*.m)】,弹出下拉菜单,下拉菜单含有

代码指定的几种格式文件,如 Simulink Models(*.slx,*.mdl)文件、MAT 文件(*.mat)以及所有文件(*.*)等,用户选择不同的格式文件,则只显示该格式文件,从而方便用户

进行盲操作,即适应不同的文件的操作,从而增强代码的可执行性。

Page 53: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·129·

增加不同格式文件的操作,具体如下: [filename, pathname] = uigetfile( ... {'*.m;*.fig;*.mat;*.slx;*.mdl',... 'MATLAB Files (*.m,*.fig,*.mat,*.slx,*.mdl)'; '*.m', 'Code files (*.m)'; ... '*.fig','Figures (*.fig)'; ... '*.mat','MAT-files (*.mat)'; ... '*.mdl;*.slx','Models (*.slx, *.mdl)'; ... '*.*', 'All Files (*.*)'}, ... 'Pick a file'); % 设置显示不同格式的文件,.m为 MATLAB脚本文件的后缀名 对于不同的图像格式的文件操作,具体如下: uigetfile({'*.jpg;*.tif;*.png;*.gif','All Image Files';... '*.*','All Files' ; '*.jpg','.jpg图像' ; '*.tif','.tif图像' ; '*.png','.png图像' ; '*.gif','.gif图像' ; '*.bmp','.bmp图像' ;}) % 设置显示图像后缀名 (4)指定路径的文件打开操作。

简单的操作,就是直接打开某一个文件,例如: [filename, pathname, filterindex] = uigetfile({'*.*','All Files' }, 'mytitle',... 'F:\MATLAB Edit 2013a\MATLAB Edit 2012B\ysw\book\GUI设计手册\第 3 章\ysw3_1.m') 运行该文件得到: filename = ysw3_1.m pathname = F:\MATLAB Edit 2013a\MATLAB Edit 2012B\ysw\book\GUI设计手册\第 3章\ filterindex = 1 打开文件窗口如图 3-5 所示。

图 3-5 指定文件

Page 54: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·130·

如图 3-5 所示,ysw3_1.m 文件被指定,用户只需要单击【打开】按钮即可。 当用户不需要指定具体的文件名,而需要打开某一类型文件时,代码如下: uigetfile('F:\MATLAB Edit 2013a\MATLAB Edit 2012B\ysw\book\GUI 设计手册\','.m') 打开文件之后,如何执行该文件呢?MATLAB 有 run 函数可供调用,具体的使用如下: clc,clear,close all % 清屏和清除工作区 warning off % 取消警告 [filename, pathname, filterindex] = uigetfile({'*.*','All Files' }, 'mytitle',... 'F:\MATLAB Edit 2013a\MATLAB Edit 2012B\ysw\book\GUI设计手册\第 3 章\ysw3_1.m') run(filename) % 执行 filename文件 其中 ysw3_1.m 文件如下: % Designed by Yu Shengwei From SWJTU University % 2015年 2月 23日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 tic % 运算计时 ysw = [1,1,7,4,0,6,3,0,8,7]; toc % 计时结束 运行程序之后,得到如图 3-6 所示结果。

图 3-6 .m 文件执行操作

学习和掌握 uigetfile 函数之后,读者朋友们将更加对 MATLAB 的快捷性和简便性所

吸引。uigetfile 函数介绍之后,接下来让我们来学习一下路径选择对话框 uigetdir 函数。

Page 55: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·131·

3.2 路径选择对话框 uigetdir

对于路径选择对话框,是文件读取操作过程中的一个环节,MATLAB 单独提供了路径

选择对话框 uigetdir 函数,主要应对大数据处理时,实现文件路径的实时切换,以提高程

序执行的效率。 MATLAB 中 uigetdir 函数的使用帮助如下: >> help uigetdir uigetdir - Open standard dialog box for selecting directory This MATLAB function displays a modal dialog box enabling you to navigate the folder hierarchy and select a folder or type the name of a folder. folder_name = uigetdir folder_name = uigetdir(start_path) folder_name = uigetdir(start_path,dialog_title) 从帮助文档可知,uigetdir 函数是供用户选择路径所用,使用该 uigetdir 函数,会弹出

一个路径选择对话框,供用户较快较好地使用。uigetdir 主要分为 3 种使用格式:直接使用、

设置路径使用以及修改对话框标题的路径选择对话框。具体的使用如下。 (1)uigetdir 的直接使用。uigetdir 的直接使用,顾名思义就是在 MATLAB 命令行窗口

输入 uigetdir 函数,按键盘回车键,即可实现路径选择对话框的选择命令,具体如下: uigetdir % 直接打开选择文件 运行程序,得到如图 3-7 所示结果。

图 3-7 uigetdir 使用

如图 3-7 所示,弹出一个路径选择对话框,标题为【选择要打开的目录】,用户可以

Page 56: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·132·

选择数据所在的文件夹即可。 (2)指定某个盘符下的文件夹路径。uigetdir 函数提供可供路径输入的功能,即定位到

某一个路径下,用户在该路径下进行文件夹选择,具体的代码如下: clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 dname = uigetdir('C:\') % 打开 C盘文件 该程序指定为 C 盘符路径下,用户在 C 盘下进行文件夹选择,从而避免用户回到【我

的电脑】界面去选择盘符,从而提高使用效率。 运行程序得到如图 3-8 所示结果。

图 3-8 C 盘路径

得到文件夹名称如下: dname = C:\Users 同样,对 C 盘下“用户文件夹”下的文件夹进行读取,该如何操作呢?直接将“用户

文件夹”输入为路径即可,程序如下: >> dname = uigetdir('C:\Users\') dname = C:\Users\ysw 由此可知,采用 uigetdir 在指定路径下进行文件夹选择操作显得较简便易行。

(3)MATLAB 根路径文件夹操作。读取 MATLAB 根目录路径,在根目录路径下进行

文件夹操作。MATLAB 提供了简便的根目录函数,具体的使用如下: clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 dname = uigetdir(matlabroot,'MATLAB根目录路径')

Page 57: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·133·

运行程序输出图形如图 3-9 所示。

图 3-9 MATLAB 根目录路径

MATLAB 命令行显示根目录路径如下: dname = C:\Program Files\MATLAB\R2014a\bin 由此可知道,该 MATLAB 版本为 2014a,安装在 C 盘 Program Files 文件夹下。

(4)其他命令。对于获取当前工作路径,MATLAB 提供更加简便的路径提取函数进行

路径读取,具体的使用如下: >> cd % 获取当前工作路径 F:\MATLAB Edit 2013a\MATLAB Edit 2012B\ysw\book\GUI设计手册\第 3章 当输入 C 盘盘符时,cd 函数直接将工作路径指向 C 盘路径下,具体如图 3-10 所示。

图 3-10 C 盘工作路径

返回到上一级工作路径,程序如下: >> cd('F:\MATLAB Edit 2013a\MATLAB Edit 2012B\ysw\book\GUI设计手册\第 3章')

Page 58: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·134·

文件路径选择功能在大数据处理中,应用较广泛,本节比较系统而全面地介绍了路径

选择功能,用户完全可在此基础上游刃有余地进行拓展操作。

3.3 文件保存操作 uiputfile

Uiputfile 用于实现文件保存操作,在实际程序应用设计中,时常应用到,具体的 uiputfile命令含义如下:

>> help uiputfile uiputfile - Open standard dialog box for saving files This MATLAB function displays a modal dialog box for selecting or specifying a file you want to create or save. FileName = uiputfile [FileName,PathName] = uiputfile [FileName,PathName,FilterIndex] = uiputfile(FilterSpec) [FileName,PathName,FilterIndex] = uiputfile(FilterSpec,DialogTitle) [FileName,PathName,FilterIndex] = uiputfile(FilterSpec,DialogTitle, DefaultName) uiputfile 的参考页 另请参阅 save, uigetdir, uigetfile, uisave 由 MATLAB 的帮助文档可知,uiputfile 有 5 种使用方式,并且 uiputfile 命令常和 save、

uigetdir、uigetfile 和 uisave 等命令连用。

1.使用uiputfile命令返回文件名

直接使用 uiputfile 命令即可返回文件名,具体的使用方法就是直接在 MATLAB 命令

行窗口输入 uiputfile 命令,具体如图 3-11 所示。

图 3-11 输入 uiputfile 命令并回车

Page 59: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·135·

如图 3-11 所示为直接输入 uiputfile 命令并回车的结果,得到当前路径下的文件夹,在

此处如果关掉弹出的【选择要写入的文件】窗口,则返回 0,如果输入 ysw3_3,再单击【保

存】按钮,则返回如下结果: >> uiputfile % 输入文件 ans = ysw3_3.rpt 如果输入 ysw3_3.m 则返回 ysw3_3.m,具体如下: >> uiputfile % 输入文件 ans = ysw3_3.m 由此可知,MATLAB 中 uiputfile 命令默认的文件名后缀为.rpt,需要用户注意。

2.直接输入uiputfile

返回文件名和路径。该命令也是在 MATLAB 命令行直接输入 uiputfile 然后返回文件

夹名称以及路径,具体如图 3-12 所示。

图 3-12 选择存在的 ysw3_3.m 文件

如图 3-12 所示,选择已知的 ysw3_3.m 文件,则返回相应的文件名和路径,具体如下: >> [pathname,path]=uiputfile %获取输入文件名和路径 pathname = ysw3_3.m path = F:\MATLAB Edit 2013a\MATLAB Edit 2012B\ysw\book\GUI设计手册\第 3章\

Page 60: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·136·

>> 在选中某文件的时候,会提示如图 3-13 所示的对话框,然而这个对话框需要选择【是】,

即替换 ysw3_3.m 脚本文件,该替换操作不会改变 ysw3_3.m 脚本文件里面的内容,而仅仅

是对文件名称以及文件所在路径的提取。

图 3-13 选择提示对话框

如图 3-13 所示,单击【是】按钮,返回文件名称以及文件所在路径。

3.输入要读取的文件的后缀

从而定位文件名和路径,具体的使用如下: [FileName,PathName,FilterIndex] = uiputfile(FilterSpec) % 定位文件名和路径 (1)当不指定文件名的后缀时,可直接输入如下代码: [FileName,PathName,FilterIndex] = uiputfile('') % 定位文件名和路径 运行程序输出图形如图 3-14 所示。

图 3-14 带输入的 uiputfile 使用

Page 61: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·137·

当选择 ysw3_3.m 文件时,得到的结果如下: >> [FileName,PathName,FilterIndex] = uiputfile('') % 定位文件名和路径 FileName = ysw3_3.m PathName = F:\MATLAB Edit 2013a\MATLAB Edit 2012B\ysw\book\GUI设计手册\第 3章\ FilterIndex = 1 (2)当指定文件名的后缀,例如.mat 文件时,则对话框只提示相应的.mat 文件供用户

选择,具体的使用如下: >> [FileName,PathName,FilterIndex] = uiputfile('.mat') % 定位,mat文件名和路径 FileName = data.mat PathName = F:\MATLAB Edit 2013a\MATLAB Edit 2012B\ysw\book\GUI设计手册\第 3章\ FilterIndex = 1 运行程序输出图形如图 3-15 所示。

图 3-15 .mat 文件获取

4.采用uiputfile修改提示对话框标题

MATLAB 提供用于修改对话框标题的操作,具体的使用格式如下:

Page 62: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·138·

[FileName,PathName,FilterIndex] = uiputfile(FilterSpec,DialogTitle)

% 修改输入文件选择标题 其中 DialogTitle 为对话框的标题,具体的使用如下。

(1)采用默认格式,具体如下: [FileName,PathName,FilterIndex] = uiputfile('.mat','') % 选择.mat文件 具体如图 3-16 所示。

图 3-16 标题“选择要写入的文件”

如图 3-16 可知,MATLAB 默认的对话框标题为【选择要写入的文件】。 (2)当修改标题时,具体操作如下: >> [FileName,PathName,FilterIndex] = uiputfile('.mat','请选择文件') FileName = data.mat PathName = F:\MATLAB Edit 2013a\MATLAB Edit 2012B\ysw\book\GUI设计手册\第 3章\ FilterIndex = 1 运行程序输出图形如图 3-17 所示。

5.指定uiputfile函数要选择的文件名

具体的使用格式如下: [FileName,PathName,FilterIndex] = uiputfile(FilterSpec,DialogTitle, DefaultName) % 选择指定的文件

Page 63: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·139·

图 3-17 标题修改为“请选择文件”

DefaultName 为要选择的文件的文件名,用户可以直接写入选择对话框,具体的使用

格式如下: >> [FileName,PathName,FilterIndex] = uiputfile('.m','请选择文件','ysw3_3') FileName = ysw3_3.m PathName = F:\MATLAB Edit 2013a\MATLAB Edit 2012B\ysw\book\GUI设计手册\第 3章\ FilterIndex = 1 运行程序输出对话框如图 3-18 所示。

图 3-18 指定文件名名称

Page 64: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·140·

如图 3-18 所示,选择对话框直接写入文件名名称“ysw3_3”,用户此时不需要用鼠标

选中某一个文件,直接单击【保存】按钮即可。 MATLAB 提供 uiputfile 函数供用户使用,用户可以通过指定某个文件名,然后执行,

从而达到程序的高效率执行,增强人机互动性能。

3.4 程序运行进度条 waitbar

waitbar 函数为 MATLAB 程序运行进度条,也就是说,使用 waitbar 函数,可以看到程

序的运行进度,从而增强可视化效果,让用户了解运行的进度。 具体的 waitbar 函数使用如下: >> help waitbar waitbar - Open or update wait bar dialog box This MATLAB function displays a wait bar of fractional length x. h = waitbar(x,'message') waitbar(x,'message','CreateCancelBtn','button_callback') waitbar(x,'message',property_name,property_value,...) waitbar(x) waitbar(x,h) waitbar(x,h,'updated message') waitbar 的参考页 另请参阅 close, delete, dialog, getappdata, msgbox, setappdata >> waitbar 函数能够增加用户对于程序执行位置的判断,具体的函数使用有 6 种模式,以

下一一进行介绍。 (1)采用图形句柄,进行进度查看,具体的使用格式如下: h = waitbar(x,'message') % 程序运行状态显示 其中 h 为图形句柄,x 为 0~1 之间,message 为显示信息,具体使用如下: >> h = waitbar(1,'message') % 程序运行状态显示 h = 0.0016 运行程序输出结果如图 3-19 所示。 如图 3-19 所示,运行程序得到红色的对话框,进度对话框显示为“message”,x=1,

在这一步运算中,waitbar 直接为运行完毕,运行时间为 0.0016 秒。 例如修改运行提示信息,具体代码如下: h = waitbar(1,'程序运行中') 运行程序输出结果如图 3-20 所示。

Page 65: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·141·

图 3-19 waitbar 使用模式

图 3-20 “程序运行中”提示框

对于如图 3-19~图 3-20 中的程序运行对话框,可用程序关闭图形句柄 h,如下: >> close(h) % 关闭 h close 函数表示关闭图形句柄 h。 同样,MATLAB 还提供 delete 函数删除 h 句柄,释放 MATLAB 执行内存,具体的使

用如下: delete(h) % 删除 h 为了动态显示 waitbar 进度显示效果,采用如下程序进行执行显示,具体代码如下: clc,clear,close all % 清屏和清理工作区 warning off % 取消警告 h = waitbar(0,'Please wait...'); % 提示等待 steps = 1000; % 计算次数 for step = 1:steps % 程序运行状态进度 waitbar(step / steps) % 程序执行状态,即执行位置 end close(h) 运行程序可看到进度条的动态显示过程,如图 3-21~图 3-22 所示。

Page 66: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·142·

图 3-21 进度条状态 1 图 3-22 进度条状态 2

(2)wairbar 对话框提供取消运行按钮,具体的使用如下: waitbar(x,'message','CreateCancelBtn','button_callback') % 增加取消按钮 CreateCancelBtn 为取消按钮,button_callback 为取消该 waitbar 函数执行状态。可以关

闭 waitbar 进度条,也可以删除 waitbar 进度条,具体的使用如下: >> h=waitbar(0.1,'message','CreateCancelBtn','delete_h(h)') 相应的取消函数程序如下: function delete_h(h) % 删除 h句柄 delete(h) 执行该程序,得到如图 3-23 所示结果。

图 3-23 带取消按钮的进度条

如图 3-23 所示,单击【取消】按钮,即可删除该 waitbar 进度条。 也可以不用函数进行删除,而是直接输入,程序如下: >> h=waitbar(0.1,'message','CreateCancelBtn','button_callback') % 增加取消按钮 button_callback h = 6.0029 此时得到相应的对话框如图 3-24 所示。

Page 67: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·143·

图 3-24 不添加函数的 waitbar 进度条

此时如果单击关闭如图 3-24 的进度条,系统会提示如下错误: 未定义函数或变量 'button_callback'。 Error while evaluating figure CloseRequestFcn 此时我们没有指定 button_callback 函数,因此会出现报错的提示,然而 waitbar 进度条

依然不能关闭,此时应该使用 delete 函数才能关闭该进度条,具体如下: >> delete(h) (3)waitbar 进度条标题修改。 waitbar(x,'message',property_name,property_value,...) 其中,property_name 为进度条的标题名字,property_value 为标题的名称,具体的使

用如下: >> h=waitbar(0.1,'message','name','余胜威') h = 6.0032 运行程序输出图形如图 3-25 所示。

图 3-25 对话框标题修改

(4)直接使用 waitbar 函数。

Page 68: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·144·

具体的使用格式如下: waitbar(x) x 为 0~1 之间,具体使用如下: >> waitbar(0.1) % 默认显示 运行程序输出图形如图 3-26 所示。

图 3-26 waitbar 默认信息

如图 3-26 所示的 waitbar 进度条信息显示,默认为“进度条”。 (5)修改 waitbar 显示信息。 waitbar(x,h) % 等待

具体的使用如下: waitbar(0.1,'2*x'); % 显示为 2*x 得到的结果如图 3-27 所示。

图 3-27 进度条信息修改

(6)更新进度条信息显示值。 waitbar(x,h,'updated message') 在此显示 pi 的计算值的变化情况,编写函数如下: function [valueofpi step] = approxpi(steps) h = waitbar(0,'1','Name','Approximating pi...',... 'CreateCancelBtn',... 'setappdata(gcbf,''canceling'',1)'); % 程序执行状态设置,增加【取消】按钮 setappdata(h,'canceling',0) % 是否单击了【取消】按钮 % Approximate as pi^2/8 = 1 + 1/9 + 1/25 + 1/49 + ... % 逼近结果 pisqover8 = 1; % 初始化 1 denom = 3; % 步长 1/3^2 valueofpi = sqrt(8 * pisqover8); % pi值

Page 69: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·145·

for step = 1:steps % 步数 % 是否单击【取消】按钮 if getappdata(h,'canceling') % 是否单击了【取消】按钮 break % 暂停 end % Report current estimate in the waitbar's message field waitbar(step/steps,h,sprintf('%12.9f',valueofpi)) % 显示计算值 % Update the estimate pisqover8 = pisqover8 + 1 / (denom * denom); % 更新 denom = denom + 2; % 更新,1/9 , 1/25 ,1/49 ,... valueofpi = sqrt(8 * pisqover8); % 估计值,pi^2/8 = 1 + 1/9 + 1/25 + 1/49 + ... end delete(h) % DELETE the waitbar; don't try to CLOSE it 相应的调用主程序如下: [estimated_pi steps] = approxpi(10000) 运行程序得到如图 3-28~图 3-31 所示的结果。

图 3-28 进度条信息更新 1 图 3-29 进度条信息更新 2

图 3-30 进度条信息更新 3 图 3-31 进度条信息更新 4

由此可知,MATLAB 提供的 waitbar 函数使用功能非常丰富,用户可以根据自己的需

求进行相应的进度条设计。

3.5 错误提示对话框 errordlg

MATLAB 提供了 errordlg 错误对话框,用于显示程序的错误提示及报警信息,具体的

errordlg 的使用格式如下: >> help errordlg errordlg - Create and open error dialog box This MATLAB function creates and displays a dialog box with title Error Dialog that contains the string This is the default error string.

Page 70: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·146·

h = errordlg h = errordlg(errorstring) h = errordlg(errorstring,dlgname) h = errordlg(errorstring,dlgname,createmode) errordlg 的参考页 另请参阅 dialog, figure, helpdlg, inputdlg, listdlg, msgbox, questdlg, uiresume, uiwait, warndlg >> errordlg 用于提示程序错误信息,对于程序的调试很重要。

(1)errordlg 的直接使用。 MATLAB 提供了 errordlg 的直接使用功能,具体的使用格式如下: >> h=errordlg % 直接使用 h = 0.0029 直接运行 h = errordlg 时,得到如图 3-32 所示结果。 如图 3-32 所示为错误提示,错误窗口界面显示“这是默认错误字符串”,对于该对话

框的出现,可以直接单击【确定】按钮关闭该对话框。 (2)修改错误提示字符串。 h = errordlg(errorstring) % 带字符串的错误提示 用户在进行程序调试时,可以对程序错误来源进行定性分析,即指定程序可能存在的

问题,具体的使用如下: >> h=errordlg('矩阵的维数不同') h = 0.0034 运行程序得到如图 3-33 所示对话框。

图 3-32 错误提示 图 3-33 指定错误类型对话框

如图 3-33 所示,对话框提示“矩阵的维数不同”。 当然,用户可以分开输入,具体使用如下: >> h=errordlg('矩阵的''维数不同')

Page 71: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·147·

运行程序仍然得到如图 3-33 所示对话框。 如果需要多行显示,则输入: >> errordlg({'程序' '警告'}) 运行程序得到如图 3-34 所示对话框。

图 3-34 多行显示

(3)指定错误的类型,并修改对话框标题。 h = errordlg(errorstring,dlgname) %指定错误的类型 如图 3-32~图 3-34 所示,错误对话框的标题默认为【错误对话框】,在此可以对对话

框标题进行修改,具体的使用如下: >> h=errordlg('矩阵的维数不同','余胜威-程序纠错') %指定错误的类型 h = 0.0039 运行程序得到如图 3-35 所示对话框。

(4)修改对话框信息显示。 h = errordlg(errorstring,dlgname,createmode) % 修改对话框信息显示 creatmode 可以为字符串,也可以为一个结构体。如果 creatmode 为字符串,则 creatmode

为 modal、non-modal (default)或 replace 三者之一,具体的使用如下: mode = struct('WindowStyle','non-modal',... 'Interpreter','tex'); % 显示格式设置 h = errordlg('Try this equation instead: f(x) = x^2',... % 修改对话框信息显示 'Equation Error', mode); 运行程序得到如图 3-36 所示对话框。

图 3-35 标题修改 图 3-36 non-modal (default)显示模式

Page 72: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·148·

修改 mode 如下: >> mode = struct('WindowStyle','modal',... 'Interpreter','tex'); % 显示样式设置 >> h = errordlg('Try this equation instead: f(x) = x^2',... 'Equation Error', mode); % 修改对话框信息显示 运行程序得到如图 3-37 所示对话框。

图 3-37 modal 显示模式

由此可知,MATLAB 提供的 errordlg 对话框模式是很丰富的,用户可以在程序中指定

可能的错误来源,从而更好地定位程序的 debug 源头。

3.6 警告提示对话框 warndlg

warndlg 警告提示对话框和错误对话框类似,用于警告提示之用。具体的 warndlg 使用

格式如下: >> help warndlg warndlg - Open warning dialog box This MATLAB function displays a dialog box named Warning Dialog containing the string This is the default warning string. h = warndlg h = warndlg(warningstring) h = warndlg(warningstring,dlgname) h = warndlg(warningstring,dlgname,createmode) warndlg 的参考页 另请参阅 dialog, errordlg, figure, helpdlg, inputdlg, listdlg, msgbox, questdlg, uiresume, uiwait, warning >> 从帮助信息可看出,warndlg 警告提示对话框主要包括 4 种使用方式,以下将一一介绍。

(1)warndlg 的直接使用。 MATLAB 提供了 warndlg 的直接使用功能,具体的使用格式如下: >> h=warndlg % 直接使用 h =

Page 73: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·149·

0.0032 >> 直接运行 h = warndlg 时,得到如图 3-38 所示结果。 如图 3-38 所示为警告提示对话框,警告提示对话框窗口界面显示“这是默认警告字符

串”,对于该对话框的出现,可以直接单击【确定】按钮关闭该对话框。 (2)修改警告提示字符串。 h = warndlg(warningstring) % 修改警告提示字符串 用户在进行程序调试时,可以对程序警告来源进行定性分析,即指定程序可能存在的

问题,具体的使用如下: >> h = warndlg('程序警告') % 修改提示字符为"程序警告" h = 0.0037 运行程序得到如图 3-39 所示对话框。

图 3-38 错误提示 图 3-39 指定警告类型对话框

如图 3-39 所示,对话框提示“程序警告”。 当然,用户可以分开输入,具体使用如下: >> warndlg('程序''警告') 运行程序仍然得到如图 3-39 所示对话框。 如果需要多行显示,则输入: warndlg({'程序' '警告'}) 运行程序得到如图 3-40 所示对话框。

(3)指定警告的类型,并修改对话框标题。 h = warndlg (errorstring,dlgname) % 指定警告的类型 如图 3-38~图 3-40 所示,警告提示对话框的标题默认为“警告对话框”,在此可以对

对话框标题进行修改,具体的使用如下: >> h = warndlg('程序警告','余胜威的程序设计') h = 0.0042

Page 74: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·150·

运行程序得到如图 3-41 所示对话框。

图 3-40 多行显示 图 3-41 标题修改

(4)修改警告对话框信息显示。 h = warndlg(errorstring,dlgname,createmode) creatmode 可以为字符串,也可以为一个结构体。如果 creatmode 为字符串,则 creatmode

为 modal、non-modal (default)或 replace 三者之一,具体的使用如下: mode = struct('WindowStyle','non-modal',... 'Interpreter','tex'); % 显示样式 >> h = warndlg ('程序警告,请检查',... '余胜威提示', mode); % 文字提示 运行程序得到如图 3-42 所示对话框。 修改 mode 如下: >> mode = struct('WindowStyle','modal',... 'Interpreter','tex'); % 显示样式 >> h = warndlg ('程序警告,请检查一下,避免可能的 debug!!!',... '余胜威提示', mode); % 字符串设置 运行程序得到如图 3-43 所示对话框。

图 3-42 non-modal (default)显示模式 图 3-43 modal 显示模式

由此可知,MATLAB 提供的 warndlg 对话框模式是很丰富的,用户可以在程序中指定

可能的警告来源,从而更好地定位程序的 debug 源头。

3.7 用户提示对话框 msgbox

msgbox 为用户提示对话框,用户可以对程序的执行状态进行提示,以至于让用户可以

进一步地执行下一步,msgbox 在 gui 设计中常用到。具体的 msgbox 使用格式如下:

Page 75: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·151·

>> help msgbox msgbox - Create and open message dialog box This MATLAB function creates a message dialog box that automatically wraps Message to fit an appropriately sized figure. h = msgbox(Message) h = msgbox(Message,Title) h = msgbox(Message,Title,Icon) h = msgbox(Message,Title,'custom',IconData,IconCMap) h = msgbox(___,CreateMode) msgbox 的参考页 另请参阅 errordlg, helpdlg, imread, warndlg 由此可知,msgbox 有 5 种使用格式,5 种使用格式基本满足用户的设计要求,具体

介绍如下。 (1)直接输入提示信息。

msgbox 提示对话框直接输入提示信息,具体使用如下: >> msgbox('测试数据训练完毕') 运行程序得到如图 3-44 所示对话框。 当一行不能完好地表示信息时,可以在第二行写入,具体的操作如下: msgbox({'测试数据' '训练完毕'}) 运行程序得到如图 3-45 所示对话框。 同理,若三行显示,则为: msgbox({'测试数据' '训练' '完毕'}) 运行程序得到如图 3-46 所示对话框。

图 3-44 提示信息输入 图 3-45 两行显示 图 3-46 三行显示

(2)修改显示标题。 MATLAB 中 msgbox 对话框的标题可以修改,具体的使用如下: >> h = msgbox('执行成功','余胜威'); 运行程序得到如图 3-47 所示对话框。

(3)msgbox 显示具体的图标。 Msgbox 还可以显示具体的图标,例如错误图标、警告图标等,其使用格式如下: h = msgbox(Message,Title,Icon) % 修改显示图标

Page 76: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·152·

其中 Icon 为提示图标的特殊函数字符,具体使用如下: >> h = msgbox('程序错误', '余胜威','error'); 运行程序得到如图 3-48 所示对话框。

图 3-47 标题修改 图 3-48 添加错误图标

例如添加警告图标,具体的使用如下: >> h = msgbox('程序错误', '余胜威','warn'); % 添加警告图标 运行程序得到如图 3-49 所示对话框。 同理还有帮助图标,具体的使用如下: >> h = msgbox('程序错误', '余胜威','warn'); % 添加帮助图标 运行程序得到如图 3-50 所示对话框。

图 3-49 添加警告图标 图 3-50 添加帮助图标

(4)设定用户自己的图标。 Msgbox 中用户可以设定自己的图标进行显示,具体的使用格式如下: h = msgbox(Message,Title,'custom',IconData,IconCMap) % 设定用户自己的图标 具体的应用如下: clc,clear,close all % 清屏 warning off % 取消警告 feature jit off % 加速通道 copyfile(fullfile(matlabroot,... 'help','includes','product',... 'images','global','ico_large_info.png')); % 复制图像句柄 [cdata] = imread('DSC06314.jpg'); % 读入图像 h=msgbox('程序完成',... '余胜威','custom',cdata); % 显示用户自己设定的图标 运行程序得到如图 3-51 所示对话框。

Page 77: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·153·

或者直接操作如下: clc,clear,close all [cdata,map] = imread('DSC06314.jpg'); h=msgbox('余胜威',... '执行自己的图标','custom',cdata,map); % 修改标题 运行程序得到如图 3-52 所示对话框。

图 3-51 用户自己设定图标 图 3-52 自己设定的图标显示

(5)修改警告对话框信息显示。 h = msgbox(___,CreateMode) % 修改警告对话框 creatmode 可以为字符串,也可以为一个结构体。如果 creatmode 为字符串,则 creatmode

为 modal、non-modal (default)或 replace 三者之一,具体的使用如下: uiwait(msgbox('Operation Completed','Success','modal')); % 标题为 Success,显示为 Operation Completed 运行程序得到如图 3-53 所示对话框。 修改 mode 如下: clc,clear,close all % 清屏 CreateStruct.Interpreter = 'tex'; % 显示样式 CreateStruct.WindowStyle = 'modal'; % 设置样式 h=msgbox('Z = X^2 + Y^2','Value',CreateStruct); % 显示 Z=X^2+Y^2 运行程序得到如图 3-54 所示对话框。

图 3-53 modal 显示模式 1 图 3-54 modal 显示模式 2

由此可知,MATLAB 提供的 msgbox 对话框功能是很丰富的,用户可以在程序中指定

显示的文字以及图案,从而更好地优化设计界面。

3.8 提问对话框 questdlg

questdlg 为提问对话框,用于用户选择哪个程序进行执行,例如是否继续执行,是否

Page 78: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·154·

现在关闭程序等等,具体的提问对话框 questdlg 的使用格式如下: >> help questdlg questdlg - Create and open question dialog box This MATLAB function displays a modal dialog box presenting the question 'qstring'. button = questdlg('qstring') button = questdlg('qstring','title') button = questdlg('qstring','title',default) button = questdlg('qstring','title','str1','str2',default) button = questdlg('qstring','title','str1','str2','str3',default) button = questdlg('qstring','title', ..., options) questdlg 的参考页 另请参阅 dialog, errordlg, figure, helpdlg, inputdlg, listdlg, msgbox, textwrap, uiresume, uiwait, warndlg >> 由此可知,提问对话框 questdlg 有 6 种使用格式,具体如下。

(1)直接使用字符串输出。 直接弹出提示对话框,具体的使用如下: >> button = questdlg('qstring') % 设置为 qstring 运行程序得到如图 3-55 所示界面。

图 3-55 提问对话框

单击【是】按钮,则 button 返回 Yes,单击【否】按钮,则返回 No,单击【取消】按

钮,则返回 Cancel,具体如下: >> button = questdlg('qstring') % 提问对话框 button = Yes >> button = questdlg('qstring') button = No >> button = questdlg('qstring') button = Cancel >>

Page 79: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·155·

(2)修改提问对话框标题。 具体的使用格式如下: >> button = questdlg('qstring','余胜威') % 设置标题 button = Yes 运行程序得到如图 3-56 所示界面。

(3)设置弹出对话框的按键。 通过设置弹出对话框的按键,可以事先设置该界面上的按钮状态,如图 3-56 所示界面

默认为【是】状态,修改默认显示按钮,其具体的使用格式如下: button = questdlg('qstring','title',default) 默认设置为【否】,程序如下: >> button = questdlg('qstring','title','No') % 默认设置为“否” button = Cancel 运行程序得到如图 3-57 所示界面。

图 3-56 修改提问对话框标题 图 3-57 默认对话框选择【否】

例如设定默认为【取消】,则程序如下: >> button = questdlg('qstring','title','Cancel') % 默认设置为“取消” button = Cancel 运行程序得到如图 3-58 所示界面。

(4)修改选择按钮的显示字符串。 具体的 MATLAB 调用格式如下: button = questdlg('qstring','title','str1','str2',default) 如图 3-58 所示,界面按钮默认为【是】、【否】、【取消】,用户可以对该字符串进

行修改,具体如下:

Page 80: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·156·

>> button = questdlg('提问对话框','余胜威','Yes','No','Cancel') % 修改选择按钮的显示字符串 button = Yes 运行程序得到如图 3-59 所示结果。

图 3-58 默认对话框选择【取消】 图 3-59 修改显示按钮字符

在代码中,questdlg('提问对话框','余胜威','Yes','No','Cancel'),默认按钮选择为 cancel,但是字符设置为【Yes】、【No】,因此没有选中某一个按钮。如果选择【Yes】按钮,则

程序修改为: >> button = questdlg('提问对话框','余胜威','Yes','No','Yes') % 默认设置为 Yes,且只有 Yes和 No两个按钮 button = Yes 运行程序得到如图 3-60 所示结果。

(5)设置对话框为 3 个可选择按钮。 具体的 MATLAB 调用格式如下: button = questdlg('qstring','title','str1','str2','str3',default) 其中,default 为默认按钮,一般选择 str1 字符串,具体的使用如下: >> button = questdlg('提问对话框','余胜威','Yes','No','Cancel','Yes') button = Yes 运行程序得到如图 3-61 所示结果。

图 3-60 修改为默认按钮 图 3-61 设置 3 个选择按钮

Page 81: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·157·

通过【Yes】、【No】、【Cancel】3 个选项,用户可以选择不同的按钮,执行相应的

程序功能,例如代码如下: % Construct a questdlg with three options choice = questdlg('Would you like a dessert?', ... 'Dessert Menu', ... 'Ice cream','Cake','No thank you','No thank you'); % 创建 3 个按钮:Ice cream、Cake、No thank you % Handle response switch choice case 'Ice cream' disp([choice ' coming right up.']) % 显示输出字符串 dessert = 1; case 'Cake' disp([choice ' coming right up.']) % 显示输出字符串 dessert = 2; case 'No thank you' disp('I''ll bring you your check.') % 显示输出字符串 dessert = 0; end 运行程序得到如下结果: I'll bring you your check. 得到的界面如图 3-62 所示。

图 3-62 选项下对应的程序

(6)显示公式文本选项等。 具体的调用格式如下: button = questdlg('qstring','title', ..., options) % 显示公式文本 options 可以设置为显示文本的格式,例如当在提问对话框输入公式时,可以用 options

来进行控制,具体的使用如下: options.Interpreter = 'tex'; % 解析器 % Include the desired Default answer % 默认设置 options.Default = 'Don''t know'; % Create a TeX string for the question qstring = 'Is \Sigma(\alpha - \beta) < 0?'; % 提示字符串 choice = questdlg(qstring,'Boundary Condition',... 'Yes','No','Don''t know',options) % 提问对话框 运行程序得到如下结果:

Page 82: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·158·

choice = Yes 得到的界面如图 3-63 所示。

图 3-63 选项设置

3.9 数据输入对话框 inputdlg

inputdlg 为数据输入对话框,顾名思义就是用户可以在弹出的对话框中输入数值,从

而被程序所读取,达到友好的修改参数的目的。具体的数据输入对话框 inputdlg 的使用格

式如下: >> help inputdlg inputdlg - Create and open input dialog box This MATLAB function creates a modal dialog box and returns user input for multiple prompts in the cell array. answer = inputdlg(prompt) answer = inputdlg(prompt,dlg_title) answer = inputdlg(prompt,dlg_title,num_lines) answer = inputdlg(prompt,dlg_title,num_lines,defAns) answer = inputdlg(prompt,dlg_title,num_lines,defAns,options) inputdlg 的参考页 另请参阅 dialog, errordlg, figure, helpdlg, input, listdlg, msgbox, questdlg, str2num, uiresume, uiwait, warndlg >> 数据输入对话框 inputdlg 有 5 种输入模式,具体使用方法介绍如下。

(1)直接采用默认方式,弹出输入数值对话框。 具体的使用如下: >> answer = inputdlg('') % 数值对话框 answer = '100'

Page 83: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·159·

运行程序得到如图 3-64 所示结果。 如图 3-64 所示,该简单界面直接让用户输入数值。 可以在用户输入数值前,给出提示信息,具体如下: >> answer = inputdlg('a=?') % 输入 a的取值 answer = {} 运行程序得到如图 3-65 所示结果。

(2)输入对话框标题修改。 可以对提示信息框的标题进行修改,具体的使用如下: >> answer = inputdlg('a=?','数据输入') % 标题为“数据输入” answer = '100' 运行程序得到如图 3-66 所示结果。

图 3-64 数值输入 图 3-65 提示信息显示 图 3-66 标题显示修改

特别地,当输入为数值 100 时,可将结果直接读取,读取方式如下: >> data = str2num(answer{:}) % 转化为数值型 data = 100 (3)增加输入的行数。 如图 3-65~图 3-66 所示为输入一个数值的情况,inputdlg 可直接输入多个变量值,具

体如下: clc,clear,close all % 清屏 warning off % 取消警告 prompt = {'矩阵维数:','颜色空间名称:'}; % 输入对话框说明符 dlg_title = '余胜威'; % 标题 answer = inputdlg(prompt,dlg_title) % 显示 运行程序得到如图 3-67 所示结果。 当输入如图 3-68 所示,单击【确定】按钮时,返回值如下: answer =

Page 84: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·160·

'3' 'rgb' 返回值为一个 cell 细胞体数组,并且按照行进行保存。

图 3-67 多行输入 图 3-68 输入量

(4)修改输入的维数。 如图 3-68 所示,矩阵维数输入为一个实数,也可以输入为一个矩阵,具体的程序如下: clc,clear,close all % 清屏 warning off % 取消警告 prompt = {'矩阵维数:','颜色空间名称:'}; dlg_title = '余胜威'; % 标题 num_lines = 2; % 两栏输入 answer = inputdlg(prompt,dlg_title,num_lines) % 显示 运行程序得到如图 3-69 所示对话框。 用户可以在如图 3-69 所示对话框中输入数值和颜色空间名称,针对每一行可以输入多

个数值和字符串,但只能输入 num_lines 行,当输入如图 3-70 所示时,程序返回如下结果: answer = [2x7 char] [2x4 char] >> answer{1,1} ans = 2 3 1 2 1 2 3 4 >> answer{2,1} ans = rgb yuv

图 3-69 多数据输入 图 3-70 输入字符串

Page 85: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 3 章 MATLAB 弹出窗口定义

·161·

同样可以设定输入的字符的个数,例如: x = inputdlg({'Name','Telephone','Account'},... 'Customer', [1 50; 1 12; 1 7]); 运行程序得到如图 3-71 所示结果。

(5)设定输入对话框的默认值。 有时用户知道初始状态,可以直接输入相应的默认值,具体的使用格式如下: answer = inputdlg(prompt,dlg_title,num_lines,defAns) % 输入对话框 具体的案例分析如下: clc,clear,close all % 清屏 warning off % 取消警告 prompt = {'矩阵维数:','颜色空间名称:'}; dlg_title = '余胜威'; num_lines = 1; % 一栏显示 def = {'20','hsv'}; % 初始化设置 answer = inputdlg(prompt,dlg_title,num_lines,def); 运行程序得到如图 3-72 所示结果。

图 3-71 输入字符串长度 图 3-72 默认输入值

(6)修改显示字体。 Inputdlg 输入对话框,提供各种字体的输入,具体的使用格式如下: answer = inputdlg(prompt,dlg_title,num_lines,defAns,options)% 修改显示字体 相应的实际应用如下: clc,clear,close all % 清屏和清除工作区 warning off % 取消警告 prompt = {' x^2:','颜色空间名称:'}; dlg_title = '余胜威'; numlines=1; % 一栏 defaultanswer={'20','RGB'}; % 默认设置 options.Resize='on'; % 矢量化窗口打开 options.WindowStyle='normal'; % 窗口可以拉大缩小

Page 86: 第2 章 MATLAB 常用文件操作download.ilovematlab.cn/books/251/第2-3章.pdf · 2016. 1. 11. · 第2 章 MATLAB 常用文件操作 本章就常用文件读取和写入进行讲解,具体有:Mat

第 1 篇 MATLAB GUI 设计入门

·162·

options.Interpreter='tex'; % 解析器设置 answer=inputdlg(prompt,dlg_title,numlines,... defaultanswer,options); % 输入窗口显示 运行程序得到如图 3-73 所示结果。

图 3-73 字体样式

3.10 本 章 小 结

本章对常用的对话框进行了系统的说明,具体涉及到 uigetfile、uigetdir、uiputfile、waitbar、errordlg、warndlg、msgbox、questdlg 和 inputdlg 等功能的阐述,内容详细且易学

易用。


Recommended