MATLAB学习:变数(变量)与档案存取

目录

一、变量

1、变量类型转换

 2、字符(char)

3、字符串(string)

4、结构体(structure)

5、元胞数组(cell array)

 6、多维数组(Multidimensional Array)

 二、档案读取

1、save()和 load()

2、Excel文件读取:xlsread()

3、Excel文件的写入:xlswrite()

4、Excel的标题读取

5、低阶文件输入输出


一、变量

1、变量类型转换

eg:

我们在命令窗口输入A=20,可以看到变量A的类型是double

然后我们执行 B=int8(A),可以看到变数B的类型发生了转换

 2、字符(char)

表示一个字符,eg: s1='h',注意要是用单引号框起来

*使用whos可以查看当前存在的变量及类型:

3、字符串(string)

表示多个字符,eg:s1='example',s2='string'

①字符的连接:s3=[s1 s2];       %[ ]起到连接的作用

                         s4=[s1;s2];       %s1有7个长度,s2有6个长度,维度不同

②数字和逻辑运算也可以用字符串

eg:str=='aardvark';==>str(3)='a'

'a'==str  %==是逻辑运算,比较str的每一个字符是否等于a,每一个字符都与'a'做逻辑运算

str(str=='a')='z',首先我们知道str=='a'的结果是11000100,那么就变成了str(11000100),那么可以看出运行的结果就是'a'的位置都变成'Z'了。

如果要比较整个字符串,可以使用strcmp函数,tf=strcmp(str1,str2),逐位比较字符串str1与str2,如果完全相等则tf=1,否则tf=0。

>> str1='arrdvark';
>> str='zzrdvzrk';
>> strcmp(str,str1)

ans =

  logical

   0

ex:编写一个脚本来反转任何给定的字符串

s1='I like the letter E';
%第一种,利用for循环
L=strlength(s1); % 计算s1的长度
for i=1:L
    s2(i)=s1(L+1-i); %实现字符串的反转
end

%第二种,直接利用-1步长从尾到头
s2=s1(size(s1,2):-1:1);

结果:

>> s2

s2 =

    'E rettel eht ekil I'

4、结构体(structure)

用来存储异构数据,s = struct(field1,value1,...,fieldN,valueN)

eg:记录班级的学生信息:field1=name,name的具体内容是Tom,name的变量类型是string

 如果想要单独显示grade,则进行如下操作:

 如果班级的学生不止一个,那么可以采用student(2).name='Ann',同理进行。

 

ex:找到Ann Lane的第三个成绩

下面给出structure常用的函数语句:

eg:fieldnames()的作用是将structure中的各个field的名称进行抓取

rmfield()的作用是将某一个field移除

structure的field可以是string,当然也可以是structure,例如下图所示,Project的field中,Name的类型是string,Compendia的类型是structure

 eg:

structure:A
field变量名称变量内容变量类型
1data[3 4 7;8 0 1]matrix
2neststruct
A中的field2
field变量名称变量内容变量类型
1testnumTest 1string
2xdata[4 2 8]matrix
3ydata[7 1 6]matrix

变量A含有两个field,分别是data与nest

A中的field2对应的struct中含有三个field:

如果structure含有很多field,举例如下:

 

那么我们在命令行输入s(1),可以得到如下结果:

输入s(2),结果如下:

可以看出,s(1)与s(2)就是将s的所有字段进行取值,分别取第一行与第二行

5、元胞数组(cell array)

如上图所示,给出一个变量A的内容,那么我们可以构建一个cell,用{}表示,有以下两种表示方式:

①第一种:A(*,*)={   }

②第二种: A{*,*}=

从下图我们可以看出,每一个元素(entry)都指向一个变量

 

 ex:

那么怎么读取cell呢?直接使用A(1,1)无法看出具体的内容,要看内容应该使用{}即A{1,1}

*小括号()读取的是指针,大括号{}返回的事具体内容

如果想进一步得到A{1,1}中矩阵的第一个元素呢,我们可以将A{1,1}整体看做一个矩阵然后使用A{1,1}(1,1)得到第一个元素:

 cell array的函数:

①structure与cell是可以相互转换的,利用cell2struct()函数与struct2cell()函数

②num2cell()与mat2cell()函数

eg:

这里我们给出的a是一个3×3的幻方矩阵:

经过转换后的b:每一个entry都是cell的entry

如果我们要将每几个entry进行转换,采用mat2cell(input,rowDist,column)函数,其中第一个变量是给出输入的matrix,第二个变量给出的是进行分块的行的数目,第三个变量是给出的列。以下图为例,c=mat2cell(a,[1 1 1 ],3),其中a是一个3×3的幻方矩阵;[1 1 1],分成了三个行数为一的矩阵,三个矩阵总行数相加正好为a的行数;3表示每个矩阵的列数,正好也是矩阵a的列数。以上分析可知c=mat2cell(a,[1 1 1 ],3)将矩阵按照行分成了三个1×3的矩阵,结果如下:

 c:

 6、多维数组(Multidimensional Array)

 eg:

①第一种方式:A{row,column,layer},适用于比较简单的结构

②第二种方式:cat()函数,比较方便

那么我们上面给出的例子就可以化简为以下形式:

