MATLAB基础笔记3:数据类型和文件读写

MATLAB笔记3:数据类型和文件读写

此篇笔记只记录较重要知识点,一些和其他编程语言相似不做记录

数据类型

  • String连接
>> s1 = 'Example';
s2 = 'String';
>> s3 = [s1 s2]

s3 =

    'ExampleString'

>> s4 = [s1;s2]
错误使用 vertcat
要串联的数组的维度不一致。

以上s4会出错,因为两个字符串要纵向连接需要维度相同,即字符个数相同

  • String筛选
>> str = 'aardvark';
'a' == str

ans =

  1×8 logical 数组

   1   1   0   0   0   1   0   0

>> str(str=='a') = 'z'

str =

    'zzrdvzrk'
  • 结构体
>> 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: 301073268
     grade: [3×3 double]

增加结构体数组的元素 :

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];

获得Ann的grade的第三个数据

>> student(2).grade(3)

ans =

   100
  • 结构体 function
    在这里插入图片描述
>> fieldnames(student)

ans =

  4×1 cell 数组

    {'name'  }
    {'id'    }
    {'number'}
    {'grade' }

>> rmfield(student,'id')

ans = 

  包含以下字段的 1×2 struct 数组:

    name
    number
    grade
  • 嵌套结构体
>> A = struct('data', [3 4 7; 8 0 1], 'nest', ...
struct('testnum', 'Test 1', ...
'xdata', [4 2 8],'ydata', [7 1 6]));
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有两个域,data和nest,nest结构体又含有三个域

  • Cell Array : cell数组
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{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

A =

  2×2 cell 数组

    {3×3 double        }    {'Anne Smith'}
    {[3.0000 + 7.0000i]}    {1×3 double  }

>> A(1,1)

ans =

  1×1 cell 数组

    {3×3 double}

>> A{1,1}

ans =

     1     4     3
     0     5     8
     7     2     9

可以看出大括号索引能获得具体数据信息

  • 幻方矩阵
>> a = magic(3)

a =

     8     1     6
     3     5     7
     4     9     2

>> sum(a)

ans =

    15    15    15

>> sum(a,2)

ans =

    15
    15
    15

每行总和等于每列总和

  • 关于cell array 的 function
>> a

a =

     8     1     6
     3     5     7
     4     9     2

>> b = num2cell(a)

b =

  3×3 cell 数组

    {[8]}    {[1]}    {[6]}
    {[3]}    {[5]}    {[7]}
    {[4]}    {[9]}    {[2]}

>> c = mat2cell(a, [1 1 1], 3)

c =

  3×1 cell 数组

    {1×3 double}
    {1×3 double}
    {1×3 double}

mat2cell()函数有两种划分方法:
C = mat2cell(A,dim1Dist,…,dimNDist)
C = mat2cell(A,rowDist)

第一种示例:

>> A = reshape(1:20,5,4)'

A =

     1     2     3     4     5
     6     7     8     9    10
    11    12    13    14    15
    16    17    18    19    20

 
>> C = mat2cell(A,[1 3],[2 3])

C =

  2×2 cell 数组

    {1×2 double}    {1×3 double}
    {3×2 double}    {3×3 double}

[1,3] 和 [2,3] 分别对应4X5的矩阵A

  • 多维数组
% {}中第三个为第三维的索引
% -------第一层-------
A{1,1,1} = [1 2;4 5];
A{1,2,1} = 'Name';
A{2,1,1} = 2-4i;
A{2,1,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]';
  • 数组连接(二维与三维):cat() 方法
A=[1 2;3 4]; 
B=[5 6;7 8];
C=cat(1,A,B); % 纵向连接
C=cat(2,A,B); % 横向连接
C=cat(3,A,B); % 三维连接

cell array 的三维连接

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)

File Access 文件存取

  • 保存
clear; 
a = magic(4);
save mydata1.mat
save mydata2.mat -ascii
  • 读取
load('mydata1.mat')
load('mydata2.mat','-ascii')
  • 加载excel文件
Score = xlsread('04Score.xlsx')
Score = xlsread('04Score.xlsx', 'B2:D4')
% B2:B4 指定行列数
  • 写入excel文件
% 求出每个人的平均成绩写回 excel文件
M = mean(Score')';
xlswrite('04Score.xlsx', M, 1, 'E2:E4');
xlswrite('04Score.xlsx', {'Mean'}, 1, 'E1');
  • 底层文件操作 fopen,fclose,fscanf,fprintf
x = 0:pi/10:pi; 
y = sin(x); 
fid = fopen('sinx.txt','w');
for i=1:11
    fprintf(fid,'%5.3f %8.4f\n', x(i), y(i));
end
fclose(fid); 
type sinx.txt

type filename:显示文件内容
文件中内容如下:(列标题除外!)

xy
0.0000.0000
0.3140.3090
0.6280.5878
0.9420.8090
1.2570.9511
1.5711.0000
1.8850.9511
2.1990.8090
2.5130.5878
2.8270.3090
3.1420.0000
fid = fopen('04asciiData.txt','r'); i = 1;
while ~feof(fid)
    name(i,:) = fscanf(fid,'%5c',1);
    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);

feof(fid)检测文件是否结束


  • B站教程链接

台大郭彦甫matlab教程: 点击链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值