日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

matlab的各種數(shù)據(jù)讀?。╰xt,dat,mat等格式),文件打開關(guān)閉

 LSS133LSS 2014-04-24

MATLAB提供了多種方式從磁盤讀入文件或?qū)?shù)據(jù)輸入到工作空間,即讀取數(shù)據(jù),又叫導入數(shù)據(jù);將工作空間的變量存儲到磁盤文件中稱為存寫數(shù)據(jù),又叫導出數(shù)據(jù)。至于選擇哪種機制,則根據(jù)下面兩個因素決定:

● 用戶所執(zhí)行的操作是導入數(shù)據(jù)還是導出數(shù)據(jù);

● 數(shù)據(jù)的格式為文本格式、二進制格式還是如HDF之類的標準格式。

將數(shù)據(jù)導入MATLAB中最容易的方法就是使用導入數(shù)據(jù)模板(Import Wizard),使用該模板時不需要知道數(shù)據(jù)的格式,只需指定包含這些數(shù)據(jù)的文件,然后導入模板會自動處理文件內(nèi)容。

本章重點內(nèi)容如下:

● 文件的打開和關(guān)閉

● 文本文件的讀取

● 存寫ASCII數(shù)據(jù)

● 二進制數(shù)據(jù)的讀取

● 二進制數(shù)據(jù)的存寫

● 使用I/O文件函數(shù)進行數(shù)據(jù)讀寫

● MAT 文件的讀寫


2.1  文件的打開和關(guān)閉

2.1.1  文件的打開

無論是要讀寫ASCII碼文件還是二進制文件,都必須先用fopen函數(shù)將其打開,在默認情況下,fopen以二進制格式打開文件,它的使用語法如下:

   fopen ('filename', 'mode')

其中filename表示要讀寫的文件名稱,mode則表示要對文件進行的處理方式,可以是表2-1中的任一字符串。

表2-1  文本文件打開的模式

mode

意    義

rt

以只讀方式(Reading)打開文件

wt

以只寫方式(Writing)打開文件

at

以追加方式(Appending)打開文件,新內(nèi)容將從原文件后面續(xù)寫

r+t

以同時讀寫方式打開文件

w+t

以同時讀寫創(chuàng)建文件,原文件內(nèi)容被清除

a+t

以同時讀和追加(Reading and Appdending)方式,原文件內(nèi)容被保留,新內(nèi)容將從原文件的后面開始

At

以讀寫方式打開或創(chuàng)建文件,適用于對磁帶介質(zhì)文件的操作

Wt

以寫入方式打開或創(chuàng)建文件,原文件內(nèi)容被清除,適用于磁帶介質(zhì)文件的操作


fopen函數(shù)有兩個返回值,一個是返回一個文件標志(file Identifier),它會作為參數(shù)被傳入其他對文件進行讀寫操作的命令,通常是一個非負的整數(shù),可用此標識來對此文件進行各種處理。如果返回的文件標識是–1,則代表fopen無法打開文件,其原因可能是文件不存在,或是用戶無法打開此文件權(quán)限。另一個返回值就是message,用于返回無法打開文件的原因。為了安全起見,最好在每次使用fopen函數(shù)時,都測試其返回值是否為有效值。

下面以腳本m文件為例來聲明文件的打開。

例2-1  %exam1.m

[f,message]=fopen('fileexam1', 'r')

if f==-1

disp (message);   %顯示錯誤信息

end

若文件fileexam1不存在,則顯示如下信息。

Cannot open file.existence?permissions?memory?...


例2-2  %exam2.m

[f,message]=fopen('fileexam2', 'r');

if f==-1

disp (message);    %顯示錯誤信息

 else

   disp(f);

end

若文件fileexam2存在,則返回f值。

2.1.2  文件的關(guān)閉

一旦完成文件的讀寫,最好關(guān)閉文件,以便對其進行其他操作。這時就可以使用fclose函數(shù)來關(guān)閉文件,其適用語法如下。

fclose(f)

其中f為打開文件的標志,若fclose函數(shù)返回值為0,則表示成功關(guān)閉f標志的文件;若返回值為–1,則表示無法成功關(guān)閉該文件。一般來說,在完成對文件的讀寫操作后就應(yīng)關(guān)閉它,以免造成系統(tǒng)資源浪費。此外,需注意的是,打開和關(guān)閉文件都比較耗時,因此為了提高程序執(zhí)行效率,最好不要在循環(huán)體內(nèi)使用文件。

若要一次關(guān)閉打開的所有文件,可以使用下面的命令:

fclose all

2.2  文 本 數(shù) 據(jù)

雖然MATLAB自帶的MAT文件為二進制文件,但為了便于和外部程序進行交換以及方便查看文件中的數(shù)據(jù),也常常采用文本數(shù)據(jù)格式與外界進行數(shù)據(jù)交換。在文本格式中,數(shù)據(jù)采用ASCII碼格式,可以表示字母和數(shù)字字符。ASCII文本數(shù)據(jù)可以在文本編輯器中查看和編輯。MATLAB提供多種函數(shù)能夠進行文件讀寫,這些函數(shù)都是MATLAB的一部分,不需要額外的工具箱支持。

