您的位置:首页 > 编程语言 > MATLAB

MATLAB 在gui界面上像Comman Window那样显示运行结果以及文件批处理

2020-04-23 10:10 633 查看

  帮一个同学做毕设,她的问题是需要选中一个文档,然后提取其中的关键字及其后面的数字,再在gui界面中输出提取的数字。文件部分内容如下:

 

<span style="font-size:12px;">BufferImageNum=32
DetectorChannelNumHorizontal=1944
DetectorChannelNumVertical=1536
DetectorResolutionH=0.0748
DetectorResolutionV=0.0748
DetetorOffsetH= -31.3689
DetetorOffsetV=59.6965
SDD=574.2714
SOD=348.0044
VolumeBlockNumUsingGpu(divide volume to ? blocks)=1

Voltage=50
</span>
需要提取中间的的’BufferImageNum‘和’DetectorRosolutionH‘等关键字,并输出其后面的数字。解决这部分问题的MATLAB程序如下:

<span style="font-size:12px;">%寻找关键字并提取数字
D=importdata('geo.ini');%读取geo.ini
[M,N]=size(D);
for i=1:M
T=strfind(D{i},'BufferImageNum=')%寻找所有行中含有字符串BufferImageNum=的行
if T==1
P=D{i}%找到后用P存储此行字符串,即BufferImageNum=32
S=P(regexp(P,'\d'))%找到此字符串中的数字,即32
return
end
end</span>
其中用到:

 tips1:importdata(filename) 导入文件数据,读出来是53*1的cell格式,调用第i行的数据需要用{i},而不是用[i];

 tips2:strfind(s1,s2)在字符串s1中寻找字符串s2,当找到时,返回s2在s1中位置,以数字表示。 

 tips3:regexp()正则表达式函数,用于在一长串字符串中对特定字符串进行查找。扩展的还有regexpi和regexprep。其中regexp(P,'\d')表示查找出字符串P中的数字并返回其在P中的位置,S=P(regexp(P,'\d'))即输出此数字。

tips4:FID=fopen(filename,permission) 用指定的方式打开文件。若输出FID=+N表示文件打开成功,文件代号是N。若输出FID=-1,表示文件打开不成功。打开文件  permission参数自行查找。

若知道文件的路径和名称,可用fopen([PathName FileName])这种方式读取文件,不过若FileName是cell格式需要先用char(FileName)把FileName从cell转化为string。
若PathName=D:\Program Files\MATLAB\R2014b\mywork 最后没有斜杠,可以用fopen([Path_Name '\' File_Name])这种形式读取。

tips5:读取一个文件夹中同一格式的所有文件
dirs=dir('D:\Program Files\MATLAB\R2014b\mywork\*.prj')得到dirs是结构体,包含所有文件的具体信息。
dircell=struct2cell(dirs) 即把结构体软化为cell,便于读取。

tips6:[FileName,PathName] =uigetfile({'*.ini','files.ini'},'选择文件');%在文件夹中手动选择文件,并获取所选文件的信息(文件名和路径)

 Path_Name = uigetdir('选择文件夹');  %选择文件夹并获取所选文件夹的路径

tips7:在matlab 的gui设计中,若要在界面上显示运算的结果(就像在Command Window 中那样),可用static text控件或者edit text控件,设置文件显示内容如下:

struct={'viewNum=' 'w=' 'h=' 'DetectorResolutionH=' 'wisize';viewNum w h dpixel wisize};
set(handles.text_show,'string',struct);

  PS:使用struct格式是因为这样才有换行。使用矩阵或cell都只能挤在一行输出。有说可以用textwrap()处理字符串进行换行的,我没有实现。

tips8:reshape(A,2,3)  把A中的元素重新排列,排成2行3列。

tips9:进行文件批处理的思路:先把文件夹中所有文件的信息存到allnames中,再选取allname(1,:)第一行即filename信息存到File_Name矩阵中,再用for循环对File_Name中所有的文件名称依次处理。

<span style="font-size:12px;">Path_Name = uigetdir('选择文件夹');
allnames = struct2cell(dir([Path_Name '\*.prj']));
[MX NY] = size(allnames);
for i=1:NY
FB = char(File_Name(i));
fid = fopen([Path_Name '\' FB],'rb');%打开%
pic=chuli(fid);
end
for i=1:N
FB=char(File_Name(i));%需要先转化为char格式
fid = fopen([Path_Name '\' FB],'rb');%读取文件
pic=chuli(fid);
end</span>


  • 点赞
  • 收藏
  • 分享
  • 文章举报
imcoolyancong 发布了4 篇原创文章 · 获赞 0 · 访问量 3996 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