官术网_书友最值得收藏!

1.7 MATLAB的文件I/O

在MATLAB中,提供了許多有關文件的輸入和輸出函數,它們具有直接對磁盤文件進行訪問的功能,使用這些函數可以很方便地實現各種格式的讀取工作,不僅可以進行高層次的程序設計,也可以對低層次的文件進行讀寫操作,這樣就增加了MATLAB程序設計的靈活性和兼容性。

1.7.1 處理二進制文件

對于MATLAB而言,二進制文件是相對比較容易處理的。和后面介紹的文本文件相比較,二進制文件是比較容易和MATLAB進行交互的。

對于和MATLAB同等層次的文件,可以使用load、save等命令對該文件進行操作,具體的操作方法前面已經介紹過。這里主要介紹在MATLAB中讀取低層次數據文件的方法,這些函數可以對多種類型的數據文件進行操作,常用的函數如表1-11所示。

表1-11 二進制文件I/O函數

1.文件的打開和關閉

在對文件進行處理的所有工作當中,打開文件或者關閉文件都是十分基礎的工作。

MATLAB利用函數fopen()打開或獲取低層次文件的信息,該函數的調用格式為

[fid,message] =fopen(′filename′,′mode′)

其中,filename表示打開的文件名;mode表示打開文件的方式,其中“r”表示以只讀方式打開,“w”表示以只寫方式打開,并覆蓋原來的內容,“a”表示以增補方式打開,在文件的尾部增加數據,“r+”表示讀寫方式打開,“w+”表示創建一個新文件或刪除已有的文件內容,并進行讀寫操作,“a+”表示以讀取和增補方式打開;message為打開文件的信息;fid為文件句柄(或文件標識),如果該文件存在,則返回的文件句柄fid的值為非-1,以后就可以對該句柄指向的文件進行直接操作了,如果該文件不存在,則返回的句柄值為-1,但不會中斷運行。

在默認的情況下,函數fopen()會選擇使用二進制的方式打開文件,在該方式下,字符串不會被特殊處理。如果用戶需要用文本形式打開文件,則需要在上面的mode字符串后面填加“t”,例如,“rt”、“rt+”等。

在打開文件后,如果完成了對應的讀寫操作,應該利用fclose()函數來關閉該文件,否則打開過多的文件,將會造成系統資源的浪費。該函數的調用格式為

status=fclose(fid)

其中,fid為使用fopen()函數得到的文件句柄(或文件標識);status為使用fclose()函數得到的結果,如status=0表示關閉文件的操作成功,否則得到的結果為status=-1。

例如用戶想新建一個名為myfile.txt的文件,對其進行讀寫操作,則可以利用以下MAT-LAB命令

      >>[myfid,message] =fopen(′myfile.txt′,′w′)

結果顯示:

      myfid=
            3
      message=
              ′′

完成了對該文件的讀取操作后,用戶可以調用fclose(myfid)命令來關閉該文件。

2.讀取M文件

常見的二進制文件包括.m、.dat等文件,在MATLAB中可以使用fread()函數來讀取對應的文件,該函數的調用格式為

[A,count] =fread(fid,size,′precision′)

其中,fid為打開文件的句柄;size表示讀取二進制文件的大小,其中當size為n時表示讀取文件前面的n個整數并寫入到向量中,size為inf時表示讀取文件直到結尾,size為[m,n]時表示讀取數據到m ×n矩陣中(按照列排列,僅n可以為inf)”;precision用來控制二進制數據轉換成為MATLAB矩陣時的精度,如可取precision為uchar、schar、int8、int16、int32、int64、uint8、uint16、uint32、uint64、single、float32、double或float64;A為存放數據的向量或矩陣;count表示A中存放數據的數目。

例1-36】 利用函數fread()讀取M文件的內容。

首先利用MATLAB的M文件編輯器編寫具有以下內容的M文件,并將其以ex1_36.m保存。

            a=3;b=6;c=a*b

然后利用以下MATLAB命令讀取該文件

      >>fidex1_36=fopen(′ex1_36.m′,′r+′);A=fread(fidex1_36)

結果顯示:

      A=
        97
        61
        …
        13
        10

從上面的結果可以看出,盡管打開的文件中是程序代碼,但是使用fread()讀取該文件后,得到的卻是數值數組。

利用以下命令可以得到該文件的程序代碼

      >>disp(char(A′));

結果顯示:

      a=3;b=6;c=a*b

從結果的角度來看,上面的命令代碼和“type ex1_36.m”是相同的,相當于將該文件中的所有代碼都顯示出來。

3.讀取TXT文件

TXT文件也是比較常見的二進制文件,以下通過一個簡單的例子來介紹如何在MATLAB中讀取TXT文件。

例1-37】 在MATLAB中讀取ex1_37.txt文件的內容。

