输入输出函数:textread函数 save函数 load函数
优先使用后面的两种函数,因为其执行效率比较高,可移植性好,能够最大程度的保留数据的信息
load函数从mat文件中读取变量,将结果保存到结构数组中;或者从一个ASCII文件中读取数据,将结果保存到双精度数组中。
比如说要加载a.mat文件,那么load('a.mat'),也可以手动用开始菜单的命令进行导入操作。
load函数有第二个参数,用于指定要导入的变量名,在文件里含有多个变量时候有选择性的导入对应的变量。
如果后面的参数是'-ascii'那么就会将文件以ascii文件方式强制导入,不管其后缀名是什么,对应的还有'-mat'一样。
save函数可以直接保存二进制文件,对应load函数,也有一个参数用于保存指定的变量。
load函数缺陷:其默认加载数据类型是同一种数据类型格式,如果内部是多行多列的数据,要求每一行列数必须相同否则加载就会出错,textread函数不会受到这种限制所以这是一种比较灵活的导入数据的方式。
textread函数第一大类:这种方式只是用于数字类型的数据,注意第二个参数要空出来
使用下面这种形式用于存在字符串的读取。其中format和fprintf函数中的format一致。这里要读取的数据会
类似于C语言中选择性读取/显示文本,matlab中也采用%*格式符的形式:
Matlab中对文件进行操作,首先需要建立一个文件标识(file id),文件标识是一个正整数,通过标识能够知道我们当前对哪个文件进行操作,这点类似于句柄,唯一的正整数进行标识处理。
注意,当文件标识为1时代表标准输出,文件标识为2是标准错误(stderr)
其他标识均为临时标识,文件打开时创立,关闭时消失。
Matlab中文件分为二进制文件和格式化文件
所以Matlab中也有对应的两种文件操作即二进制文件操作和格式化文件操作。在格式化文件里有回车键换行键之间的区分而在二进制文件里不作区别。格式化文件就是常说的文本文件。(只针对windows系统下有区分)
pid=fopen(filename)默认以只读方式,二进制方式打开文件,filename可以包含路径,也可以不包含路径。如果打开失败,pid会得到一个-1值。
filename后可以加上第二个参数,permission,限定打开文件的方式
[PID,MESSAGE]=fopen(filename,permission),message用于记录出错的信息,如果没有出错,这就是一个空字符串。
在这里要注意的是,要打开的文件名要用引号引起来,还有就是关闭文件时候如果成功就会返回一个0
写文件的操作函数:fwrite count=fwrite(fid,A),将A矩阵写入文件中,以竖行的形式写入,count是成功写入的元素个数,可以再加一个精度参数,如果没有设定,默认uint8精度,使用w权限时候注意和C语言是一样的,没有创建,有则覆盖
关于fread的帮助文件:
注意的是其中是将文件读取到矩阵中保存,size指定要的去的大小,其中都是按列读取的 还可以指定对应的精度
在之前的参数可以加对应的count来显示读取成功的个数:
举例:
注意这里的142536顺序,按列读取的。
fid=fopen(‘all’)%返回一个列向量,所有打开的文件的pid组成的列向量
fclose(‘all’)%关闭所有打开的文件
[filename,permission,format]=fopen(fid)%给出打开文件的具体信息
格式化函数,只针对于windows系统,对于linux系统unix系统相比二进制函数无意义
这些format和C语言中一致
array=fscanf(fid,format)
[array,count]=fscanf(fid,format,size)
这里的fscanf函数格式和前面的fread函数类似
关于文件读取的实例:
首先有一个.dat文件,内容
这里重新再读取一次发现读取为空,这点类似于C语言中的文件指针,不再指向文件头部,这次遇到了文件尾就读取为空了。在这里将其关闭
再进行读取,发现这次读取只能读取到10,后面的因为出现了小数点,类型无法匹配,就无法继续读取下去了
所以就可以解释以下问题:
其中小数点被匹配了
用%c会将所有东西,包括空格还有回车被记入字符
如果用%s进行读取,记录4个字符串,就是凡事遇到换行符 空格 tab 全部记录为字符串结束,显示时候不显示空格等
%创建一个含有10000 个随机数的数组,以只写方式打开一个自定义文件,用64 位浮点数格式把这个数据写入磁盘,并关闭文件。
out_array=rand(100,100);
filename=input('enter the name:','s');
[fid,msg]=fopen(filename,'w');
if fid>0
count=fwrite(fid,out_array,'float64');
disp([int2str(count) 'data was written']);
fclose(fid);
else
disp(msg);
end
[fid,msg]=fopen(filename,'r');
if fid>0
[in_array,count]=fread(fid,[100 100],'float64');
disp([int2str(count) 'data was written']);
fclose(fid);
else
disp(msg);
end
关于input函数,选项用于决定用户的输入是作为一个表达式看待,还是作为一个普通的字符串看待
>> input('请输入一个矩阵:')
请输入一个矩阵:magic(3)
ans =
8 1 6
3 5 7
4 9 2
>> input('请输入一个字符串:','s')
请输入一个字符串:magic(3)
ans =
magic(3)
两种情况下,用户输入的同样是magic(3)这样一个字符串,但在前一种条件下,magic(3)被理解成一个表达式,所以返回一个3阶的幻方矩阵,而后一种情况下,则直接返回这个字符串。第二个例子中的那个”s“就是选项。input函数如果有第二个参数,则第二个参数只能是's',而不能是其它任何内容。
以下是一次性读取一行内容的两个函数,fgets和fgetl
line=fgetl(fid)%将整行当做字符串返回,并去除换行符,一次读取一行,直到到文件结尾会返回-1
fgets同上%区别在于不去除换行符
exist的返回值:
MEX文件是matlab编译成C程序文件的中间文件,不可脱离matlab环境,执行效率较高,MDL文件是使用simulink搭建的模型文件,P文件是m文件生成的一种半编译的中间代码,保存为P文件用于提高执行效率
exist的其他参数:
关于ftell只有一个参数pid,告诉文件指针距离开头的位置
frewind函数用于将文件指针移动到文件开头:
关于fseek和C语言用法一样,这里截取帮助文件:
关于ferror的另一个参数,
没有错误信息时候massage是一个空的字符串
importdata用于导入文件(文本图片均可),所以如果可以正确识别文件扩展名,importdata会正确导入,否则文件会被解释成一个文本文件
textscan,从字符串或者文本文件中读取格式化数据,C是一个单元数组
xlsread,从excel表格读取数据,注意[数值类型 字符类型 原始类型]
uiimport,打开文件导入向导
从剪切板中导入数据
实际上uiimport函数作用和开始菜单中importdata的作用一致
关于格式化文件和二进制文件直接的区别:
最小二乘法举例:
测试数据:
input1.txt
1.1 1.1
2.2 2.2
3.3 3.3
4.4 4.4
5.5 5.5
6.6 6.6
7.7 7.7
input2.txt
1.1 1.01
2.2 2.30
3.3 3.05
4.4 4.28
5.5 5.75
6.6 6.48
7.7 7.84
实现程序:
% n sum_x sum_y sum_x2 x_bar y_bar sum_x_y
sum_x=0;
sum_y=0;
sum_x2=0;
sum_x_y=0;
n=0;
filename=input('请输入文件名:','s');
[fid,msg]=fopen(filename,'rt');
if fid<0
disp(msg);
else
[x,count]=fscanf(fid,'%f %f',[1 2]);
while ~feof(fid)
sum_x=sum_x+x(1);
sum_y=sum_y+x(2);
sum_x_y=sum_x_y+x(1)*x(2);
sum_x2=sum_x2+x(1)^2;
n=n+1;
[x,count]=fscanf(fid,'%f %f',[1 2]);%注意这里矩阵[1 2]定义了输出的结构方式
end
x_bar=sum_x/n;
y_bar=sum_y/n;
m=(sum_x_y-sum_x*y_bar)/(sum_x2-sum_x*x_bar);
b=y_bar-m*x_bar;
fclose(fid);%不要忘记关闭文件
end
最终结果: