matab输入输出笔记

前言:
matlab中直接就可以用图像化进行导入数据,而且还会自动生成导入导出的代码十分方便,法二就是在此基础上完成的。

特别需要注意的是
后来再用遗传算法的时候,经常会得到打开文件太多遗传算法无法运行的错误,后来查了一下是因为,没有fclose的原因,所以从文件中读入数据一定要密切关注这个问题。

其实关于输入我有两种思路
1.一种是有多少读多少
2.一种是全读进来,用的时候再慢慢选
3.两种结合的方法
4.每次读一行,然后用矩阵进行储存(函数套函数)

法一
法一的方法读的倒是很轻松,但是读入的数据都是cell型的cell所以很难进一步的处理,所以最终被迫放弃
dataread_single.m


function dataout=dataread_single( filein, line)

fidin = fopen(filein,'r');
nline = 0;
while ~feof(fidin)         %判断是否为文件末尾

      tline = fgetl(fidin);         %从文件读行

      nline = nline+1;

             if nline == line


                dataout=tline;

            end
end

fclose(fidin);

dataread_all.m


% Example  :all=dataread_all('input.txt');
function dataout=dataread_all( filein)
obstacle={};
trash={};
Num_of_obstacle=0;
Number_of_trash=0;
place=dataread_single(filein,1);
robot=dataread_single(filein,2);
Num_of_obstacle_tmp=dataread_single(filein,3);
Num_of_obstacle=str2num(Num_of_obstacle_tmp);
for i=1:Num_of_obstacle
   obstacle{i}=dataread_single(filein,3+i); 
end

Number_of_trash_tmp=dataread_single(filein,3+Num_of_obstacle+1);
Number_of_trash=str2num(Number_of_trash_tmp);
for i=1:Number_of_trash
   trash{i}=dataread_single(filein,3+Num_of_obstacle+1+i); 
end
garbage=dataread_single(filein,3+Num_of_obstacle+Number_of_trash+2);
radius_of_sensor=dataread_single(filein,3+Num_of_obstacle+Number_of_trash+3);
time_step=dataread_single(filein,3+Num_of_obstacle+Number_of_trash+4);
weight=dataread_single(filein,3+Num_of_obstacle+Number_of_trash+5);
dataout={place,robot,Num_of_obstacle,obstacle,Number_of_trash,trash,garbage,radius_of_sensor,time_step,weight};

法二:
法二读进来的是表格,开始我也觉得不可能,但是我发现,导入的数据是可以直接引用的,这个现象启发了我,于是我就学习了一下,然后就成功了。
但是这个方法读入的数据是一个正方形,所以说造成了一定的空间浪费。

importfile2.m

function input1 = importfile2(filename)
%IMPORTFILE2 将文本文件中的数值数据作为矩阵导入。
%   INPUT1 = IMPORTFILE2(FILENAME) 读取文本文件 FILENAME 中默认选定范围的数据。
%
%   INPUT1 = IMPORTFILE2(FILENAME, STARTROW, ENDROW) 读取文本文件 FILENAME 的
%   STARTROW 行到 ENDROW 行中的数据。
%
% Example:
%   input1 = importfile2('input.txt', 1, 17);
%
%    另请参阅 TEXTSCAN。

% 由 MATLAB 自动生成于 2018/03/30 10:09:33

%% 初始化变量。
delimiter = ',';
if nargin<=2
    startRow = 1;
    endRow = inf;
end

%% 每个文本行的格式:
%   列1: 双精度值 (%f)
%   列2: 双精度值 (%f)
%   列3: 双精度值 (%f)
%   列4: 双精度值 (%f)
%   列5: 双精度值 (%f)
% 有关详细信息,请参阅 TEXTSCAN 文档。
formatSpec = '%f%f%f%f%f%[^\n\r]';

%% 打开文本文件。
fidin = fopen(filename,'r');
fileID = fopen(filename,'r');
nline = 0;

while ~feof(fidin)         %判断是否为文件末尾 
      nline = nline+1;
      fgetl(fidin);   
end
endRow=nline;