2.2.1  從文本文件中讀取數(shù)據(jù)

1.使用導入模板來讀取數(shù)據(jù)

使用導入模板來讀取數(shù)據(jù),需按以下步驟進行:

(1) 選擇File→Import Data選項,然后彈出一個文件選擇對話框;也可以使用uiimport函數(shù)來打開導入數(shù)據(jù)模板。

(2) 在文件選擇對話框中選擇想導入數(shù)據(jù)的文本文件,然后單擊Open按鈕,導入數(shù)據(jù)模板就會打開該文件并準備處理其內(nèi)容。

(3) 指定用于分開單個數(shù)據(jù)的字符,該字符稱為分隔符或列分隔符。在多數(shù)情況下可以用導入模板來設(shè)定分隔符。

(4) 選擇要導入的變量。在默認情況下,導入模板將所有的數(shù)值數(shù)據(jù)放在一個變量中,而將文本數(shù)據(jù)放在其他變量中。

(5) 單擊Finish按鈕完成數(shù)據(jù)的導入。

當使用導入模板來打開一個文本文件時,在導入模板對話框的預(yù)覽區(qū)僅顯示原始數(shù)據(jù)的一部分,通過它,用戶可以驗證該文件中的數(shù)據(jù)是否為所期望的。導入模板也根據(jù)文件中的數(shù)據(jù)分隔符來對導入的數(shù)據(jù)進行預(yù)處理。在導入模板中打開工作區(qū)中的grade.txt文件。

   english  math  physic

joe        80    90      60

susan        78    98      88

rob        67    90      89


圖2-1  將數(shù)據(jù)通過模板導入

在圖2-1中,導入模板已辨認space字符,把它作為文件中數(shù)據(jù)的分隔符,并建立了兩個變量:data(包含文件中所有數(shù)值數(shù)據(jù))和textdata(包含文件中所有文本數(shù)據(jù))。

當導入模板正確導入文件中的數(shù)據(jù)后,就會顯示它所建立的變量。要選擇一個變量來導入數(shù)據(jù),可單擊它名稱后面的復選框。在默認情況下,所有變量都會被選中。在導入對話框的右面顯示了導入模板建立的變量內(nèi)容。要查看其他變量,只需要單擊該名稱。在選擇好要導入的變量后,單擊Next按鈕,如圖2-2所示。


圖2-2  使用模板查看各變量數(shù)據(jù)

在默認情況下,導入模板將文件中所有的數(shù)值數(shù)據(jù)放在一個變量中;若文件包含文本數(shù)據(jù),則模板將它們放在另外一個變量中;若文件包含行或列,模板也將它們作為各自獨立的變量分別稱為行頭和列頭。

當所有導入模板創(chuàng)建好數(shù)據(jù)后,使用whos命令可以查看工作空間的變量。

>> whos


 Name              Size            Bytes      Class     Attributes


 data              3x3             72      double              

 textdata              4x1             314      cell  

2. 使用函數(shù)來讀取文本數(shù)據(jù)

若要在命令行或在一個 M 文件中讀取數(shù)據(jù),必須使用 MATLAB 數(shù)據(jù)函數(shù),函數(shù)的選擇則是依據(jù)文本文件中數(shù)據(jù)的格式。而且文本數(shù)據(jù)格式在行和列上必須采取一致的模式,并使用文本字符來分隔各個數(shù)據(jù)項,稱該字符為分隔符或列分隔符。分隔符可以是space、comma、semicolon、ab或其他字符,單個的數(shù)據(jù)可以是字母、數(shù)值字符或它們的混合形式。

文本文件也可以包含稱之為頭行的一行或多行文本,或可以使用文本頭來標志各列或各行。在了解要輸入數(shù)據(jù)的格式之后,便可以使用 MATLAB 函數(shù)來讀取數(shù)據(jù)了。若對 MATLAB 函數(shù)不熟悉,可從表2-2中了解幾個讀取函數(shù)的一些使用特征。

表2-2  讀取函數(shù)的比較

函    數(shù)

數(shù) 據(jù) 類 型

分  隔  符

返  回  值

csvread

數(shù)值數(shù)據(jù)

僅cooma

1

dlmread

數(shù)值數(shù)據(jù)

任何字符

1

fscanf

字母和數(shù)值

任何字符

1

load

數(shù)值數(shù)據(jù)

僅space

1

textread

字母和數(shù)值

任何字符

多返回值


3. 讀取數(shù)值文本數(shù)據(jù)

若用戶的數(shù)據(jù)文件只包含數(shù)值數(shù)據(jù),則可以使用許多MATLAB函數(shù),這取決于這些數(shù)據(jù)采用的分隔符。若數(shù)據(jù)為矩形形狀,也就是說,每行有同樣數(shù)目的元素,這時可以使用最簡單的命令load(load也能用于導入MAT文件,該文件為用于存儲工作空間變量的二進制文件,如果文件名后綴是.dat,則MATLAB會以MAT文件格式進行讀取)。

例如,文件my_data.txt包含了兩行數(shù)據(jù),各數(shù)據(jù)之間由space字符隔開。

