《Matlab学习》【3】数据结构与文件访问

发布于:2022-11-03 ⋅ 阅读:(445) ⋅ 点赞:(0)

目录

1.char

2.string

3.逻辑运算和分配

4.结构体---structure

5.嵌套结构体---Nesting Structures

6.元胞数组---Cell Array

7.多维数组---Multidimensional Array

8.cat()串联数组

9.reshape()---重构数组

10.文件访问---save()、load()、xlsread()、xlswrite()

10.1save()

10.2load()

10.3xlsread()

10.4xlswrite()

10.5同时读取文本和数字

11.I/O功能

11.1fprintf()写

11.2fscanf()读


变量类型

1.char

示例:

>> s1 = 'h'; % 把h的ascii码显示出来 同理'H'也一样
whos;
uint16(s1)
  Name      Size            Bytes  Class    Attributes

  s1        1x1                 2  char               


ans =

  uint16

   104

2.string

示例:

>>s1 = 'Example';
>>s2 = 'String';% 声明两个字符串s1 s2
>> s3 = [s1 s2] % 合并成同一行

s3 =

    'ExampleString'
>> s4 = [s1; s2] % 报错因为Example和String的长不一样,所以不能并列
错误使用 vertcat
要串联的数组的维度不一致。

>> s2 = 'Stringg' % 重新声明s2的字符长度和s1一样
>> s4 = [s1; s2] % 此时合并成列成功
 
s4 =

  2×7 char 数组

    'Example'
    'Stringg'

3.逻辑运算和分配

示例:

>> str = 'aardvark'; 
>> 'a' == str % 将a与str中的字符一一匹配,相同的话返回1否则返回0

ans =

  1×8 logical 数组

   1   1   0   0   0   1   0   0

补充:

>> 'aardvark' == str % 如果被str一样的话会全部返回1

ans =

  1×8 logical 数组

   1   1   1   1   1   1   1   1

>> 'aardvar' == str % 要么是单个字符要么是和原来的字符串一样,其它情况都会报错
对于此运算,数组的大小不兼容。

相关文档
 
>> 'aardva' == str
对于此运算,数组的大小不兼容。

相关文档
 
>> 'aa' == str
对于此运算,数组的大小不兼容。

相关文档

如何让整个逻辑值返回1?

示例:

>> "aardvark" == str % 这里需要双引号

ans =

  logical

   1

如何计算str中某个字符的总个数?以a为例

示例:

>> str(str == 'a') % 这句话的意思会把str中的a全列出来

ans =

    'aaa'

>> length(ans) % 求str中的某个字符的长度 或者length(str(str == 'a'))合并成一句

ans =

     3

接下来怎么让str中的a全部更换成其它自己想要的字符?

示例:

>> str(str == 'a') = 'Z' % 将str中的a全部替换为Z

str =

    'ZZrdvZrk'

练习:字符串逆置 

示例:(仅供参考,每个人的写法不一样)

%字符串逆置 思路,从后到前索引
s1 = 'I like English';
k = 1;
for i = size(s1, 2) : -1 : 1 % s1是1×14的,size(s1, 2)就是第二个维度14 按-1递减
    for j = size(s1, 1) : 1 % size(s1, 1)就是第1个维度1
        s2(j, k) = s1(j, i); % 第一次就是s1(14, 1)最后一个字符h,以次类推,不断的存放在s2这个vector中
        k = k+1;
    end
end
disp(s2); % 把逆置的打印出来

结果:

>> demo_11
hsilgnE ekil I

4.结构体---structure

 示例:

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

结果:

>>student
student = 

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

    name
    id
    number
    grade

对student进行索引

示例:

>> student.name % 把所有name显示出来

ans =

    'John Doe'

ans =

    'Ann Lane'

>> student(1).name % 对第1个学生进行索引

ans =

    'John Doe'

>> student(2).name % 对第2个学生进行索引

ans =

    'Ann Lane'

>> student(1).grade % 显示第一个学生的成绩

ans =

  100.0000   75.0000   73.0000
   95.0000   91.0000   85.5000
  100.0000   98.0000   72.0000

>> student(1).grade(1,3) % 具体到某一个科目的成绩

ans =

    73

把student中的某一个字段值取掉?

示例:

>> fieldnames(student) % 返回student中的所有字段名称

