MATLAB學習筆記三:Variables:string structure cell,Data access

1. MATLAB 數據(變量)


1.1 類型

Types

1.2 變量(數據)類型的轉換

% 函數列表:
double( )
single( )
int8( ) int16( ) int32( ) int64( )
uint8( ) uint16( ) uint32( ) uint64( )

EX:

>> A=20
A =
    20
>> B=int8(A)
B =
    20
>> whos
  Name      Size            Bytes  Class     Attributes

  A         1x1                 8  double              
  B         1x1                 1  int8                
  ans       1x3                24  double              

1.3 字符或字符串 < char or string>

1.3.1 字符

  • 字符在 ASCII 中用 0 到 255 之間的數字代碼表示
>> s1 = 'h'
whos
uint16(s1)

s1 =
h
  Name      Size            Bytes  Class    Attributes
  s1        1x1                 2  char               
ans =
    104
  • ASCII對照表:
        ASCII表一
        ASCII表二

1.3.2 字符串

>> s1 = 'Example';
s2 = 'String';
>> s3 = [s1 s2]

s3 =
ExampleString
>> s4 = [s1; s2]

錯誤使用 vertcat       % 此處s1與s2字母數量不一致,故報錯
串聯的矩陣的維度不一致。
  • 邏輯運算和賦值
>> str = 'aardvark';
'a' == str

ans =
     1     1     0     0     0     1     0     0
>> str(str == 'a') = 'Z'

str =
ZZrdvZrk

1.3.3 練習

  • 編寫一個反轉任何給定字符串的腳本
                      s1 = ‘I like the letter E’
    \Downarrow
                      s2 = ‘E rettel eht ekil I’

  • 參考本篇博文

1.4 Structure

  • 一種存儲異構數據的方法;
  • 結構包含稱爲字段的數組;

1.4.1 EX:

學生成績

>> student.name = 'John Doe';
student.id = '[email protected]';
student.number = 301073268;
student.grade = [100, 75, 73; ...
                95, 91, 85.5; ...
                100, 98, 72];
student

student = 

      name: 'John Doe'
        id: '[email protected]'
    number: 301073268
     grade: [3x3 double]
  • 向結構添加信息
student(2).name = 'Ann Lane';
student(2).id = '[email protected]';
student(2).number = 301078853;
student(2).grade = [95 100 90; 95 82 97; 100 85 100];

1.4.2 結構函數

函數名 功能
cell2struct
fieldnames
getfield
isfield
isstruct
orderfields
rmfield
setfield
struct
struct2cell
structfun

1.4.3 嵌套結構

嵌套結構

>> 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 = 
    testnum: 'Test 1'
      xdata: [4 2 8]
      ydata: [7 1 6]

ans = 
    testnum: 'Test 2'
      xdata: [3 4 2]
      ydata: [5 0 9]

1.5 元胞數組 Cell Array

1.5.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 = 
          [3x3 double]    'Anne Smith'
    [3.0000 + 7.0000i]    [1x3 double]

或者:

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;

1.5.2 訪問元胞數組

  • 大括號{}用於訪問元胞數組的“內容”
>> A{1,1}

ans =
     1     4     3
     0     5     8
     7     2     9
>> A{1,1}(1,1)

ans =
     1
>>A{1,1}(2,2)

ans =
     5

1.5.3 元胞數組函數

函數 功能
cell
cell2mat
cell2struct
celldisp
cellfun
cellplot
cellstr
iscell
mat2cell
num2cell
struct2cell
EX:num2cell() and mat2cell()
>> a = magic(3)
b = num2cell(a)
c = mat2cell(a, [1 1 1], 3)
a =
     8     1     6
     3     5     7
     4     9     2
b = 
    [8]    [1]    [6]
    [3]    [5]    [7]
    [4]    [9]    [2]
c = 
    [1x3 double]
    [1x3 double]
    [1x3 double]

1.6 多維數組 Multi-dimensional Array

多維數組