當使用load時,它將讀取數(shù)據(jù)并在工作空間中建立一個與該文件同名的變量,但不包括擴展名。

>>load my_data.txt;

調(diào)用whos命令查看工作空間的變量。

>> whos


 Name              Size            Bytes          Class     Attributes


 data              3x3              72          double              

 my_data          3x4              96         double              

 textdata              4x1              314          cell  

此時可以查看與該文件同名的變量的值

>> my_data


my_data =


   0.3242    0.4324    0.3455    0.6754

   0.4566    0.9368    0.9892    0.9274

   0.4658    0.2832    0.9373    0.8233

若想將工作空間的變量以該文件名命名,則可以使用函數(shù)形式的load,下面的語句將文件導入工作空間并賦給變量A

A=load('my_data.txt');

4. 讀取有分隔符的ASCII數(shù)據(jù)文件

如果數(shù)據(jù)文件不使用空格符而是使用逗號或是其他符號作為分隔符,用戶可以選擇多個可用的導入數(shù)據(jù)函數(shù)。最簡單的便是使用函數(shù)dlmread。

舉個例子來說,一個名為lcode.dat的數(shù)據(jù)文件,數(shù)據(jù)內(nèi)容由逗號分隔。

0.3445,0.8433,0.7865

0.7562,0.4233,0

要把該文件的全部內(nèi)容讀入陣列A,只須輸入如下命令:

>> A=dlmread('lcode.dat',',')

即可以把數(shù)據(jù)文件中使用的分隔符作為函數(shù)dlmread的第二個參數(shù)。

注意:

即使每行的最后一個數(shù)據(jù)后面不是逗號,dlmread函數(shù)仍能正確讀取數(shù)據(jù),因為dlmread忽略了數(shù)據(jù)之間的空格符。因此,即使數(shù)據(jù)為如下格式,前面的dlmread命令仍能正常工作。

A =


   0.3445    0.8433    0.7865

   0.7562    0.4233         0

另外需要注意的是,分隔符只能選取單個字符,不能用字符串來作為分隔符。

5. 使用文本頭讀取數(shù)值數(shù)據(jù)

要讀取一個包含文本頭的ASCII碼數(shù)據(jù)文件,可以使用textread函數(shù),并指定頭行參數(shù)。調(diào)用函數(shù)textread 同樣非常簡單,同時對文件讀取的格式處理能力更強,函數(shù)接收一組預(yù)先定義好的參數(shù),由這些參數(shù)來控制變量的不同方面。Textread既能處理有固定格式的文件,也可以處理無格式的文件,還可以對文件中每行數(shù)據(jù)按列逐個讀取。

textread函數(shù)常見的調(diào)用方法有如下幾種:

[A,B,C...]=textread('filename', 'format')

[A,B,C...]=textread('filename', 'format',N)

例如文件my_data.txt包含了如下文件內(nèi)容,有一行文本頭,且格式化的數(shù)值數(shù)據(jù)。

num1    num2    num3    num4

0.3242  0.4324  0.3455  0.6754

0.4566  0.9368  0.9892  0.9274

0.4658  0.2832  0.9373  0.8233

因為有文件頭,要使用如下textread命令來讀取文件中的數(shù)據(jù)。

>> [num1 num2 num3 num4]=textread('my_data.txt','%f %f %f %f','headerlines',1)

執(zhí)行結(jié)果如下:

num1 =


   0.3242

   0.4566

   0.4658



num2 =


   0.4324

   0.9368

   0.2832



num3 =


   0.3455

   0.9892

   0.9373



num4 =


   0.6754

   0.9274

   0.8233

6. 讀取字母數(shù)值混合的數(shù)據(jù)

若數(shù)據(jù)文件中包含了字母和數(shù)值混合的ASCII碼數(shù)據(jù),也可以使用函數(shù)textread來讀取數(shù)據(jù)。由上一小節(jié)知道,函數(shù)textread可以返回多個輸出變量,實際上用戶還可以通過參數(shù)指定每個變量的數(shù)據(jù)類型。

例如要把文件my_exam.dat的全部內(nèi)容讀入工作空間,需要在textread行數(shù)的輸入?yún)?shù)中指定數(shù)據(jù)文件的名稱和格式。

文件my_exam.dat包含的混合的字母和數(shù)值如下:

Joe    gradeA  4.9  pass

susan  gradeD  2.0  fail

如果想把4列數(shù)據(jù)全部讀取出放在4個變量中,則使用如下命令:

>> [name  gra  grades  answer]=textread('my_exam.dat','%s %s %f %s')

在這里要注意命令中格式字符串的定義,對于格式字符串中定義的每種變換,必須指定一個單獨的輸出變量,textread 函數(shù)按格式字符串中指定的格式處理文件中的某個數(shù)據(jù)項,并把值放在輸出變量中。輸出變量的數(shù)目必須和格式字符串中指定的變換數(shù)目項匹配,在該例中,函數(shù)按格式字符串來讀取文件my_exam.dat的每一行,直到文件讀完,該命令的執(zhí)行結(jié)果是:

name =


   'Joe'

   'susan'