ans =

  4×1 cell 数组

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

>> rmfield(student, 'id') % 将student中的id字段删除,你会发现此时是储存在ans中,所以student并没有删除

ans = 

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

    name
    number
    grade

>>student = rmfield(student, 'id') % 这句话就会把student中的id字段彻底删除

student = 

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

    name
    number
    grade

>> student.id % 再次查找报错
无法识别的字段名称 "id"。

一些结构体功能:

cell2struct 将元胞数组转换为结构体数组
fieldnames 结构体的字段名称
getfield

结构体数组字段

isstruct

确定输入是否为结构体数组

isfield

确定输入是否为结构体数组字段

orderfields

结构体数组的顺序字段

rmfield

删除结构体中的字段

setfield

为结构体数组字段赋值

sturuct

结构体数组

struct2cell

将结构体转换为元胞数组

structfun

对标量结构体的每个字段应用函数

5.嵌套结构体---Nesting Structures

struct s = struct(field,value) 创建具有指定字段和值的结构体数组。value 输入参数可以是任何数据类型

示例:

data是字段名,后面紧跟的是其对应的值,字段nest又是一个结构体

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

A = 

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

    data
    nest

索引上述的A结构体:

>> A.data % 全部的data都会显示

ans =

     3     4     7
     8     0     1


ans =

     9     3     2
     7     6     5

>> A(1).data % 只索引第1个的data

ans =

     3     4     7
     8     0     1

>> 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(1).nest.testnum % 索引第一个nest的testnum用A(1) 第二个的话就是A(2)

ans =

    'Test 1'

6.元胞数组---Cell Array

 如何直接构造这么一个元胞数组?

方式一:

>> % 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 =

  2×2 cell 数组

    {3×3 double        }    {'Anne Smith'      }
    {[3.0000 + 7.0000i]}    {[-3.1416 0 3.1416]}

方式二:

>> % 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 =

  2×2 cell 数组

    {3×3 double        }    {'Anne Smith'      }
    {[3.0000 + 7.0000i]}    {[-3.1416 0 3.1416]}

练习(创建这么一个cell):

 示例:

>> a(1, 1) = {'this is the first cell'};
>> a(1, 2) = {[5 + j*6 4 + j*5]};
>> a(2, 1) = {[1 2 3; 4 5 6; 7 8 9]};
>> a(2, 2) = {["Tim", "Chris"]};
>> a

a =

  2×2 cell 数组

    {'this is the first cell'}    {[5.0000 + 6.0000i 4.0000 + 5.0000i]}
    {3×3 double              }    {["Tim"    "Chris"                 ]}

对上述a进行索引(注意区分a()和a{}的区别):a()显示的是每一个cell,而a{}显示的是具体的cell的详细信息。示例:

>> a(1, 1) % 小括号

ans =

  1×1 cell 数组

    {'this is the first cell'}

>> a(2, 1)

ans =

  1×1 cell 数组

    {3×3 double}

>> a{1, 1} % 中括号

ans =

    'this is the first cell'

>> a{2, 1}

ans =

     1     2     3
     4     5     6
     7     8     9

>> a{2, 1}(3, 3) % 显示(2, 1)cell中的9

ans =

     9

cell相关功能(可官网自行查找):

 num2cell()和mat2cell()

num2cell()

将数组转换为相同大小的元胞数组

C = num2cell(A) 通过将 A 的每个元素放置于 C 的一个单独元胞中,来将数组 A 转换为元胞数组 C

C = num2cell(A,dim) 将 A 的内容划分成 C 中单独的元胞,其中 dim 指定每个元胞包含 A 的哪个维度

mat2cell() 将数组转换为在元胞中包含子数组的元胞数组

示例(可能解释的不是很清楚,可以按照下面的步骤敲一遍估计就有feel了):

>> a = magic(3) 

a =

     8     1     6
     3     5     7
     4     9     2

>> b = num2cell(a) % 将a中每一个位置上的元素都变成cell

b =

  3×3 cell 数组

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

>> c = mat2cell(a, [1 1 1], 3) % [1 1 1]这里表示的是有3行, 3表示的是3列,这里的,每一行有3列,这一行的三个数会组成一个cell数组,可以看成{1×3} {1×3} {1×3}--->3×1的cell数组。
c =

  3×1 cell 数组

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