1.6.1 方法一:

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

1.6.2 方法二: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)

1.6.3 reshape()

>> A = {'James Bond', [1 2;3 4;5 6]; pi, magic(5)}
C = reshape(A,1,4)

A = 
    'James Bond'    [3x2 double]
    [    3.1416]    [5x5 double]
C = 
    'James Bond'    [3.1416]    [3x2 double]    [5x5 double]

1.7 檢查變量和變量狀態

函數 功能
isinteger
islogical
isnan
isnumeric
isprime
isreal
iscell
ischar
isempty
isequal
isfloat
isglobal
isinf

2. 數據存取 Data Access


2.1 文件存取

2.1.1 save() 和 load()

  • 保存workspace中所有的數據到.mat文件中;
clear; a = magic(4);
save mydata1.mat
save mydata2.mat -ascii  % 使mydata1.mat文件在其他程序中打開不亂碼;
  • 加載存儲在文件中的數據;
load('mydata1.mat')
load('mydata2.mat','-ascii')

2.1.2 讀取Excel文件:xlsread()

score = xlsread('04score.xlsx')
score = xlsread('04score.xlsx', 'B2:D4')  % 讀取註明單元格的內容;

2.1.3 寫入Excel文件:xlswrite()

M = mean(score')';  % mean()函數是column 運算,而score中每個學生的成績是row,故先轉置 ' ,求得平均數,在轉置回來;
xlswrite('04score.xlsx', M, 1, 'E2:E4');  % xlswrite('filename', 'variable', 'sheet(頁)', 'location');
xlswrite('04score.xlsx', {'Mean'}, 1, 'E1');  % 寫進表頭{'Mean'};
  • 求標準差
std(A,a)  % a=0時爲無偏估計,分母爲n-1;a=1時爲有偏估計,分母爲n。默認形式:std(A,0,1);
 
std(A,a,b)  % 增加的形參b是維數,若A是二維矩陣,則b=1表示按列分,b=2表示按行分;若爲三維以上,b=i就是增多的一維維數;
>> N = std(Score, 1, 2)

N =

    0.8165
    0.8165
    0.8165

>> N = std(Score, 1, 1)

N =

    2.6247    2.4495    2.6247

% 將N及表頭寫入Excel表格中;
>> xlswrite('04score.xlsx', N, 1, 'F2:F4');
>> xlswrite('04score.xlsx', {'std'}, 1, 'F1');

2.1.4 在Excel中獲得文本

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

Score =

    1.0000    2.0000    3.0000    2.0000    0.8165
    6.0000    5.0000    4.0000    5.0000    0.8165
    7.0000    8.0000    9.0000    8.0000    0.8165


Header = 

    ''       'text1'    'text2'    'text3'    'Mean'    'std'
    'a'      ''         ''         ''         ''        ''   
    'ab'     ''         ''         ''         ''        ''   
    'abc'    ''         ''         ''         ''        ''   

2.2 低階文件輸入/輸出

  • 以字節或字符級別讀寫文件;
  • 具有fid
  • 文件中的位置由可以移動的指針pointer指定;

2.2.1 功能函數

函數 功能
fopen
fclose
fscanf 讀數據
fprintf 寫數據
feof
fid = fopen('[filename]', '[permission]');
status = fclose(fid);
  • permission包括'r' 'r+' 'w' 'w+' 'a' 'a+'

2.2.2 舉例:將正弦值寫入文件

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

2.2.3 通過格式化I/O進行讀寫

  • Read:A = fscanf(fid, format, size);
  • Write:fprintf(fid, format, x, y, ...);
  • A:讀取的數據;format:格式說明符;size:讀取的數據量;x, y, ...:寫入的數據;
  • 格式說明符:%-12.5e-12.5表示寬度和精度;
說明符 描述
%c
%d
%e
%f
%g
%o
%s
%u
%x

2.2.4 從文件中讀取

  • 檢查是否是文件的結尾:feof(fid)
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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章