gra =


   'gradeA'

   'gradeD'


grades =


   4.9000

   2.0000



answer =


   'pass'

   'fail

另外,textread函數(shù)可以有選擇地讀取數(shù)據(jù),比如我們不需要取出中間幾列數(shù)據(jù),只取出第一列和最后一列數(shù)據(jù),則可以使用命令:

>> [name   answer]=textread('my_exam.dat','%s %*s %*f %s')


name =


   'Joe'

   'susan'


answer=


   'pass'

   'fail'

若文件采用的分隔符不是空格,則必須使用函數(shù)textread ,將該分隔符作為它的參數(shù)。例如,若文件my_exam.dat 使用分號作為分隔符,則讀入該文件需使用如下命令:

[name  gra  grades  ans]=textread('my_exam.dat','%s %s %f %s', 'delimiter', '; ')

2.2.2  存寫ASCII碼數(shù)據(jù)

本小節(jié)介紹如何使用MATLAB函數(shù)按幾種通用的ASCII碼格式來存寫數(shù)據(jù),即如何使用這些函數(shù)來把一個MATLAB數(shù)值矩陣寫入到一個文本文件中,其中該矩陣的列和行使用空格符來分隔。用戶采用什么函數(shù)取決于所要存寫數(shù)據(jù)的數(shù)據(jù)量和數(shù)據(jù)格式。

常用的兩種ASCII碼數(shù)據(jù)格式如下:

● 采用空格符分隔;

● 采用分號分隔。

MATLAB的存寫數(shù)據(jù)函數(shù)如表2-3所示。

表2-3  數(shù)據(jù)存寫函數(shù)

函 數(shù) 名 稱

適 用 數(shù) 據(jù)

分  隔  符

csvwrite

數(shù)值數(shù)據(jù)

逗號

diary

數(shù)值數(shù)據(jù)或單元陣列

空格

dlmwrite

數(shù)值數(shù)據(jù)

任何字符

fprintf

字母和數(shù)值數(shù)據(jù)

任何字符

save

數(shù)值數(shù)據(jù)

制表符或空格符


1. 存寫有分隔符的ASCII碼數(shù)據(jù)文件

若要將當前的MATLAB工作空間的一個或多個變量寫到一個有分隔符的ASCII碼文件中,可以使用save命令或dlmwrite函數(shù)。在默認情況下,save命令是以 MAT 格式存寫數(shù)據(jù)的,這部分內(nèi)容我們在后面詳細介紹,本小節(jié)主要介紹 save命令通過ASCII碼限定符以文本方式存寫數(shù)據(jù)。而dlmwrite函數(shù)則可以提供更大的靈活性,它允許用戶把任何字符指定為分隔符,也可以通過指定一個值域存寫一個陣列的子陣列。

>> clear all;

>> x=rand(2,3);

>> save my_test1.dat x -ascii;

該命令將變量x中的數(shù)據(jù)存寫到my_test1.dat文件中。通過文本編輯器,我們可以查看該文件的內(nèi)容:

 9.2181297e-001  1.7626614e-001  9.3546970e-001

 7.3820725e-001  4.0570621e-001  9.1690444e-001

我們也可以將命令中的文件名和變量名省略,那樣的話,命令的執(zhí)行結(jié)果則是把當前 MATLAB工作空間中的所有變量保存到matlab.mat文件中。需要指明的是這時的文件雖然后綴名為.mat,但文件內(nèi)容仍然是以文本方式保存的。

在默認情況下,save命令使用空格作為分隔符,但用戶可以通過指定-tabs限定符來使用制表符而不是空格符作為分隔符。當使用save命令把一個字符陣列寫入ASCII文件時,將ASCII碼寫入文件也就等于把字符寫入文件。

若要以ASCII碼形式存寫一個陣列,并指定文件使用的分隔符,需要使用dlmwrite函數(shù),比如重新指定分號作為分隔符,把變量x存到文件 my_test2.dat 文件中,查看其結(jié)果:

0.92181;0.17627;0.93547

0.73821;0.40571;0.9169

在默認情況下,dlmwrite函數(shù)用逗號或空格作為分隔符,或者是指定空的引號,即無分隔符。

2. 使用diary命令來存寫數(shù)據(jù)

較小的數(shù)值陣列或單元陣列的存寫可以使用diary命令,例如,在工作空間中有一個陣列A: A=[1 2 3 4 5; 6 7 8 9 10]

在命令提示符下執(zhí)行如下命令:diary my_test3.dat,就可以創(chuàng)建my_test3.dat文件。接下來顯示要存寫的陣列A:

A =

    1     2     3     4     5

    6     7     8     9    10

然后執(zhí)行關(guān)閉diary命令:diary off。

這時,在文本編輯器中打開my_test3.dat文件,會發(fā)現(xiàn)diary命令創(chuàng)建的文件記錄了在MATLAB會話期間的所有命令??梢酝ㄟ^編輯,刪去無關(guān)的文本。

2.3  二進制數(shù)據(jù)

2.3.1  二進制數(shù)據(jù)的讀取