>> d = mat2cell(a, [1 1 1], [1 1 1]) % {1×1}有9个

d =

  3×3 cell 数组

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

>> e = mat2cell(a, 3, 3) % 直接变成了一个1×1的cell数组 可能将的不是很清楚,多试试应该有神会

e =

  1×1 cell 数组

    {3×3 double}

>> e{1}

ans =

     8     1     6
     3     5     7
     4     9     2

>> e{1, 2} = 'i hate matlab!' % 可以往里面添加cell。

e =

  1×2 cell 数组

    {3×3 double}    {'i hate matlab!'}

>> e{2,1} = 'fff' % 会变成一个2×2 cell 数组

e =

  2×2 cell 数组

    {3×3 double}    {'i hate matlab!'}
    {'fff'     }    {0×0 double      }

>> celldisp(e) % 把每个cell数组disp出来
 
e{1,1} =
 
     8     1     6
     3     5     7
     4     9     2

 
 
e{2,1} =
 
fff
 
 
e{1,2} =
 
i hate matlab!
 
 
e{2,2} =
 
     []

7.多维数组---Multidimensional Array

示例: 

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

 结果:

>> A

  2×2×2 cell 数组

A(:,:,1) = 

    {2×2 double}    {'Name'    }
    {[       7]}    {0×0 double}


A(:,:,2) = 

    {'Name2'  }    {[       3]}
    {[0 1 2 3]}    {2×1 double}

8.cat()串联数组

示例:

>> A=[1 2;3 4];
>> B=[5 6;7 8];

结果1:

>> C=cat(1,A,B)

C =

     1     2
     3     4
     5     6
     7     8

结果2:

>> C=cat(2,A,B) 

C =

     1     2     5     6
     3     4     7     8

结果3:

>> C=cat(3,A,B)

C(:,:,1) =

     1     2
     3     4


C(:,:,2) =

     5     6
     7     8

三种结果的平面展示:

 基于上述构造一个3位的数组:

示例:
 

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

结果:

>> A

A =

  2×2 cell 数组

    {2×2 double        }    {'Name'}
    {[2.0000 - 4.0000i]}    {[   7]}

>> C = cat(3, A, B)

  2×2×2 cell 数组

C(:,:,1) = 

    {2×2 double        }    {'Name'}
    {[2.0000 - 4.0000i]}    {[   7]}


C(:,:,2) = 

    {'Name2'  }    {[       3]}
    {[0 1 2 3]}    {2×1 double}

三维展示: 

9.reshape()---重构数组

示例:

>> A = {'James Bond', [1 2;3 4;5 6]; pi, magic(5)} % 2×2 cell 数组

A =

  2×2 cell 数组

    {'James Bond'}    {3×2 double}
    {[    3.1416]}    {5×5 double}

>> C = reshape(A,1,4) % 变成1×4 cell 数组 必须要是能变成的,

C =

  1×4 cell 数组

    {'James Bond'}    {[3.1416]}    {3×2 double}    {5×5 double}

>> C = reshape(A,4,1) % 变成4×1 cell 数组

C =

  4×1 cell 数组

    {'James Bond'}
    {[    3.1416]}
    {3×2 double  }
    {5×5 double  }

练习:

示例:

>> A = [1:3; 4:6]; % 2×3
>> A

A =

     1     2     3
     4     5     6

>> B = reshape(A, 3, 2) % 3×2

B =

     1     5
     4     3
     2     6

>> B = reshape(A, 1, 6) % 通过纯行或者列重构的话会发现是按照列优先

B =

     1     4     2     5     3     6

>> B = reshape(A, 6, 1)

B =

     1
     4
     2
     5
     3
     6

 变量检查相关函数:

10.文件访问---save()、load()、xlsread()、xlswrite()

10.1save()

>> clear; a = magic(4); 
>> save mydata1.mat % 找到文件打开会发现乱码
>> save mydata2.mat -ascii % 以-ascii保存
>> type('mydata1.mat') % 或者直接在命令行中查看,不用找路径那里的文件
>> type('mydata2.mat') % 同理

 在窗口中找到自己的文件储存位置

结果:

10.2load()

>> clear % 先把之前的进行清除 方便查看load()
>> load('mydata1.mat')
>> load('mydata2.mat', '-ascii')

 结果:此时工作区会重新加载a和madata2

 

 练习:怎么储存一个特定的变量?

