MATLAB(三)数据类型与文件读写

基础知识:https://blog.csdn.net/ncepu_Chen/article/details/103065580


数据类型:
true,false
char
numerric:int8,uint8,single,double,int16,uint16,int32,uint32,int64,uint64
cell
struct
function


class(变量),可以查看数据类型,不声明变量类型那么就是默认double类

标准的ASCII字符可以被转换为对应的ASCII码
s1 = 'h';
uint16(s1) %得到104

字符串还是单引号,如'hello'
str1 = 'hellol';
str2 = 'hh';

size(str1) %得到[1,6],即1行6列
str1(1) %'h',索引从1开始
str3 = [str1 str2]; %'hellolhh'

'l'==str1; %得到一个logical数组,是'l'地方是1 ,[001121]
seiz(str3); %[1 8]
替换:str(str=='l') = 'Z'; %'heZZoZ'


结构体:存储是{键:值},使用 . 来访问结构体中字段
MAT中结构体直接开始写,不是C的先声明
st.name = 'tom';
st.id = '123';
st.sex = '男';
st.grade = [100,75,85,...
56,85,88,....
100,52];
st %结构体打印

上面默认是str(1)结构体
也可以写str(2).name = 'se';
此时
命令行 str 得到是键,没有具体数值。而且str(2)另外添加的键也会在str(1)中显示,只是个空的矩阵

s = setfield(s,'field',value);把结构体s中fileld的值变化成value
如果是setfield(s,'field',value);不会改变


importdata函数

importdata函数主要特点是可以从文本文件中导入数据
导入的数据可以是类似于表格形式的,可以含有表头即列名称,也可以不含表头。
表头可以是文本形式的。
除了官方文档说明的这些我发现,importdata导入的数据除了可以列名外还可以含有行名。导入时列名会被放在colheaders数组中,行名会被放在rowheaders数组中。
importdata还可以用来导入图片,传入图片的名称即可,前提是图片在工作路径里
importdata函数会将数据导入到一个结构体变量中,文本与数字分别导入到结构不同的属性中。
数字部分导入到属性data中是一个矩阵,文本部分导入属性textdata中是一个细胞数组。
如果textdata中的文本是列名则同时还会保存到属性colheaders中,是行名会保存到rowheaders中

当有超过两行文字标题时,前面行当作一个字符串,最后一行是列标题存入colheaders(Demo3)

当最后一列是文字时,每行作为一个字符串(Demo5
A = importdata('-pastespecial')

load函数
load函数一般将用来导入纯数字的文件,可以是文本格式的文件或者是matlab保存的mat格式的文件。
load 文件名 ,即可引入文件
save 文件名;保存当前所有变量
save 文件名 A;保存变量A到文件
save 文件名 -ascill 以ascii码形式保存

fopen(文件名,方式)
'r' 打开文件进行读取。
'w' 打开或创建新文件进行写入。 丢弃现有内容(如果有)。
'a' 打开或创建新文件进行写入。 将数据追加到文件末尾。
'r +' 打开文件进行读写。
'w +' 打开或创建用于读取和写入的新文件。 丢弃现有内容(如果有)。
'a +' 打开或创建用于读取和写入的新文件。 将数据追加到文件末尾。
'A' 打开文件进行追加,而不会自动刷新当前输出缓冲区。
'W' 打开文件进行写入,而不会自动刷新当前输出缓冲区。

fprintf(fileID,formatSpec,A1,...,An)
按列顺序将 formatSpec 应用于数组 A1,...An 的所有元素,并将数据写入到一个文本文件。fprintf 使用在对 fopen 的调用中指定的编码方案。
type 文件名,查看文件内容
fileID:将要写入的文件
formatSpec:写入的格式
A1。。。An是数组

fprintf(formatSpec,A1,...,An) 直接显示结果

使用fprintf需要先fopen打开文件
A1 = [9.9, 9900];
A2 = [8.8, 7.7 ;...
8800, 7700;...
8.5, 9.8];
formatSpec = 'X is %4.2f meters or %8.3f mm\n';
fprintf(formatSpec,A1,A2)

X is 9.90 meters or 9900.000 mm
X is 8.50 meters or 7.700 mm
X is 7700.00 meters or 9.800 mm
这里写出了A1和A2按此格式写出的样子
格式在数组里取值是按列来的
A1:[9.9 9900] 取值方式:一列一列来,9.9取到放到%4.2f,然后往下看发现没有了,就到第2列,把9900放到%8.3f
A2:
[8.8 7.7 ]
[8800 7700]
[8.5 9.8 ]
取值方式:一列一列来,8.8到4.2f,8800到8.3f,8.5到4.3f,第一列读完,到第2列,7.7到8.3f,7700到4.3f,9.8到8.3f

A = fscanf(fileID, format)
A = fscanf(fileID, format, sizeA)
[A, count] = fscanf(...)
A 是接受数据的矩阵。count为元素个数
需要先fopen打开文件,文件打开不用fclose关闭,自此期间读出来的数据将不会再被读,举个例子就是指针指到了上次最后一个读出数据的后面第一数,再读就从这个数往后匹配然后读出。如果fclose掉文件中心fopen开,就可以读已经读出的部分
现主要讲解主要用到的第二种形式:

A = fscanf(fileID, format, sizeA)

  • A 是你从打开的文件中读入数据最后存储的一个矩阵 叫做A
  • fileID是从前提函数中返回的结果,代表你要打开的文件是否已经正常打开,其原型为 fid = fopen(fileName, 'r');返回值要么为0 要么为 1 logical value
  • format 就是数据的格式 比如: %d 就是十进制
  • sizeA 这个表示A最终的维数 ,比如[3,3]代表A最终是3x3的矩阵,从原始文件中读的时候是按行读,写入A中时按列优先。直到满足sizeA所表示的维数,其余的丢弃不要。

mydata.txt:
1 2 3
4 5 6
4 5 6
7 8 9

fileID = fopen('mydata.txt','w');
A = fscanf(fileID, '%d', [3,3]);
%结果:横着读。竖着写
A =
1 4 4
2 5 5
3 6 6

你可能感兴趣的:(MATLAB(三)数据类型与文件读写)