本小節(jié)將介紹怎樣將一般格式下的二進制數(shù)據(jù)文件讀取到工作空間中。讀取二進制數(shù)據(jù)常用的方法有兩種,一是使用導入模板來導入,二是使用二進制數(shù)據(jù)導入函數(shù)來讀取。

1. 使用導入模板讀取二進制數(shù)據(jù)

要使用導入模板來讀取二進制數(shù)據(jù),需按以下步驟進行:

(1) 選擇File→Import Data選項,彈出一個文件選擇對話框;也可以使用uiimport函數(shù)來打開導入數(shù)據(jù)模板。

(2) 在文件選擇對話框中選擇想導入數(shù)據(jù)的二進制數(shù)據(jù)文件,然后單擊Open按鈕,導入數(shù)據(jù)模板就會打開該文件并準備處理其內(nèi)容。

(3) 選擇要導入的變量。在默認情況下,導入模板將要建立的變量取決于文件中的數(shù)據(jù)類型。

(4) 單擊Finish按鈕完成數(shù)據(jù)的導入。

這個過程和使用導入模板讀取文本文件是基本一致的,這里就不再舉例了。

2. 使用導入函數(shù)讀取二進制數(shù)據(jù)

若要從命令行或一個 M 文件中讀取二進制數(shù)據(jù),就必須使用 MATLAB 導入函數(shù),函數(shù)的選擇取決于文件中數(shù)據(jù)的格式,這些函數(shù)如表2-4所示。

表2-4  導入二進制數(shù)據(jù)函數(shù)

函 數(shù) 名 稱

讀取文件的擴展名

數(shù) 據(jù) 格 式

load

.mat

讀取MATLAB下的MAT數(shù)據(jù)格式的數(shù)據(jù)

aviread

.avi

讀取AVI格式的音頻視頻數(shù)據(jù)

cdfread

.cdf

讀取CDF格式的數(shù)據(jù)

hdf

.hdf

讀取HDF格式的數(shù)據(jù)

imread

.bmp  .cur  .gif  .hdf  .ico

.jpg  .pbm  .pgm  .png  .pnm  

.ppm  .pcx  .tif  .xwd  .ras

讀取各種格式的圖形數(shù)據(jù)

wavread

.wav

讀取 Windows 系統(tǒng)的聲音文件

xlsread

.xls

讀取 Excel 電子表格數(shù)據(jù)

2.3.2  二進制數(shù)據(jù)的存寫

要以一種標準二進制格式來存寫二進制數(shù)據(jù),可以使用 MATLAB 提供的高端函數(shù),函數(shù)的選擇取決于要存寫數(shù)據(jù)的類型,這些函數(shù)如表2-5所示。

表2-5  導出二進制數(shù)據(jù)函數(shù)

函 數(shù) 名 稱

讀取文件的擴展名

數(shù) 據(jù) 格 式

save

.mat

存寫MATLAB下的MAT數(shù)據(jù)格式的數(shù)據(jù)

avifile

.avi

存寫AVI格式的音頻視頻數(shù)據(jù)

cdfwrite

.cdf

存寫CDF格式的數(shù)據(jù)

hdf

.hdf

存寫HDF格式的數(shù)據(jù)

imwrite

.bmp  .cur  .gif  .hdf  .ico

.jpg  .pbm  .pgm  .png  .pnm  

.ppm  .pcx  .tif  .xwd  .ras

存寫各種格式的圖形數(shù)據(jù)

wavwrite

.wav

存寫 Windows 系統(tǒng)的聲音文件

xlswrite

.xls

存寫 Excel 電子表格數(shù)據(jù)


在MATLAB中可以將一系列的圖像保存為電影,這樣使用電影播放函數(shù)就可以進行回放,保存方法可以同保存其他MATLAB工作空間變量一樣,通過采用MAT文件格式保存。但是若要瀏覽該電影,必須在MATLAB環(huán)境下。在以某種格式存寫一系列的MATLAB圖像時,不需要在MATLBA 環(huán)境下進行預(yù)覽,通常采用的格式為AVI格式。AVI是一種文件格式,在PC 機上的Windows系統(tǒng)或UNIX操作系統(tǒng)下可以進行動畫或視頻的播放。

若要以AVI格式來存寫MATLAB圖像,步驟如下:

(1) 用avifile函數(shù)建立一個AVI文件。

(2) 用addframe函數(shù)來捕捉圖像并保存到AVI 文件中。

(3) 使用close函數(shù)關(guān)閉AVI文件。

注意:

若要將一個已經(jīng)存在的MATLAB電影文件轉(zhuǎn)換為AVI文件,需使用函數(shù)movie2avi。函數(shù)原型為:

movie2avi(mov,filename)

movie2avi(mov,filename,param,value,param,value...)

2.4  使用文件I/O函數(shù)

前面介紹的都是MATLAB中的一些高級函數(shù),除此之外MATLAB還包含了一組低端的文件I/O函數(shù),如前面介紹的所有文件的打開和關(guān)閉函數(shù):fopen函數(shù)和fclose函數(shù)。這些函數(shù)是建立在ANSI標準C庫中的I/O函數(shù)。若用戶對C語言熟悉的話,那么也肯定熟悉這些函數(shù)。比如,MATLAB 文件I/O函數(shù)使用和C語言同樣的編程模式等。要讀寫這些數(shù)據(jù),需進行以下幾步:

(1) 使用fopen函數(shù)打開文件。fopen函數(shù)將會返回一個文件標志,通過它,就可以使用其他所有的低端文件I/O函數(shù)。

(2) 對文件進行操作,如:讀寫二進制數(shù)據(jù)、格式化讀寫文本數(shù)據(jù)等。

(3) 使用fclose函數(shù)來關(guān)閉文件。

2.4.1  二進制數(shù)據(jù)的讀取

使用fread函數(shù)可從文件中讀取二進制數(shù)據(jù),它將每個字節(jié)看成整數(shù),并將結(jié)果以矩陣形式返回。對于讀取二進制文件,fread必須制定正確的數(shù)據(jù)精度。

fread的基本調(diào)用方法是:

A=fread(fid)

其中fid是一個整數(shù)型變量,是通過調(diào)用fopen函數(shù)獲得的,表示要讀取的文件標識符,輸出變量A為矩陣,用于保存從文件中讀取的數(shù)據(jù)。

例如文件test.txt的內(nèi)容如下:

test it

用fread函數(shù)讀取該文件,輸入如下命令:

>> f=fopen('test.txt','r');

>> answer=fread(f)


answer =


  116

  101

  115

  116

   32

  105

  116

輸出變量的內(nèi)容是文件數(shù)據(jù)的ASCII碼值,若要驗證讀入的數(shù)據(jù)是否正確,通過下面的命令可以驗證。

>> disp(char(ans1'))

test it

fread函數(shù)的第二個輸入?yún)?shù)可以控制返回矩陣的大小,例如:

>> f=fopen('test.txt','r');

>> answer=fread(f,2)


answer =


  116

  101

也可以把返回矩陣定義為指定的矩陣格式,例如

>> f=fopen('test.txt','r');

>> an=fread(f,[2 3])


answer =


  116   115    32

  101   116   105

使用fread函數(shù)的第三個輸入變量,可以控制fread將二進制數(shù)據(jù)轉(zhuǎn)成MATLAB 矩陣用的精度,包括一次讀取的位數(shù)(Number of Bits)和這些位數(shù)所代表的數(shù)據(jù)類型。

常用的精確度類型有下列幾種,如表2-6所示。

表2-6  常見的精確度類型

數(shù) 據(jù) 類 型

說    明

char

帶符號的字符(通常是8h16)  

uchar

無符號的字符(通常是8bits)

short

短整數(shù)(通常是16bits)

long

長整數(shù)(通常是16bits)

float

單精度浮點數(shù)(通常是32bits)

double

雙精度浮點數(shù)(通常是64bis)


2.4.2  二進制數(shù)據(jù)的寫入

使用fwrite函數(shù)可將矩陣按所指定的二進制格式寫入文件,并返回成功寫入文件的大小。函數(shù)的調(diào)用方式如下:

count=fwrite(fid,A,precision)

其中,count用來返回寫入文件數(shù)據(jù)的大小,f參數(shù)同樣是通過fopen函數(shù)獲得的整數(shù)型變量,表示文件標識符,A表示要寫入的數(shù)據(jù)矩陣,第三個參數(shù)precision同二進制讀取函數(shù)的參數(shù)一樣,表示數(shù)據(jù)的寫入格式。

在下例中fwrite產(chǎn)生一個大小為100字節(jié)的二進制文件,它包含了一個5×5階魔方矩陣,共25個元素,每個元素占用4個字節(jié)。

f=fopen('magic5.bin', 'w');

fwrite(f,magic(5), 'int32');

fclose(f)

二進制文件在不同的計算機架構(gòu)上可能存儲方式不同,所以二進制文件存在兼容性問題,而文本文件則不存在這種兼容性問題。不同的存儲方式導致在不同架構(gòu)上保存的二進制文件在另外的平臺上無法讀取,這主要是因為多字節(jié)數(shù)據(jù)類型在計算機硬件上的存儲順序不同。在MATLAB中,無論計算機上的數(shù)據(jù)存儲順序是哪一種,都可以讀寫二進制文件,但要正確地調(diào)用fopen函數(shù)打開文件。

2.4.3  格式化讀取ASCII碼數(shù)據(jù)

fscanf函數(shù)與C語言中的fscanf在結(jié)構(gòu)、含義和使用上都很相似,即能夠從一個有格式的文件中讀入數(shù)據(jù),并將它賦給一個或多個變量。兩個函數(shù)都采用同一組格式指定符來控制輸入數(shù)據(jù)的格式,fscanf的格式指定符由字符%開頭,常用格式如表2-7所示。

表2-7  常見的用于輸入的格式轉(zhuǎn)換符

格式轉(zhuǎn)換符

意    義

%c

讀取字符型變量,也可以指定多個字符,'%3c'

%s

讀取字符串變量

%d

讀取整數(shù)型變量

%f

讀取浮點數(shù)

%g

讀取雙精度浮點數(shù)