%% 根据格式读取数据列。
% 该调用基于生成此代码所用的文件的结构。如果其他文件出现错误,请尝试通过导入工具重新生成代码。
dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1, 'Delimiter', delimiter, 'TextType', 'string', 'EmptyValue', NaN, 'HeaderLines', startRow(1)-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
for block=2:length(startRow)
    frewind(fileID);
    dataArrayBlock = textscan(fileID, formatSpec, endRow(block)-startRow(block)+1, 'Delimiter', delimiter, 'TextType', 'string', 'EmptyValue', NaN, 'HeaderLines', startRow(block)-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
    for col=1:length(dataArray)
        dataArray{col} = [dataArray{col};dataArrayBlock{col}];
    end
end

%% 关闭文本文件。
fclose(fileID);

%% 对无法导入的数据进行的后处理。
% 在导入过程中未应用无法导入的数据的规则,因此不包括后处理代码。要生成适用于无法导入的数据的代码,请在文件中选择无法导入的元胞,然后重新生成脚本。

%% 创建输出变量
input1 = table(dataArray{1:end-1}, 'VariableNames', {'VarName1','VarName2','VarName3','VarName4','VarName5'});

createfigure.m

function createfigure
%CREATEFIGURE
% 创建 figure
figure1 = figure;
% 创建 axes
axes1 = axes('Parent',figure1);


%准备数据
input = importfile('input.txt');
place=input{1:1,{'VarName1','VarName2'}}
Num_of_obstacle=input{3:3,{'VarName1'}}

 %画障碍物
obstacle=zeros(1,5);
for i=1:Num_of_obstacle
       trash_temp=input{3+i:3+i,{'VarName1','VarName2','VarName3','VarName4','VarName5'}};
       obstacle(:,:,i)= trash_temp;
    if  obstacle(1,5,i)==0
        obstacle(1,1,i)=obstacle(1,1,i)-obstacle(1,3,i)/2.0;
        obstacle(1,2,i)=obstacle(1,2,i)-obstacle(1,4,i)/2.0;
        rectangle('Parent',axes1,'Position',obstacle(1,1:4,i),'FaceColor','k');
    else  obstacle(1,5,i)==1
         obstacle(1,1,i)=obstacle(1,1,i)-obstacle(1,3,i)/2.0;
         obstacle(1,2,i)=obstacle(1,2,i)-obstacle(1,4,i)/2.0;
         obstacle(1,3,i)=obstacle(1,3,i);
         obstacle(1,4,i)=obstacle(1,4,i);
         rectangle('Parent',axes1,'Position',obstacle(1,1:4,i),'FaceColor',[0 0 0],...
         'Curvature',[1 1]);
    end
end

%画垃圾
trash=zeros(1,4);
Number_of_trash=input{3+Num_of_obstacle+1:3+Num_of_obstacle+1,{'VarName1'}};
for i=1:Number_of_trash
    trash_temp=input{3+Num_of_obstacle+1+i:3+Num_of_obstacle+1+i,{'VarName1','VarName2','VarName3','VarName4'}}
    trash(:,:,i)= trash_temp;
    rectangle('Parent',axes1,'Position',[trash(1,1,i) trash(1,2,i) 1 1 ],'EdgeColor',[0 1 0],...
    'FaceColor',[0 1 0],...
    'Curvature',[1 1]);
end


% 画robot 和 sensor    
robot=input{2:2,{'VarName1','VarName2','VarName3','VarName4'}}
% 画sensor  
radius_of_sensor=input{3+Num_of_obstacle+Number_of_trash+3:3+Num_of_obstacle+Number_of_trash+3,{'VarName1'}};
rectangle('Parent',axes1,'Position',[robot(1)-radius_of_sensor(1) robot(2)-radius_of_sensor(1) radius_of_sensor*2 radius_of_sensor*2],'Curvature',[1 1]);
% 画robot
robot(1)=robot(1)-robot(3)/2.0;
robot(2)=robot(2)-robot(4)/2.0;
rectangle('Parent',axes1,'Position',robot,'FaceColor','r');


time_step=input{3+Num_of_obstacle+Number_of_trash+4:3+Num_of_obstacle+Number_of_trash+4,{'VarName1'}};
weight=input{3+Num_of_obstacle+Number_of_trash+5:3+Num_of_obstacle+Number_of_trash+5,{'VarName1'}};
hold on

%画垃圾站
garbage=input{3+Num_of_obstacle+Number_of_trash+2:3+Num_of_obstacle+Number_of_trash+2,{'VarName1','VarName2'}};
scatter(garbage(1),garbage(2),'k','x');

% 取消以下行的注释以保留坐标区的 X 范围
% xlim(axes1,[0 50]);
% 取消以下行的注释以保留坐标区的 Y 范围
% ylim(axes1,[0 50]);
grid(axes1,'on');
% 设置其余坐标区属性
axis([0 50 0 50]);
set(axes1,'XTick',...
    [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50],...
    'XTickLabel',...
    {'','','','','','','','','','','10','','','','','','','','','','20','','','','','','','','','','30','','','','','','','','','','40','','','','','','','','','','50'},...
    'YTick',...
    [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50],...
    'YTickLabel',...
    {'','','','','','','','','','','10','','','','','','','','','','20','','','','','','','','','','30','','','','','','','','','','40','','','','','','','','','','50'});

猜你喜欢

转载自blog.csdn.net/qq_26769591/article/details/79941600
今日推荐