补充:reshape()函数,假设一个matrix是r1×c1,那么使用reshape()函数,可以重新构造一个r2×c2的新的matrix,但必须满足r1×c1=r2×c2。使用方式有以下两种:

①B=reshape(A,sz),其中sz是一个向量来决定matrix B的规格并且sz至少两个元素,例如B=reshape(A,[2 3])将matrix A重构成一个2×3的matrix B。

②B=reshape(A,sz1,sz2,......,szN),其中sz1到szN规定了每一个对应维度的大小,当然也可以使用[ ],那么这个维度的大小将自行计算,例如matrix A的规格是10×10,B=reshape(A,2,2,[])将matrix A重构成2×2×25的matrix B。

不仅仅是矩阵,cell也可以使用reshape()函数,举例如下:

 ex:

判断变量的类型:

 二、档案读取

 

如何将work space里的数据存储到file中,又如何将file中的数据读到work space中。

MATLAB存储数据的方式第一种是存储在work space中,第二种是存储为text,最后一种比较高阶的方式是存储为excel。前两种方式读取数据使用load()函数,存储数据使用save()函数,第三种使用xlsread()读取数据,xlswrite()存储数据。

1、save()和 load()

上面的例子是将work space的变量a存储在mydata1文件中,找到mydata1.mat文件打开我们是无法清楚的读取到存储的四阶幻方矩阵a的,想要正确的读取,应该采用以下指令:

save mydata2.mat -ascii

那么从file中读取数据到work space使用load(),执行以下指令后,我们可以在 work space中看到:

load('mydata1.mat')

由于存储mydata2时,采用的ASCII码,所以读取的时候也要使用ASCII码进行读取,否则无法正确读取:

load('mydata2.mat','-ascii')

如果work space中有很多变量,我们只想存储某个特定的变量又该如何操作呢?

ex:

2、Excel文件读取:xlsread()

建立excel如下:

注意:在桌面建立excel,进行存储的时候会发现路径报错,所以我们应该在MATLAB的文件夹下存储excel。

 

 进行文件读取,执行下面的指令只会读取到excel的数据:

 Score=xlsread('04Score.xlsx')

如果读取excel中的某些范围数据,执行下面的指令读取的是B2到D4的数据:

Score=xlsread('04Score.xlsx','B2:D4')

3、Excel文件的写入:xlswrite()

计算excel的平均值并写入excel,但注意要把excel关掉运行:

执行下面的代码:

M=mean(Score')';
xslwrite('04Score.xlsx',M,1,'E2:E4');

*注意:mean()是按列计算,而我们要求的平均数是每个人的三个数据的平均,因此要将Score先转置即Score'得到一个1×3的行向量,存储的时候是3×1的列向量,因此又要进行一次转置,所以就是M=mean(Score')'

打开excel可以看到:

 如果想要把标头写进去,那么执行如下:

xlswrite('04Score.xlsx',{'Mean'},1,'E1');

得到结果:

 ex:计算标准差并写入F

 *std()函数用来计算标准差

STD=std(Score')';
xlswrite('04Score.xlsx',STD,1,'F2:F4');
xlswrite('04Score.xlsx',{'Standard Deviations'},1,'F1');
 

打开excel:

上面介绍的函数可以帮助我们实现excel与MATLAB之间数据的读取与写入,但如果我们也想读取excel表格的标题应该怎么办呢?

4、Excel的标题读取

同时读取数据和标题:

执行以下指令:

[Score Header]=xlsread('04Score.xlsx')

结果如下:

那么如何将标题与数据同时存储在一个excel文件中?

ex:

5、低阶文件输入输出

首先file必须要有一个ID才能正确的打开文件也就是fid,其次需要一个文件指针(pointer)去准确的读取我们想要的数据。

 ①打开和关闭文件

permission:给定文档的权限,可以读可以写等等。

②数据的读和写

 eg:

首先我们要产生x与y,然后打开一个file,再将x与y写入file,最后关闭file。

x=0:pi/10:pi; % 产生x
y=sin(x); % 产生y
fid=fopen('sinx.txt','w');% 打开一个文档,权限是写入
for i=1:11
    fprintf(fid,'%5.3f %8.4f\n',x(i),y(i));% 将x与y写入文档,%5.3f说明总共的数是5个小数点后有3个,\n是换行
end
fclose(fid); % 将文档关闭
type sinx.txt % 看内容

 

ex:

建立如下txt文件:

 使用MATLAB读取文件:

fid=fopen('asciiData.txt','r');  % 打开需要的txt文件,权限是读取数据
i=1;
while ~feof(fid)   % feof()函数用来判断是否读取到文档的结尾,feof(fid)=1则说明读完了文档
    name(i,:)=fscanf(fid,'%5c',1); % :是所有列的意思,%5c是读取5位长度的字符。因为name是char格式,他的第一列就是j一个字母,第二列是o以此类推
    year(i)=fscanf(fid,'%d',1);
    no1(i)=fscanf(fid,'%d',1);
    no2(i)=fscanf(fid,'%d',1);
    no3(i)=fscanf(fid,'%g',1);
    no4(i)=fscanf(fid,'%g\n');
    i=i+1;
end
fclose(fid);

得到结果如下:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值