例如,我們?nèi)匀蛔x取my_test.dat文件中的數(shù)據(jù),其數(shù)據(jù)內(nèi)容是:

 4.5646767e-001  8.2140716e-001  6.1543235e-001

 1.8503643e-002  4.4470336e-001  7.9193704e-001

通過下面這段代碼,將該文件中的數(shù)據(jù)讀取到列向量T中。

>> f=fopen('my_test.dat','r');

>> T=fscanf(f,'%g');

>> fclose(f)

也可以通過以下代碼段把文件數(shù)據(jù)讀取到一個3×2矩陣A中。

>> f=fopen('my_test.dat','r');

>> A=fscanf(f,'%g',[3 2]);

>> fclose(f)

執(zhí)行后結(jié)果如下,這時候A矩陣恰好是文件中數(shù)據(jù)矩陣的轉(zhuǎn)置。

>> A


A =


   0.4565    0.0185

   0.8214    0.4447

   0.6154    0.7919

2.4.4  格式化寫入文本數(shù)據(jù)

fprintf將會把數(shù)據(jù)轉(zhuǎn)換為字符串,并將它們輸出到屏幕或文件中。一個格式控制字符串包含轉(zhuǎn)換指定符和可選的文本字符,通過它們來指定輸出格式。轉(zhuǎn)換指定符用于控制陣列元素的輸出。

當fprint函數(shù)做標準輸出,也就是運行結(jié)果顯示在屏幕上的時候,它的功能和disp函數(shù)相類似,區(qū)別僅在于fprint可以輸出特定格式的文本數(shù)據(jù)。

比如,創(chuàng)建一個2×2的魔方矩陣,然后打開一文件,寫入數(shù)據(jù)。

>> clear all;

>> x=magic(2);

>> fid=fopen('exam4.txt','w');

>> fprintf(fid,'%4.2f  %8.4f\n',x);

>> fclose(fid);

執(zhí)行這段程序段之后,我們可以檢驗一下執(zhí)行結(jié)果:

>> x


x =


    1     3

    4     2


>> type exam4.txt


1.00    4.0000

3.00    2.0000

可以看出,fprintf函數(shù)在打印顯示矩陣數(shù)據(jù)時,數(shù)據(jù)轉(zhuǎn)換規(guī)則是可以按列方式循環(huán)作用于矩陣的各個元素的,這個例子中顯示出來的結(jié)果就好像原矩陣的轉(zhuǎn)置,而且分別按數(shù)據(jù)轉(zhuǎn)換規(guī)則顯示。

2.4.5  控制文件位置指針

每一次打開文件時,MATLAB就會保持一個文件位置指針(File Position Indicator),由它決定下一次進行數(shù)據(jù)讀取或?qū)懭氲奈恢?。控制此指針的函?shù)如表2-8所示。

表2-8  控制位置指針的函數(shù)

函 數(shù) 名 稱

功 能 說 明

fseek

設(shè)定指針位置

ftell

獲得指針位置

frewind

重設(shè)指針到文件起始位置

feof

測試指針是否在文件結(jié)束位置


fseek 函數(shù)用于指定文件指針的位置,調(diào)用方式如下:

status=fseek(fid,offset,origin)

fid是指定的文件標識符。offset為整數(shù)型變量,表示相對于指定位置需要的偏移字節(jié)數(shù),正數(shù)表示向文件末尾偏移,負數(shù)表示向文件開頭偏移。Origin可以是特定字符串,也可以是整數(shù),表示文件中的參考位置。參考位置的參數(shù)說明如表2-9所示。

表2-9  參考位置參數(shù)的說明

參考位置(origin)

說    明

'bof '或者 -1

文件開頭

'cof '或者 0

文件中當前位置

'eof '或者 1

文件末尾


ftell 函數(shù)用來獲得當前文件指針的位置,調(diào)用方式如下:

position=ftell(fid)

fid是指定的文件標識符。Position為返回值,表示當前指針的位置。position是以相對于文件開頭的字節(jié)數(shù)來表示的。如果返回值為–1,表示未能成功調(diào)用。這是可以通過調(diào)用feeeor(fid)的具體的錯誤信息。

frewind 函數(shù)用來把文件指針重新復位到文件開頭。調(diào)用方式如下:

frewind(fid)

其中fid為指定的文件標識符,其作用和fseek(fid,0,-1)是等效的。

feof 函數(shù)用來判斷是否到達文件末尾。調(diào)用方式如下:

eofstat=feof(fid)

其中fid為指定的文件標識符。eofstat是返回值,當?shù)竭_文件末尾時,eofstat為1;否則為0。比如我們?nèi)匀粚ξ募y_test.dat執(zhí)行以下命令,然后測試文件指針位置

>> f=fopen('my_test.dat','r');

>> A=fscanf(f,'%g',[3 2])


A =


   0.4565    0.0185

   0.8214    0.4447

   0.6154    0.7919

>>feof(f)


ans=


    0

在本例中,文件指針指向最后一個數(shù)據(jù),而不是文件末尾,因此返回值是0,而不是1,但是若執(zhí)行以下命令:

>> f=fopen('my_test.dat','r');

>> A=fscanf(f,'%g',[4 2])


