本文主要是介绍MATLAB教程_04变数(变量)与档案存取_台大郭彦甫课程笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
MATLAB教程_04变数(变量)与档案存取_台大郭彦甫课程笔记
- 一、变数/变量-string
- 1、类型
- 2、double 转 integer
- 3、Character(Char)字元
- 二、变数/变量-structure
- 1、宣告举例——学生作业成绩:
- 2、函数
- 3、嵌套结构
- 三、变数/变量-Cell Array 单元阵列
- 1、宣告
- 2、访问(读取) Cell Array 单元阵列
- 3、函数
- 4、怎样把矩阵转换成一个单元变量cell variable
- 5、多维数组
- 6、检查变量和变量状态
- 四、File Access文件存取
- 1、save()& load()
- 2、电子表格读取:xlsread()
- 3、电子表格写入:xlswrite()
- 4、低级文件输入/输出
一、变数/变量-string
1、类型
变量类型 | 含义 |
---|---|
double() | 转换为双精度 |
single() | 转换为单精度 |
int8() | 转换为8位有符号整数 |
int16() | 转换为16位有符号整数 |
int32() | 转换为32位有符号整数 |
int64() | 转换为64位有符号整数 |
uint8() | 转换为8位无符号整数 |
uint16() | 转换为16位无符号整数 |
uint32() | 转换为32位无符号整数 |
uint64() | 转换为64位无符号整数 |
p.s.变数形态,当作function使用
2、double 转 integer
>> B=int8(A)
B =int820
3、Character(Char)字元
指定一个Character到一个变数,用一个变数储存,用 单引号 来指定,把变数框在里面。
>> s1 = 'h'
whos
s1 ='h'Name Size Bytes Class AttributesA 1x1 8 double B 1x1 1 int8 s1 1x1 2 char >> s1 = 'hex'
s1 ='hex'
>> whosName Size Bytes Class AttributesA 1x1 8 double B 1x1 1 int8 s1 1x3 6 char
>> s1 = 'h'
whos
uint16(s1)
s1 ='h'Name Size Bytes Class AttributesA 1x1 8 double B 1x1 1 int8 s1 1x1 2 char ans =uint16104
>> s2 = 'H'
whos
uint16(s2)
s2 ='H'Name Size Bytes Class AttributesA 1x1 8 double B 1x1 1 int8 ans 1x1 2 uint16 s1 1x1 2 char s2 1x1 2 char ans =uint1672
4、String 多字元
宣告:
s1 = 'Example';
s2 = 'String';s3 = [s1 s2];
s4 = [s1; s2]; %加分号,变矩阵=============================
>> s1 = 'Example';
s2 = 'String';
>> s3 = [s1 s2]
s3 ='ExampleString'
>> s4 = [s1; s2]
错误使用 vertcat
要串联的数组的维度不一致。
%字符串长度不一样,不能放在一个矩阵中
5、逻辑运算和分配
许多数字和逻辑运算符可以应用于字符串
>> str = 'aardvark';
>> str(3)
ans ='r'>> str = 'aardvark';
>> 'a' == str
ans =1×8 logical 数组1 1 0 0 0 1 0 0
%每个位置分别做逻辑运算>> str(str == 'a') = 'Z'
str ='ZZrdvZrk'
%完成的功能是:将 a 都换为 Z
- 练习1:
练习:比较整个string和’aardvark’是否相等
提示:strcmp-比较字符串
str_input = input('Please enter an 8-bit string: ','s');
str_judge = isempty(str_input);
str = 'aardvark';
if str_judge == 1disp('Invalid input');
elsefor i = 1:8result = str_input(i) == str(i);disp(result);i = i+1;end
end============================================
>> class04_practice1
Please enter an 8-bit string: asdfghjk10000001
- 练习2:编写一个脚本来反转任何给定的字符串
s1=‘I like the letter E’
↓↓
s2=‘E rettel eht ekil I’
str_input = input('Please enter a string: ','s');
str_judge = isempty(str_input);
n = length(str_input);
%length函数用来计算字符串的长度
if str_judge == 1disp('Invalid input');
elsestr = str_input;for i = 1:nstr(n-i+1) = str_input(i);i = i+1;end
end
disp(str);
==============================================
>> class04_practice2
Please enter a string: I like the letter E
E rettel eht ekil I
二、变数/变量-structure
•一种存储异构数据的方法
•结构包含称为字段的数组
1、宣告举例——学生作业成绩:
1)基本
student.name = 'John Doe';
student.id = 'jdo2@sfu.ca';
student.number = 301073268;
student.grade = [100, 75, 73; ...95, 91, 85.5; ...100, 98, 72];
student
student =包含以下字段的 struct:name: 'John Doe'id: 'jdo2@sfu.ca'number: 301073268grade: [3×3 double]
>> student.grade
ans =100.0000 75.0000 73.000095.0000 91.0000 85.5000100.0000 98.0000 72.0000
2)向结构添加信息
>> student(2).name = 'Ann Lane';
student(2).id = 'aln4@sfu.ca';
student(2).number = 301078853;
student(2).grade = [95 100 90; 95 82 97; 100 85 100];
>>
>> student
student =包含以下字段的 1×2 struct 数组:nameidnumbergrade
- 练习3:检索Ann Lane的第三个成绩
>> student(2).grade(3)
ans =100
>> student(2).grade(1,3)
ans =90
2、函数
函数名 | 解释 |
---|---|
cell2struct | 将单元数组转换为结构数组 |
fieldnames | 结构的字段名,或对象的公共字段 |
getfield | 结构阵列场 |
isfield | 确定输入是否为结构数组字段 |
isstruct | 确定输入是否为结构数组 |
orderfields | 结构数组的序域 |
rmfield | 从结构中删除字段 |
setfield | 为结构数组字段赋值 |
struct | 创建结构数组 |
struct2cell | 将结构转换为单元数组 |
structfun | 将函数应用于标量结构的每个字段 |
举例——
>> fieldnames(student)
ans =4×1 cell 数组{'name' }{'id' }{'number'}{'grade' }
>> student
student =包含以下字段的 1×2 struct 数组:nameidnumbergrade
>> rmfield(student,'id')
ans =包含以下字段的 1×2 struct 数组:namenumbergrade
3、嵌套结构
A = struct('data', [3 4 7; 8 0 1], 'nest', ... %第一个file是一个string,第二个file是一个matrix,第三个file是一个string,第四个file另外一个structure(有4个file)struct('testnum' , 'Test 1', ...'xdata', [4 2 8],'ydata', [7 1 6]));%这样就是一个nesting structure嵌套结构
A(2).data = [9 3 2; 7 6 5];
A(2).nest.testnum = 'Test 2';
A(2).nest.xdata = [3 4 2];
A(2).nest.ydata = [5 0 9];
A.nest
ans =包含以下字段的 struct:testnum: 'Test 1'xdata: [4 2 8]ydata: [7 1 6]
ans =包含以下字段的 struct:testnum: 'Test 2'xdata: [3 4 2]ydata: [5 0 9]
>> A
A =包含以下字段的 1×2 struct 数组:datanest
>> A(1)
ans =包含以下字段的 struct:data: [2×3 double]nest: [1×1 struct]
三、变数/变量-Cell Array 单元阵列
存储异构数据(阵列)的另一种方法
类似于矩阵,但每个条目包含不同的数据类型
使用{ }声明
1、宣告
1)第一种
>> A(1,1)={[1 4 3; 0 5 8; 7 2 9]};
A(1,2)={'Anne Smith'};
A(2,1)={3+7i};
A(2,2)={-pi:pi:pi};
A
A =2×2 cell 数组{3×3 double } {'Anne Smith'}{[3.0000 + 7.0000i]} {1×3 double }
2)第二种
>> A{1,1}=[1 4 3; 0 5 8; 7 2 9];
A{1,2}='Anne Smith';
A{2,1}=3+7i;
A{2,2}=-pi:pi:pi; A
A =2×2 cell 数组{3×3 double } {'Anne Smith'}{[3.0000 + 7.0000i]} {1×3 double }
把 Cell Array 单元阵列当成一个指标(pointer),例如上述将a(1,1)指向一个矩阵,将a(1,2)指向一个字符串等。
- 练习4:创建具有以下结构的单元数组B
>> B(1,1)={'This is the first cell'};
B(1,2)={[5+j*6 4+j*5]};
B(2,1)={[1 2 3; 4 5 6; 7 8 9]};
B(2,2)={["Tim","Chris"]};
B
B =2×2 cell 数组{'This is the first cell'} {1×2 double}{3×3 double } {1×2 string}
2、访问(读取) Cell Array 单元阵列
>> A(1,1) %是说指到的内容是什么
ans =1×1 cell 数组{3×3 double}%要看cell array中的内容要用大括号
>> A{1,1}
ans =1 4 30 5 87 2 9%要知道矩阵中某一具体元素是多少
>> A{1,1}(1)
ans =1
>> A{1,1}(1,1)
ans =1
>> A{1,1}(1,3)
ans =3
3、函数
函数名 | 解释 |
---|---|
cell | 创建单元格数组 |
cell2mat | 将单元格数组转换为数字数组 |
cell2struct | 将单元数组转换为结构数组 |
celldisp | 单元格数组内容 |
cellfun | 对单元格数组中的每个单元格应用函数 |
cellplot | 单元阵列结构的图形显示 |
cellstr | 从字符数组创建字符串单元格数组 |
iscell | 确定输入是否为单元格数组 |
mat2cell | 将数组转换为具有不同大小单元格的单元格数组 |
num2cell | 将数组转换为大小一致的单元格数组 |
struct2cell | 将结构转换为单元数组 |
structure和cell可以做转化
4、怎样把矩阵转换成一个单元变量cell variable
num2cell
mat2cell
举例:将一个3×3矩阵变成一个3×3cell
%将每一个元素都独立变成cell里面的一个元素
>> a = magic(3)
b = num2cell(a)
a =8 1 63 5 74 9 2
b =3×3 cell 数组{[8]} {[1]} {[6]}{[3]} {[5]} {[7]}{[4]} {[9]} {[2]}%分组,三个列
被放在一起,三个行被分开
>> a = magic(3)
c = mat2cell(a, [1 1 1], 3)
a =8 1 63 5 74 9 2
c =3×1 cell 数组{1×3 double}{1×3 double}{1×3 double}
5、多维数组
1)基础宣告方法
A{1,1,1} = [1 2;4 5];
A{1,2,1} = 'Name';
A{2,1,1} = 2-4i;
A{2,2,1} = 7;
A{1,1,2} = 'Name2';
A{1,2,2} = 3;
A{2,1,2} = 0:1:3;
A{2,2,2} = [4 5]';
>> A2×2×2 cell 数组
A(:,:,1) ={2×2 double } {'Name'}{[2.0000 - 4.0000i]} {[ 7]}
A(:,:,2) ={'Name2' } {[ 3]}{1×4 double} {2×1 double}
2)concatenation串联:cat()
把两个矩阵这样接起来,就用到这个指令
>> A{1,1} = [1 2;4 5];
A{1,2} = 'Name';
A{2,1} = 2-4i;
A{2,2} = 7;
B{1,1} = 'Name2';
B{1,2} = 3;
B{2,1} = 0:1:3;
B{2,2} = [4 5]';
C = cat(3, A, B)2×2×2 cell 数组
C(:,:,1) ={2×2 double } {'Name'}{[2.0000 - 4.0000i]} {[ 7]}
C(:,:,2) ={'Name2' } {[ 3]}{1×4 double} {2×1 double}
3)reshape(要改变的矩阵,改变后的行数,改变后的列数)
>> A = {'James Bond', [1 2;3 4;5 6]; pi, magic(5)}
C = reshape(A,1,4)
A =2×2 cell 数组{'James Bond'} {3×2 double}{[ 3.1416]} {5×5 double}
C =1×4 cell 数组{'James Bond'} {[3.1416]} {3×2 double} {5×5 double}
- 练习5:使用“reshape”从下面的矩阵A创建矩阵B。
>> A=[1:3;4:6]
A =1 2 34 5 6
>> B=reshape(A,3,2)
B =1 54 32 6
6、检查变量和变量状态
is+function
四、File Access文件存取
•支持的文件格式:
文件内容 | 扩展 | 说明 | 导入函数 | 导出函数 |
---|---|---|---|---|
MATLAB格式数据 | MAT | 保存的MATLAB工作区 | load | save |
Text | 空格分隔的数字 | load | save | |
电子表格 | XLS,XLSX | xlsread | xlswrite |
1、save()& load()
1)将(所有)工作区数据保存到文件:
clear; a = magic(4);
save mydata1.mat
save mydata2.mat -ascii
举例——
>> clear; a = magic(4);
save mydata1.mat
>> a
a =16 2 3 135 11 10 89 7 6 124 14 15 1
打开记事本可查看
2)使用纯文字档案,可以编辑或阅读的档案,资料存储档案,后面要加 ascii
>> save mydata2.mat -ascii
打开记事本可查看
3)加载存储在文件中的数据:
>> load('mydata1.mat')
4)加载存储在 ascii 文件中的数据:
>> load('mydata2.mat','-ascii')
- 思考题1:如何保存特定变量?
save(filename,variables)
仅保存variables指定的结构体数组的变量或字段
2、电子表格读取:xlsread()
>> Score = xlsread('class04_practice_score.xlsx')
Score =94 83 8976 88 8268 72 75>> Score = xlsread('class04_practice_score.xlsx', 'B2:D4')
Score =94 83 8976 88 8268 72 75
3、电子表格写入:xlswrite()
1)举例——计算平均值并写入Excel电子表格
>> M = mean(Score')';
xlswrite('class04_practice_score.xlsx', M, 1, 'E2:E4');
xlswrite('class04_practice_score.xlsx', {'Mean'}, 1, 'E1');
%“1”是表格1的意思
2)
- 练习6:计算标准偏差并将其写入F列
>> N = std(Score')';
xlswrite('class04_practice_score.xlsx', N, 1, 'F2:F4');
xlswrite('class04_practice_score.xlsx', {'standard deviations'}, 1, 'F1');
3)在MATLAB中读取标题
在MATLAB中,标题和数据是两种不同的变量,需要分开处理。
>> [Score Header] = xlsread('class04_practice_score.xlsx')
Score =94.0000 83.0000 89.0000 88.6667 5.507676.0000 88.0000 82.0000 82.0000 6.000068.0000 72.0000 75.0000 71.6667 3.5119
Header =4×6 cell 数组列 1 至 5{0×0 char} {'Test1' } {'Test2' } {'Test3' } {'Mean' }{'John' } {0×0 char} {0×0 char} {0×0 char} {0×0 char}{'Selina'} {0×0 char} {0×0 char} {0×0 char} {0×0 char}{'Peter' } {0×0 char} {0×0 char} {0×0 char} {0×0 char}列 6{'standard deviat…'}{0×0 char }{0×0 char }{0×0 char }
现在是两个变量,要怎样把这两个变量放在一起,然后储存回去,用xlsread写回去?
- 思考题2:如何将文本和数字写入Excel文件?
>> for i = 2:4
for j = 2:6
Header{i,j} = Score(i-1,j-1);
j=j+1;
end
i=i+1;
end
4、低级文件输入/输出
•在字节或字符级别读写文件
•文件具有ID fid
•文件中的位置由可移动的指针指定
Function | Description |
---|---|
fopen | 打开文件,或获取有关打开文件的信息 |
fclose | 关闭一个或所有打开的文件 |
fscanf | 从文本文件读取数据 |
fprintf | 将数据写入文本文件 |
feof | 文件结尾测试 |
1)打开和关闭文件:
2)举例——将正弦值写入文件A
思路:
1、生成 x,y
2、打开一个文件
3、把x,y写入文件
4、关闭文件
x = 0:pi/10:pi;
y = sin(x);
fid = fopen('class04_practice_sinx.txt','w');
for i=1:11fprintf(fid,'%5.3f %8.4f\n', x(i), y(i));
end
fclose(fid);
type class04_practice_sinx.txt
3)’%5.3f %8.4f\n’通过格式化I/O进行读写
符号 | 含义 |
---|---|
%c | 单个字符 |
%d | 十进制表示法(有符号) |
%e | 指数记数法 |
%f | 定点表示法 |
%g | %e或%f中更紧凑的 |
%o | 八进制表示法(无符号) |
%s | 字符串 |
%u | 十进制表示法(无符号) |
%x | 十六进制表示法 |
举例——从文件读取,检查是否为文件结尾:feof(fid)【视频:1:38:20】
这篇关于MATLAB教程_04变数(变量)与档案存取_台大郭彦甫课程笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!