文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB 提供了一系列低层次输入输出函数,专门用于文件操作。
文件数据格式有两种形式,一是二进制文件,二是文本文件。在打开文件时需要进一步指定文件格式类型,即指定是二进制文件还是文本文件。
1.一般步骤
(1)文件的打开:fopen 函数的调用格式为:fid= fopen(文件名,打开方式)。
(2)读取文本文件:fscanf 函数的调用格式:[A]= fscanf (fid, format, size),功能:函数 fscanf 从文件代号为 fid 的文件中读入数据到 A 中。
(3)文件的关闭:关闭文件用 fclose 函数,调用格式为:sta=fclose(fid),sta 表示关闭文件操作的返回代码,若关闭成功,返回 0,否则返回–1。
2.举例说明
例:读取下列坐标数据。
A 500 450 300
B 490 -100 -300
C 200 -195 109
D -643 -482 -187
代码如下:
[F,P]=uigetfile('*.txt','选择已写入坐标的文件:');
%F 为 filename 的缩写,P 为 pathname 的缩写,文件格式为*.txt
fna1=strcat(P,F);fpath=P;
%‘将路径 P 和文件名 F 赋值于字符串变量 fna1,将路径赋值给字符串变量 fpath,便于打开文件和利用路径
fid=fopen(fna1,'r');
%将用只读的方式打开文件 fnal 赋予 fid
i=0;pt=[]; %定义一个空矩阵 pt,用 i 来计数
while (~feof(fid)) %文件结尾时 feof(文件句柄)=0,其它为 1,此时也可以用 feof(fp)==0 代替
i=i+1;
survey(i).dh=fscanf(fid,'%s',1); %survey(i)为结构体,用 fscanf 方式读取一组字符型数据存入 survey(i).dh
survey(i).x=fscanf(fid,'%f',1); %用 fscanf 方式读取 一组浮点型数据存入 survey(i).x 中
survey(i).y=fscanf(fid,'%f',1); %用 fscanf 的方式读取一组浮点型数据存入survey(i).y 中
survey(i).h=fscanf(fid,'%f\n',1); %‘用 fscanf 的方式读取一组浮点型数据存入survey(i).h 中
pt=[pt;survey(i).x survey(i).y survey(i).h]; %将 survey(i).x survey(i).ysurvey(i).h 放入 pt 矩阵
end
status=fclose(fid); % 关闭句柄值是 fid 的文件
%F 为 filename 的缩写,P 为 pathname 的缩写,文件格式为*.txt
fna1=strcat(P,F);fpath=P;
%‘将路径 P 和文件名 F 赋值于字符串变量 fna1,将路径赋值给字符串变量 fpath,便于打开文件和利用路径
fid=fopen(fna1,'r');
%将用只读的方式打开文件 fnal 赋予 fid
i=0;pt=[]; %定义一个空矩阵 pt,用 i 来计数
while (~feof(fid)) %文件结尾时 feof(文件句柄)=0,其它为 1,此时也可以用 feof(fp)==0 代替
i=i+1;
survey(i).dh=fscanf(fid,'%s',1); %survey(i)为结构体,用 fscanf 方式读取一组字符型数据存入 survey(i).dh
survey(i).x=fscanf(fid,'%f',1); %用 fscanf 方式读取 一组浮点型数据存入 survey(i).x 中
survey(i).y=fscanf(fid,'%f',1); %用 fscanf 的方式读取一组浮点型数据存入survey(i).y 中
survey(i).h=fscanf(fid,'%f\n',1); %‘用 fscanf 的方式读取一组浮点型数据存入survey(i).h 中
pt=[pt;survey(i).x survey(i).y survey(i).h]; %将 survey(i).x survey(i).ysurvey(i).h 放入 pt 矩阵
end
status=fclose(fid); % 关闭句柄值是 fid 的文件
3.基础知识
3.1数据类型
MATLAB 共有六种基本的数据类型,每一种类型可以是一维、二维和多维的。
(1)双精度型(double),例如:5、-3.6、[1 2;9 3;2 0]、2-3i。它们是最常用的类型。
(2)字符型(char),例如:’hi’、 ’3+4i’、 ’山东理工大学’。
(3)稀疏型(sparse),例如:speye(4)是双精度稀疏矩阵,只存储矩阵中的非 0 元素。
(4)单元型(cell),例如:{1,‘good’,[1 2 3]}单元数组,数组中的每个元素可以是其他任何
一种数据类型,它通常可以将相关的尺寸大小不同的数据组合在一起。
(5)结构型(struct),例如:A.name;A.id;age 结构数组相当于数据库的纪录,把相关的数据
排列在一起,称为属性。
(6)8 位型(uint8),例如:uint8(magic(4))为无符号整数,最大可表示 255,但无法进行任何
数学运算。
3.2变量
变量命名的规则是:
(1)第一个字母必须是英文字母
,字母间不可留空格。
(2)MATLAB 的变量要区分大小写,如My_name,my_name 分别表示不同的变量。
(3)最多只能有 31 个字母,MATLAB 忽略多余字母(在 MATLAB 第 4 版,则是 19 个字母)。
(4)MATLAB 在使用变量时,不需预先经过变量宣告(Variable Declaration C++ int i,j),而且所有数值变量均以预设的 double 形式储存。
(5)若要加入注解(Comments),可以使用百分比符号(%)。
(6)MATLAB 提供的标准函数名以及命名必须用小写字母,所以建议使用者定义变量时都用小写字母,任何汉字及汉字符号、标点等都不能作为变量名。
(7)变量的定义实质就是“把什么值用什么变量存储”。
3.3常用的数学函数
y = abs(x) % 取 x 的绝对值;
y = mod(x) % 模除求余 ;
y = sin(x) % 取 x 的正弦值,x 以弧度为单位;
y = sind(x) % 取 x 的正弦值,x 以角度为单位;
y = exp(x) % 自然指数 exp(x);
y = log(x) % 自然对数 ln(x),x 为正数;
y = x^a % 指数运算;
y = fix(x) %向零方向取整;
y = round(x) %四舍五入到最邻近的整数。
3.4表达式
将常量、变量、函数及 M 函数用运算符号按一定的规则连接起来的式子就叫做表达式。
运算符号包括算术运算符、关系运算符、逻辑运算符及 MATLAB 特有的逻辑函数和冒号运算、小括号运算。小括号运算是强制改变运算顺序的特殊运算符号,它是最优先级的运算。
3.5字符串
一个
ASCII
字符称为一个字元。多个字元可以构成一个字串(Strings),一个字符串是被视为一个列向量进行储存,每一个元素是其 ASCII 码值。
字元的操作函数有两个,
abs
(
字元或字符串
)
、
char
(
行向量或列向量
)
。
abs
返回的是字符串中所有字元对应的 ASCII 码组成的向量,char
返回的是其向量值所对应的字符。
字 符 串 转 换:
abs %字符串到 ASCII
转换;
setstr %ASCII 转换成字符串;
sscanf %用格式控制,字符串转换成数字;
fprintf %把格式化的文本写到文件中或显示屏上;
sprintf %用格式控制,数字转换成字符串;
lower %字符串转换成小写;
upper %字符串转换成大写;
num2str %数字转换成字符串;
str2num %字符串转换成数字;
str2mat %字符串转换成一个文本矩阵。
3.6矩阵
在输入矩阵时,应遵循下列约定: 整个矩阵用中括号括起来,同一行的数据应用空格或逗号隔开,不同行应用分号隔开。例如输入一个每行都是 1 的 3 阶矩阵,可在 MATLAB 的命令窗口中输入如下命令:
>> A=[1,1,1;1,1,1;1,1,1] % 则 MATLAB 就立即把刚才输入的矩阵给显示出来。
3.6.1矩阵加减
(1)矩阵的加减与一般纯量(Scalar)的加减类似;
(2)相加或相减的矩阵必需具有相同的维度。
3.6.2矩阵乘法
(1) 矩阵的乘法不可逆。
(2) 矩阵的“.*”与“*”是不同的。
(3) 矩阵可以和一个列向量作右乘运算,也可以和一个行向量作左乘运算。
3.6.3矩阵除法
(1)Matlab
提供了两种除法运算:左除(\)和右除(/)。一般情况下,
x=a\b
是方程
a*x =b
的解,而 x=b/a 是方程
x*a=b
的解。
(2)如果
a
为非奇异矩阵,则
a\b
和
b/a
可通过
a
的逆矩阵与
b
阵得到: a\b = inv(a)*b
b/a = b*inv(a)。
(3)数组除法:
A./B
表示
A
中元素与
B
中元素对应相除。
矩阵和一个数相乘或相除,结果是矩阵中每个元素乘以或除以该数。
3.6.4矩阵转置
想得到任何矩阵 z 的转置(Transpose),则可表示成矩阵 z′ 。
3.6.5矩阵拆分
利用冒号表达式获得子矩阵。
①A(:,j)表示取 A 矩阵的第 j 列全部元素;
A(i,:)表示取出 A 矩阵第 i 行的全部元素;
A(i,j)表示取 A 矩阵的第 i 行、第 j 列的元素。
②A(i:i+m,:)表示取 A 矩阵的第 i~i+m 行的全部元素;
A(:,k:k+m)表示取 A 矩阵的第 k~k+m 列的全部元素;
A(i:i+m,k:k+m)表示取 A 矩阵第 i~i+m 行内,并在第 k~k+m 列中的所有元素。
A(i,m:k:n)表示从矩阵 A 的第 i 行中,第 m 到 n 列每隔 k 列取一个值。
③A(i)表示从 A 矩阵中取第 i 个数(以列的顺数计数)。
3.6.6对角矩阵
对角矩阵定义:只有对角线上有非 0 元素的矩阵。
例:提取对角线上的元素
>> D=
diag
([1 2 3;4 5 6;7 8 9])
D =
1
5
9
例:构造对角矩阵:diag(V)
>> d=
diag
(1:5)
d =
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
0 0 0 0 5