A =


   0.4565    0.4447

   0.8214    0.7919

   0.6154         0

   0.0185         0

>>feof(f)


ans=


    1

在my_data.dat文件中只包含6個數(shù)字,因此feof函數(shù)返回值為1。若要重新設(shè)置指針到起始位置,就可以直接使用frewind函數(shù)。

2.5  MAT 文 件

MAT文件是MATLAB使用的一種特有的二進制數(shù)據(jù)文件。MAT文件可以包含一個或者多個MATLAB 變量。MATLAB通常采用MAT文件把工作空間的變量存儲在磁盤里,在MAT文件中不僅保存各變量數(shù)據(jù)本身,而且同時保存變量名以及數(shù)據(jù)類型等。所以在MATLAB中載入某個MAT文件后,可以在當前MATLAB工作空間完全再現(xiàn)當初保存該MAT 文件時的那些變量。這是其他文件格式所不能的。同樣,用戶也可以使用MAT文件從MATLAB環(huán)境中導出數(shù)據(jù)。MAT文件提供了一種更簡便的機制在不同操作平臺之間移動MATLAB數(shù)據(jù)。

2.5.1  在MATLAB中讀寫MAT文件

在MATLAB環(huán)境中,通常使用load和save兩個命令進行 MAT 文件的讀和寫。在默認情況下,這兩個命令以 MAT 文件格式處理文件,但是也可以用-ascii參數(shù)選項來強制用文件方式處理文件。關(guān)于這點已經(jīng)在本章介紹過了,這里主要介紹如何讀寫MAT文件。

1. load 函數(shù)的使用

load函數(shù)可以從MAT文件中讀取數(shù)據(jù),例如要讀取mymat.dat文件,可以直接執(zhí)行命令load mymat.dat,因為給出要讀取的文件的后綴名是MAT,因此命令則以MAT文件格式讀取數(shù)據(jù),否則將以文本文件讀取數(shù)據(jù)。命令中的文件名可以包含單引號,也可以不包含,也就是說該函數(shù)也可以這樣調(diào)用:load 'mymat.mat' 。

load 函數(shù)還可以指定只讀取文件中的某幾個變量,只需在文件名之后列出想要讀取的變量的變量名就可以了,變量名也可以使用通配符。

比如命令load mymat.mat y*,執(zhí)行結(jié)果就是將文件中所有以y開頭的變量讀取出來。

load還有一種函數(shù)形式的調(diào)用方式。這種調(diào)用方式就要求文件名必須是字符串,比如要導入mymat.mat文件,那么函數(shù)形式的調(diào)用必須是s = load('mymat.mat')。

2. save函數(shù)的使用

save 函數(shù)的功能是把當前MATLAB工作空間的一個或多個變量存寫到外部文件。在默認情況下,save 函數(shù)以MAT格式存寫數(shù)據(jù)。若在命令中直接調(diào)用該函數(shù),不帶任何參數(shù),執(zhí)行結(jié)果是把MATLAB工作空間的所有變量保存到系統(tǒng)默認的matlab.mat文件中。當然,帶上文件名參數(shù),就可以將當前工作空間中的所有變量存寫在指定的 MAT文件中。

如果用戶需要保存指定的某幾個變量,只需在文件名參數(shù)后,列出要保存的文件名即可。比如,命令save mymat.mat x,y,z執(zhí)行后的結(jié)果就是將當前工作空間中的變量 x,y,z保存到mymat.mat文件中,要求x,y,z是當前工作空間中已經(jīng)存在的變量。

2.5.2  在普通的C/C++程序中讀寫MAT文件

1.使用MATLAB 提供的MAT 文件接口函數(shù)

在C/C++程序中有兩種方式可以讀取MAT文件數(shù)據(jù)。一種是利用MATLAB提供的有關(guān)MAT文件的編程接口函數(shù)。MATLAB的庫函數(shù)中包含了MAT文件接口函數(shù)庫,其中有各種對MAT文件進行讀寫的函數(shù),都是以mat開頭的函數(shù)。如表2-10所示。

表2-10  C語言中的MAT文件讀寫函數(shù)

MAT  函  數(shù)

功    能

matOpen

打開 MAT 文件

matClose

關(guān)閉 MAT 文件

matGetDir

從 MAT 文件中獲得 MATLAB 陣列的列表

matGetFp

獲得一個指向MAT 文件的ANSI C 文件指針

matGetVariable

從MAT文件中讀取MATLAB陣列

matPutVariable

寫MATLAB陣列到MAT文件

matGetNextVariable

從MAT文件中讀取下一個MATLAB陣列

matDeleteVariable

從MAT文件中刪去下一個MATLAB陣列

matPutVariableAsGlobal

從MATLAB陣列寫入到MAT文件中

matGetVariableInfo

從MAT文件中讀取MATLAB陣列頭信息

matGetNextVariableInfo

從MAT文件中讀取下一個MATLAB陣列頭信息




http://blog.sciencenet.cn/blog-907194-688272.html
上一篇:關(guān)于grads加權(quán)平均/求和的問題
下一篇:[轉(zhuǎn)載]MATLAB繪圖功能

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多