首先將以上M文件ex1_36.m更名為ex1_37.txt,然后利用以下MATLAB命令

      >>fidex1_37=fopen(′ex1_37.txt′,′r′);A=fread(fidex1_37,′*char′);sprintf(A)

結果顯示:

      ans=
          a=3;b=6;c=a*b

或利用命令

      >>fidex1_37=fopen(′ex1_37.txt′,′r′);A1=fread(fidex1_37,9,′*char′);
      >>A2=fread(fidex1_37,5,′*char′);A3=fread(fidex1_37,4,′*char′);
      >>A4=fread(fidex1_37,6,′*char′);sprintf(′%c′,A1,A2,′+′,A3,′+′,A4)

結果顯示:

      ans=
          a=3;b=6;c=a*b

4.寫入二進制文件

在MATLAB中,如果用戶希望按照指定的二進制文件格式,將矩陣的元素寫入文件中,可以使用函數fwrite()來完成。該函數的調用格式為

fwrite(fid,A,′precision′)

其中,fid為打開文件的句柄;A表示寫入數據的向量或矩陣;precision用來控制二進制數據轉換成為MATLAB矩陣時的精度。

例1-38】 在MATLAB中使用函數fwrite()來寫入二進制文件。

MATLAB命令為

      >>fidex1_38=fopen(′ex1_38.txt′,′w′);A=[1 2 3;4 5 6]
      >>fwrite(fidex1_38,A,′int32′);fclose(fidex1_38);
      >>fidex1_38=fopen(′ex1_38.txt′,′r′);B=fread(fidex1_38,[2,3],′int32′),fclose(fidex1_38);

結果顯示:

      A=
        1    2    3
        4    5    6
      B=
        1    2    3
        4    5    6

1.7.2 處理文本文件

MATLAB的數據I/O操作支持多種數據格式,包括:文本數據、圖形數據、音頻和視頻數據、電子表格數據和科學數據。針對不同數據類型的數據文件,提供了多種處理函數,分別用于處理各種格式的數據文件。其中文本文件的讀取函數如表1-12所示。文本文件中數據是按照ASCII碼存儲的字符或數字,它們可以顯示在任何文本編輯器中。

表1-12 文本文件I/O函數

1.讀取文本文件

在MATLAB中,提供了多個函數來讀取文本文件中的數據,其中比較常見的函數有csvread()、csvread()和csvread(),這些函數有各自的使用范圍和特點。它們的調用格式分別為

                          A=csvread(′filename′,row,col)
                          A=dlmread(′filename′,delimiter)
                          A =textread(′filename′,′format′,N)

其中,filename為打開的文本文件名;row和col分別為需要讀取的數據行和列;delimiter為用戶自定義的分隔符;fp為打開文件的句柄;format表示讀取文件的變量格式;N表示讀取數據的循環次數;A表示存放數據的向量或矩陣。

2.寫入文本文件

利用函數csvwrite()、csvwrite()和csvread()可將數據寫入文本文件,它們的調用格式分別為

csvwrite(′filename′,A,row,col)

dlmwrite(′filename′,A,′-append′,delimiter)

其中,filename為數據寫入的文本文件名;A表示寫入數據存放的向量或矩陣;row和col分別表示在原始數據基礎上添加的數據行和列數;delimiter為用戶自定義的分隔符;fp為打開文件的句柄;format表示讀取文件的變量格式;N表示讀取數據的循環次數。

例1-39】 在MATLAB中使用函數csvwrite()或dlmwrite()來寫入文本文件。

MATLAB命令為

      >>A=[1 2 3;4 5 6];csvwrite(′ex1_39.dat′,A);type ex1_39.dat
      >>B=csvread(′ex1_39.dat′),C=dlmread(′ex1_39.dat′)

      >>A=[1 2 3;4 5 6];dlmwrite(′ex1_39.txt′,A);type ex1_39.txt;
      >>B=csvread(′ex1_39.txt′,0,0),C=dlmread(′ex1_39.txt′)

結果顯示:

      1,2,3
      4,5,6
      B=
        1    2    3
        4    5    6
      C=
        1    2    3
        4    5    6
主站蜘蛛池模板: 体育| 闸北区| 旬邑县| 聂荣县| 二连浩特市| 四川省| 洛浦县| 宁都县| 阿克陶县| 如皋市| 壶关县| 蒲城县| 中西区| 铜鼓县| 习水县| 象山县| 灵台县| 和硕县| 红桥区| 吉隆县| 安塞县| 会宁县| 铜陵市| 兴山县| 丰都县| 策勒县| 雷州市| 台安县| 涟水县| 永兴县| 五河县| 绥中县| 望江县| 西乌珠穆沁旗| 南溪县| 正宁县| 达孜县| 图木舒克市| 迁安市| 靖州| 衡水市|