示例:

>> p = rand(1,10);
>> q = ones(10);
>> save('pqfile.mat','p','q'); % 将特定的p、q储存
>> save('pqfile.txt','p','q','-ascii');

 结果:

>> type('pqfile.txt')

   8.1472369e-01   9.0579194e-01   1.2698682e-01   9.1337586e-01   6.3235925e-01   9.7540405e-02   2.7849822e-01   5.4688152e-01   9.5750684e-01   9.6488854e-01
   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00
   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00
   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00
   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00
   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00
   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00
   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00
   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00
   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00
   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00   1.0000000e+00
>> type('pqfile.mat')

MATLAB 5.0 MAT-file, Platform: PCWIN64, Created on: Wed Nov  2 20:14:39 2022                                        

10.3xlsread()

首先将信息填写完整存到当前目录下:

 示例:

>> clear
>> score = xlsread('demo01.xlsx') % 不会显示名字和test的

score =

    94    83    89
    76    88    82
    68    72    75

>> score = xlsread('demo01.xlsx', 'B2:D4') % B2:D4就是这三位学生的成绩,和上面显示的是一样

score =

    94    83    89
    76    88    82
    68    72    75

10.4xlswrite()

如何求这三位学上的平均成绩?并把平均成绩写入demo.xlsx中?

示例:

>> mean(score) % mean是按照列进行计算的,而学生的成绩是一行,所以需要转置

ans =

   79.3333   81.0000   82.0000

>> mean(score') % 对score进行转置之后就是每个学生的平均成绩注意这里是把平均成绩按行展示

ans =

   88.6667   82.0000   71.6667

>> mean(score')' % 再接着对求出来的平均数进行转置变成列

ans =

   88.6667
   82.0000
   71.6667

>> M = mean(score')' % 将平均成绩赋值给变量M

M =

   88.6667
   82.0000
   71.6667

>> xlswrite('demo01.xlsx', M, 1, 'E2:E4') % 将mena写入对应位置,'demo01.xlsx':要储存的文件名字、M:要储存进demo.xlsx文件中的变量、1是excle中的sheet1,'E2:E4':对应的位置

结果:

 接下来将mean放在这些数据的顶部E1

示例:

>> xlswrite('demo01.xlsx', {'mean'}, 1, 'E1') % 注意,执行的时候需要先把excle关掉否则报错

结果:

 练习:算出标准差存放进demo01.xlsx中

示例:

>> S = std(score')' % 计算标准差 std:创建一个矩阵,并计算每一列的标准差。

S =

    5.5076
    6.0000
    3.5119

>> xlswrite('demo01.xlsx', S, 1, 'F2:F4'); % 将标准差存进demo01.xlsx中
>> xlswrite('demo01.xlsx', {'std'}, 1, 'F1') % 将标准差名字std存进demo01.xlsx中

结果:

10.5同时读取文本和数字

示例:

>> xlswrite('demo02.xlsx', header, 1) % 先在工作空间新建demo02.xlsx文件,之后写入

结果:

 示例:

 

>> xlswrite('demo02.xlsx', score, 1, 'B2:f4') % 将score写入相应的位置

结果:

11.I/O功能

11.1fprintf()写

 示例:

 

x = 0:pi/10:pi; 
y = sin(x); 
fid = fopen('demo01.txt','w'); % 写权限
for i=1:11
    fprintf(fid,'%5.3f %8.4f\n', x(i), y(i)); % 将x和y写进demo02.txt中, 5.3f表示的是整个字段是5位包括小数点后3位 8.4f同理
end
fclose(fid); 
type('demo01,txt') % 打开txt文件

结果:

11.2fscanf()读

示例:

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

结果:

>> type demo02.txt

John 1995 12 5 12.3 3.24
Tom 1995 12 7 2.3 2.0
Jean 1996 3 2 10.2 0

>> whos % 相应的变量会在工作区
  Name      Size            Bytes  Class     Attributes

  ans       1x1                 8  double              
  fid       1x1                 8  double              
  i         1x1                 8  double              
  name      3x5                30  char                
  no1       1x3                24  double              
  no2       1x3                24  double              
  no3       1x3                24  double              
  no4       1x3                24  double              
  year      1x3                24  double   

 


OVER

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到